データベースとは何か
3 人で同じ在庫表を開くと、誰かの入力が消える
商品の在庫を Excel のファイルで管理しているとします。倉庫の担当が入荷分を足し、店舗の担当が出荷分を引き、経理が原価を直す。3 人が同じファイルを開いて、それぞれ保存しました。手元に残るのは最後に保存した 1 人分だけで、ほかの 2 人が打ち込んだ数字はどこにも残っていません。
これはファイルの使い方が下手なのではなく、ファイルが同時に触られることを想定していないだけです。ほかにも、行が 10 万件を超えると検索に数秒かかる、価格の列に「1,200 円」と文字で書かれても誰も止めない、コピーが増えてどれが本物か分からなくなる、といった詰まり方をします。
データベースは、この種の困りごとを引き受けるために作られた保管場所です。 同時に書き込まれても壊さない、目的の行だけを素早く見つける、列に入れてよい値の形をあらかじめ決めておく、途中で落ちても直前の状態に戻す。この 4 つが、ただのファイルとの決定的な差になります。
覚えておく係を、アプリの外に置く
ここで用語を 2 つに分けておきます。データベースはディスクに整理して置かれたデータそのもの、DBMS (データベース管理システム) はそれを安全に読み書きさせるソフトウェアです。MySQL や PostgreSQL といった製品名は、どれも DBMS のほうを指しています。
アプリ側はファイルの置き場所もディスクの構造も知りません。「この条件の行がほしい」と DBMS に頼み、返ってきた結果を画面に出すだけです。同時に触られたときの順番待ちも、素早く探すための索引も、落ちたあとの復旧も、DBMS の担当になります。
どう探すかではなく、何がほしいかを書く
DBMS に話しかけるための言葉が SQL です。特徴は、手順ではなく結果を書くところにあります。
SQL クエリ
SELECT name, email
FROM users
WHERE id = 1;「users を先頭から 1 行ずつ読んで、id が 1 の行を見つけたら name と email を取り出して」とは書きません。ほしいものだけを書けば、どこから読んでどう探すかは DBMS が決めます。だから同じ SQL のまま、データが 100 件でも 1 億件でも動きます。
同じデータベースは、たいてい 1 つのアプリからだけ使われるわけではありません。利用者向けの画面、社内の管理画面、夜間に走る集計バッチ。書かれた言語がばらばらでも、話しかける言葉は全部 SQL です。データの決まりごとをデータベース側にまとめて置いておけるのは、この共通の入口があるからです。
演習では companies テーブルの中身を、そのまま覗いてみましょう。並び順を指定しておくと、何度実行しても同じ順番で返ってくることも確かめてください。
テーブル構造
CREATE TABLE companies (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
industry VARCHAR(30) NOT NULL,
founded_year INT NOT NULL
);
INSERT INTO companies (id, name, industry, founded_year) VALUES
(1, 'のい技研', 'IT', 2018),
(2, '青空ベーカリー', '食品', 2005),
(3, '緑風物流', '物流', 1998),
(4, '海風観光', '観光', 2012),
(5, 'みらい学習', '教育', 2021);期待される出力
| id | name | industry | founded_year |
|---|---|---|---|
| 1 | のい技研 | IT | 2018 |
| 2 | 青空ベーカリー | 食品 | 2005 |
| 3 | 緑風物流 | 物流 | 1998 |
| 4 | 海風観光 | 観光 | 2012 |
| 5 | みらい学習 | 教育 | 2021 |