データベースとは何か
表計算のシートと同じ見た目の表から出発し、文字列で頼むと表が返る相手としてデータベースを掴む。
- データベースは、表計算と何が同じで、何が違うのか
- 何を送ると、何が返ってくるのか
- 「データが入っている」とは、どこに何があることか
実物: 見慣れた表
説明の前に、下の枠の「実行する」を押してほしい。枠の中の 1 行が送られて、何かが返る。
10 行 5 列の表が返ったはずだ。1 行が 1 人の顧客で、列は id、name、email、tier、created_at の 5 つ。 表計算のシートを開いたときと同じ見た目で、行が顧客、列が項目、空欄もある。違いは 1 つだけだ。あなたはこの表のファイルを開いていない。 短い文字列を送ったら、表が届いた。
つまり、誰かがこの表を預かっていて、頼まれたときに作って渡している。この「表を預かり、頼まれた表を作って返す相手」をデータベース(database)と呼ぶ。 預けている表の 1 枚 1 枚がテーブル(table)で、今見たのは customers というテーブルだ。
表計算では、表はあなたの手元のファイルで、自分で開いて直す。だから直す人の数だけコピーが増える。 データベースでは、表は相手の手元に 1 枚だけあり、あなたは頼んで表を受け取る。この違いを 1 枚の図にする。
使い方: 頼み方は文字列
頼み方を変えると、届く表が変わる。3 つ試す。押す前に「期待」を読み、押した後に返った表の形(何行、何列)を数えてほしい。
1 つ目は 10 行 2 列、2 つ目は 2 行 5 列、3 つ目は 1 行 1 列で値は 10 のはずだ。 列を選ぶと横が減り、行を絞ると縦が減り、数えると 1 マスになった。送った文字列の違いは、SELECT の後ろと、FROM customers の後ろだけだ。
この頼み方の書き方の決まりを SQL と呼ぶ。SELECT は「取り出せ」、FROM は「〜から」。SELECT と FROM の間に列の名前を並べれば列を選べ、* は「全部の列」。WHERE は「〜の行だけ」、COUNT(*) は「行を数えろ」。日本語で言えることを短い英語で書いている、と見ればよい。WHERE と COUNT の詳しい使い方は第 2 章と第 3 章でやる。
3 つの結果を見比べて、気づいてほしいことが 1 つある。列を減らしても、行を絞っても、数えても、返ってくるのは表だ。数を 1 つ聞いただけでも、1 行 1 列の表で届く。何を頼んでも、答えは必ず表の形で返る。文字列を送ると表が返る。この往復の形は、この本の最後まで変わらない。
何枚の表を預けているか
ここまで顧客の表しか見ていない。この店は他に何枚の表を預けているのか。一覧を頼む。
categories、customers、order_items、orders、product_categories、products、stocks の 7 行が縦に並んだはずだ(第 1 章で表を 1 枚作った後に戻ってくると 8 行になる)。これも 1 列の表だ。 この店が預けている表は顧客だけではない。商品、注文、注文の明細、在庫、商品のカテゴリ。それぞれが 1 枚のテーブルで、ここに名前が出ている。
列の見出しに Tables_in_lab_basics とある。lab_basics は、この 7 枚をまとめて入れてある入れ物の名前だ。 表計算で言えば、1 つのファイルに 7 枚のシートがある状態に近い。 この入れ物のこともデータベースと呼ぶ。つまり「データベース」は 2 つの意味で使われる。頼むと表を返してくれる相手と、その相手が持っている表の束(lab_basics)。文脈で見分ける。
先輩の言った MySQL は、この束の番をして、頼みに答えているプログラムの名前だ。 この教材では、第一部は lab_basics、第二部は lab という束を使う。
仕組み: 相手はどこにいるのか
ここまで「相手」と呼んできたものの居場所を、浅く覗く。次の 2 つは、押して返ったものを眺めるだけでよい。中身を読み解く必要はない。
1 つ目は 8.0.46 のような番号が返ったはずだ。表を指定していないのに答えが返る。相手は預かった表を渡すだけでなく、答えを作る側でもある。 この番号は、相手のプログラム、MySQL の版の番号だ。
2 つ目は数行の表で、Info の列に SHOW PROCESSLIST と書いてある行が 1 つある。それが、今まさに頼んだあなただ。 他の行は、同じ相手に今つながっている別の誰か(この教材の別の画面や、相手自身の作業)で、Time の列を見ると、あなたが押すずっと前からいる行もある。 相手はあなたが押す前から動いていて、押していない間も動き続けている。他の列の意味は今は読まなくていい。 「相手は 1 つで、頼む側は同時に何人もいる」ことだけ見えればいい。行数は環境で変わる。
この、常に動いていて頼まれるのを待っているプログラムをサーバー(server)と呼ぶ。頼む側、つまりこの画面がクライアント(client)、 画面とサーバーの間に通っている 1 本の線が接続(connection)で、さっきの表の 1 行が接続 1 本だ。
「MySQL に入っている」の中身もここで言える。7 枚の表は、サーバーが動いている機械のディスクに、ファイルとして置いてある。ここだけはこの画面から見えないので、言葉で補う。 そのファイルを開いて読み書きするのはサーバーだけだ。あなたも、Web の画面も、社内ツールも、ファイルには触らない。サーバーに文字列で頼み、表を受け取る。 ファイルの大きさは第 8 章で、接続の中で何が起きているかは第 9 章で見る。
罠: なぜ表計算のファイルではだめなのか
表を読む、絞る、数える。ここまでの 7 回でやったことは、表計算でもできる。顧客が 10 人なら、そのほうが楽なくらいだ。 着任初日に聞いた「壊れた」話に戻ると、それは 4 つの場面に分けられる。データベースは、この 4 つを引き受けるためにある。 この本は、道具が揃った順に、それぞれを実物で確かめていく。
- 2 人が同時に同じ行を直す。片方の直しが、もう片方に上書きされて消える。→ 第 7 章「途中を見せない」
- 直している途中で落ちる。注文は書けたが在庫は減っていない、という中途半端が残る。→ 同じく第 7 章
- 行が 100 万を超えて、「この顧客の注文だけ」を探すのに毎回全部読む。→ 第 8 章「索引という実物」、そして第二部
- 注文の表と在庫の表がずれる。同じ商品が 2 通りの名前で書かれ、消した商品を指す注文が残る。→ 第 4 章「テーブルをつなぐ」、第 5 章「データを変える」
今は「こういう場面がある」とだけ覚えておけばいい。それぞれの章で、表計算では起きるがデータベースでは起きない、を実際に起こして確かめる。
この画面の約束
3 つだけ。1 回の実行で送れる文は 1 つ(文末の ; は要らない)。返る行は先頭 500 行まで表示する。 Mac は ⌘+Enter、Windows は Ctrl+Enter で実行できる。
データベースとは、表を預かり、文字列で頼まれた表を作って返し続ける相手である。
確認
FROM を書かない SELECT が成り立つのはなぜか。
行を数えるだけの頼みごとでも、答えが表の形で返るのはなぜか。
同じ表を別の人が見ても食い違わないのはなぜか。
次の章へ
最初に届いた customers の表には、行と列のほかに、左端の番号と、NULL と書かれた空欄が 2 つあった。 次の章では、その表の中を指さしながら、行・列・主キー・型・NULL に名前を付ける。名前が付くと、自分でテーブルを作れるようになる。