データベースって一体どういうモノなんでしょうか?
データを溜め込む箱のようなモノという説明を聞いた事があると思いますが、基本的には文字と数字を保存するエクセルのバケモノのようなものだと考えてください。
Webアプリを作る時に多くの場合何かしらのデータをサーバーに格納すると思います。
その時に、簡易なものであれば、JSONデータやCSVデータとして、サーバーにテキストファイルで保存しておいてもいいのですが、
膨大なデータになり得るものは、データベースに保存しておくことで、その後の運用とメンテナンスが非常に便利で楽になります。
データベースを触った事が無い人に向けて簡単な学習を進めてみたいと思います。
データベースの種類
データベースは、一番よく使われているのがリレーショナルデータベースと呼ばれる
RDBMSで、そこからの派生系で
NoSQLというモノもあります。
RDBMSは、SQLという言語を使うことから、SQLデータベースと呼ばれることもあり、データベースの基本を学ぶ上で必ず通っておいた方がいいでしょう。
RDBMSについて
RDBMSは、
Relational DataBase Management Systemの略で、要するにリレーショナルデータベースです。
リレーショナルデータベースって一体何かというと、エクセルのマトリクス表を、特定の値で別のエクセル表と連動させるような使い方をしますよね?
あれがリレーションという方式で、たくさんのテーブル(エクセル表)をIDや任意の値で繋ぎ込んで、便利にデータの構造体を作るのが、RDBMSです。
idはカブリ防止のため、インクリメントされる数値で使われる事が多いですが、Userテーブルに登録されているメールアドレスもユニーク値として担保されるのであれば、メールアドレスから、名前をリレーションさせることもできます。
このように、テーブル事のユニーク値をIDとして、それを指定するだけで、そのテーブルの情報を取得する事ができ、最終的に、使いたいテーブル表を作成する事ができます。
SQLの種類
SQLが利用できるデータベースには、次のようなソフトウェアがあります。
MySQL
PostgreSQL
SQL Server
Oracle
SQLite
それぞれ、特徴が違いますが、基本的なSQLは利用できます。
ただ、それぞれ独自の機能を持っているため、共通ではないSQLを記述するため、互換性はほぼ無いと考えた方がいいでしょう。(簡易なSQL文であれば、共通して使えます)
実践データベース : SQLiteを構築
ローカル環境でも簡易に扱えて、モバイルアプリなどでも頻繁に使われているSQLiteを使って、データベースを構築して、SQLに触れてみましょう。
事前準備
ローカル環境でSQLiteが扱えるように、インストールをする必要があります。
Macの場合
# Homebrewをインストール(すでにインストールされている場合は飛ばしてください)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# インストール
brew install sqlite
Windowsの場合
SQLite :
https://www.sqlite.org/
上記のページに行き、Downloadボタンをクリックして、「sqlite-tools-win-***.zip」というファイル名のzipファイルをダウンロード。
zipファイルを任意のフォルダに解答したら、ターミナルでそのフォルダに入ると、SQLiteがコマンドで使える状態になります。
インストールが完了したら、次のコマンドで、SQLiteを実行します。
sqlite3
※この時点でエラーが出た場合は、正常にインストールされていません。
次のコマンドで、インストールしたSQLiteのバージョンが確認できます。
sqlite> .version
> SQLite 3.43.2 2023-10-10 13:08:14 1b37c146ee9ebb7acd0160c0ab1fd11017a419fa8a3187386ed8cb32b709aapl
> zlib version 1.2.12
> clang-15.0.0 (64-bit)
ダウンロードしたファイル名のバージョンと同じバージョンが表示されていたら
データベースの作成
SQLiteのデータベースはファイル事に管理します。
事前にファイルを作っておいてもいいですが、次のコマンドで自動的にファイルが生成されます。
sqlite> .open sample.sql
上記を実行すると、sample.sqlというファイルが生成されます。
テーブルの作成
次にデータベースの中にテーブルを作成します。
roomテーブル
sqlite> CREATE TABLE room (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
create_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
update_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
userテーブル
sqlite> CREATE TABLE user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
mail TEXT,
create_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
update_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
stateテーブル
sqlite> CREATE TABLE state (
id INTEGER PRIMARY KEY,
room_id INTEGER,
user_id INTEGER,
create_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
update_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
登録したテーブルは、次のコマンドで確認できます。
sqlite> .table
room state user
それぞれのテーブルの情報(スキーマ)は、次のコマンドで確認できます。
# userテーブルのスキーマ確認コマンド
sqlite> .schema user
CREATE TABLE user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
mail TEXT,
create_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')),
update_at TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))
);
データの登録
roomテーブルに登録
INSERT INTO room (name) VALUES("A");
INSERT INTO room (name) VALUES("B");
INSERT INTO room (name) VALUES("C");
userデータの登録
INSERT INTO user (name,mail) VALUES("tanaka","tanaka@aaa.com");
INSERT INTO user (name,mail) VALUES("sato","sato@bbb.com");
INSERT INTO user (name,mail) VALUES("watanabe","watanabe@ccc.co.jp");
INSERT INTO user (name,mail) VALUES("suzuki","suzuki@ddd.ne.jp");
INSERT INTO user (name,mail) VALUES("kato","kato@eee.com");
stateデータの登録
INSERT INTO state (room_id,user_id) VALUES(1,1);
INSERT INTO state (room_id,user_id) VALUES(1,2);
INSERT INTO state (room_id,user_id) VALUES(2,3);
INSERT INTO state (room_id,user_id) VALUES(3,4);
INSERT INTO state (room_id,user_id) VALUES(3,5);
SQLプログラムのデータ検索
登録したテーブルのデータを確認するには、次のSELECT文を実行します。
# roomテーブル
sqlite> SELECT * FROM room;
1|A|2024-08-12 08:16:25|2024-08-12 08:16:25
2|B|2024-08-12 08:16:32|2024-08-12 08:16:32
3|C|2024-08-12 08:16:33|2024-08-12 08:16:33
# userテーブル
sqlite> SELECT * FROM user;
1|tanaka|tanaka@aaa.com|2024-08-12 08:19:15|2024-08-12 08:19:15
2|sato|sato@bbb.com|2024-08-12 08:19:16|2024-08-12 08:19:16
3|watanabe|watanabe@ccc.co.jp|2024-08-12 08:19:16|2024-08-12 08:19:16
4|suzuki|suzuki@ddd.ne.jp|2024-08-12 08:19:16|2024-08-12 08:19:16
5|kato|kato@eee.com|2024-08-12 08:19:16|2024-08-12 08:19:16
# stateテーブル
sqlite> SELECT * FROM state;
1|1|1|2024-08-12 08:22:39|2024-08-12 08:22:39
2|1|2|2024-08-12 08:22:39|2024-08-12 08:22:39
3|2|3|2024-08-12 08:22:39|2024-08-12 08:22:39
4|3|4|2024-08-12 08:22:39|2024-08-12 08:22:39
5|3|5|2024-08-12 08:22:39|2024-08-12 08:22:39
正常にテーブルにデータが登録されていたら、データをリレーション(連結)して、任意の結果を取得してみましょう。
SELECT
user.name AS user_name,
user.mail AS user_mail,
room.name AS room_name
FROM state
LEFT JOIN user ON user.id = state.user_id
LEFT JOIN room ON room.id = state.room_id;
実行結果
tanaka|tanaka@aaa.com|A
sato|sato@bbb.com|A
watanabe|watanabe@ccc.co.jp|B
suzuki|suzuki@ddd.ne.jp|C
kato|kato@eee.com|C
データベース思考
大きく分けてデータの種類は、マスターデータとログデータの2種類で考えます。
上記のroomテーブルとuserテーブルは、
マスターテーブルで、stateテーブルは
ログテーブルです。
マスターテーブルは、それぞれの情報をしっかりと保持するためのテーブルで、取りこぼしの内容に設計を行います。
ログテーブルは、システムの利用ログで、基本的にはそれぞれのマスターテーブルのIDを記載することで、データ容量の削減と、処理負荷を軽減します。
ログデータには、利用日時を同時に記録すると、いつ誰がそのシステムを利用したかが解析できるようになるし、誰が何回利用したかという、実行履歴も追う事ができるようになります。
マスターデータは、登録者人数で大体の容量(登録文字列バイト数)が計算できますが、ログデータは、アクセス頻度と利用者の掛け合わせで爆発的に膨らむ可能性もあるので、無駄なデータを取得しないという取捨選択も必要になります。
あとがき
データベースは、データとサービスの運用をイメージして、その後に取得したデータをどのようにコントロールするかを設計しなければいけないため、最初はあまり有意義に感じないかもしれませんが、
便利にデータを利用できるようになると質の高いWebアプリが構築できるようになります。
データベースは、使っているうちに、データ容量が増えてきて、検索結果の実行時間が遅くなってくるので、そうした時の対応として、INDEX処理や、テーブルをより細かく分割してリレーションさせる設計に切り替える場合もあります。
Linuxを使っていると、/var/log/というフォルダに、さまざまなOSで使っているアプリケーションのログが、テキストデータとして格納されています。
これらを見て、ログデータの取得について学習してみるのもいいかと思います。
色々なデータを組み合わせていく事で、新たなサービスが生まれることもあるし、それらを解析する専門家として、データサイエンティストという職業もニーズが高まっています。
データベースを使い慣れておくことで、Webアプリの制作にも大いに役立つ事を理解してもらったら、どんどんデータベースを構築して、さまざまなデータアプローチを行ってみてください。
0 件のコメント:
コメントを投稿