Insights·2026-09-15

リレーショナルデータベースとは何か — 表に分け、キーでつなぐ

リレーショナルデータベースは、複数のシートをキーでつないだ表計算と同じ形をしている。表一つがテーブルで、最上行が列名、その下の一行一行がデータだ。表どうしをつなぐ値を外部キー、各行を一意に指す値を主キーという。表の形をあらかじめ釘付けにしたものがスキーマで、データベースに何かをさせる文をクエリという。PostgreSQL が代表的な製品である。

표를 나누고 외래 키로 잇는다 — 글의 요약 도식

表計算一枚では足りない理由

漫画喫茶を営んでいるとしよう。会員名簿が要り、所蔵する漫画の一覧が要り、誰がいつ何を借りて返したかの記録が要る。

これを表計算一枚に全部入れられるだろうか。無理をすれば入るが、すぐ使えなくなる。左の区画は会員、真ん中は本、下の何行目からは貸出記録、といった具合では管理できない。

だからシートを分ける。会員は会員シート、本は本シート、貸出記録はまた別のシートに置く。そしてお互いをつなぐ。この会員がこの本を借りたという事実は、二つのシートをつなぐ形で書かれる。

リレーショナルデータベースがまさにこの形だ。名前にあるリレーショナルという語が、このつながりを指している。

テーブル・行・列、そしてキー

表一つをテーブルという。表計算のシート一枚にあたる。

最上行には列名が入る。ID、名前、連絡先といったものだ。その下には一行ずつデータが積まれる。会員一人が一行、本一冊が一行である。

次につなぎ方だ。会員表のある会員の ID が 1 だとする。貸出記録表に会員 ID を書く列を置いてそこに 1 と書けば、その貸出がこの会員のものだという事実が表現される。こうして別の表を指す値を外部キーという。

そして各行を一意に指す値が要る。会員表の ID のように重複しない値だ。これを主キーという。外部キーは結局、別の表の主キーを指している。

三つの表をキーでつなぐ
members            books              loans
─────────────      ─────────────      ──────────────────────
id  name           id  title          id  member_id  book_id
1   ミンス          7   スラムダンク1   1   1          7
2   ソヨン          8   スラムダンク2   2   1          8
                                        3   2          7

loans.member_id は members.id を指す外部キー
loans.book_id   は books.id   を指す外部キー

スキーマは硬い代わりに安定している

スキーマは硬い代わりに安定しているという対比 — 後から列を変えるには蓄積データを直す必要があるが、決めた形に合わない値はそもそも入らない。

表の形をスキーマという。どの列があるか、各列にどんな形の値が入りうるかをあらかじめ決めておくものだ。

決めることはかなり細かい。この列は数字だけ、あの列は文字を何字まで、この値は空であってはならず、あの値は互いに重複してはならない、という具合である。

硬い。あとから列を足したり形を変えたりするには、すでに溜まったデータに手を入れなければならない。代わりに安定している。決めた形に合わない値は最初から入れない。

だから、ある表をいくつに分けどうつなぐかを決めること自体が専門領域だ。サービスが大きくなればこの設計だけを担う人を置く。同じデータでも分け方によって、後で抱えきれるかどうかが分かれる。

クエリ、そしてリレーショナルでないもの

データベースに命じる文であるクエリの四つの仕事 — 値を取り出し、入れ、直し、消す。

データベースに何かをさせる文をクエリという。値を取り出す、入れる、直す、消すという仕事をこの文で命じる。

SQL が名前に付く製品はすべてこの文を使う。PostgreSQL もその一つで、バイブコーディングの案件でよく出会う。文の見た目はおおむね似ているので、一つ覚えれば他の製品でも通じる。

近ごろはクエリをコードの中に直接書くことは減った。間で代わりに組み立ててくれる道具がよく整っており、前回見たバックエンドのコードにデータの形だけ定義しておけばクエリはそちらが書く。

リレーショナルでない種類もある。各項目を丸ごと一つの文書として保存する文書型は、形がよく変わるデータに使う。何と何がつながっているかだけを保存するグラフ型もある。ただしウェブサービスの既定は依然リレーショナルだ。次回はこの表に入れないもの、画像や動画をどこに置くかを見る。

クエリの見た目
SELECT title FROM books WHERE id = 7;

INSERT INTO loans (member_id, book_id) VALUES (1, 7);

UPDATE members SET name = 'ミンス' WHERE id = 1;

DELETE FROM loans WHERE id = 3;