リレーショナルデータベースの基本概念
概要
- 日程: Day 1 / セッション 3
- 時間: 10:25-10:55
- 形式: 座学
- ゴール: テーブル、レコード、カラム、主キー、外部キーをそれぞれ身近な例で説明できる
- 学習形式: 対話型解説
導入(5分)
前のセッションで、皆さんのPCの中でPostgreSQLが動き始め、\dt で7つのテーブルが見えました。departments、employees、customers……名前は見えたものの、「で、テーブルって結局なに?」というのが正直な感想ではないでしょうか。
このセッションは、その「なに?」に答える時間です。テーブル、レコード、カラム、主キー、外部キー——リレーショナルデータベース(RDB)の世界の登場人物を、Excelとの対比と身近なたとえで一気に整理します。
ここで先に問いを置いておきます。「リレーショナル(関係的)」という名前のデータベースですが、いったい何と何の「関係」を表しているのでしょうか?セッションの終わりには答えが見えているはずです。
本編(20分)
1. テーブル・レコード・カラム——表の世界の三人組
リレーショナルデータベースのデータは、すべて「表」の形で持たれます。これは、いわば Excel のシートにそっくりです。違いはあとで触れます。
- テーブル:表そのもの。「社員」「商品」「注文」など、扱うモノの種類ごとに1つ
- レコード(行):表の中の1行。1人の社員、1つの商品、1件の注文といった「1件のデータ」
- カラム(列):表の中の1列。名前、給与、入社日のような「データの項目」
サンドボックスのemployeesテーブルで見ると、こんなイメージです。
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | 太郎 | 山田 | 450000 | 1 |
| 2 | 花子 | 鈴木 | 520000 | 2 |
| 3 | 一郎 | 田中 | 380000 | 1 |
ここで、横1行が1人の社員(レコード)、縦の列が項目(カラム)です。
ここがポイント
- 「テーブル=何のデータか」「カラム=どんな項目か」「レコード=具体的な1件」と覚える
- 1つのテーブルには1種類のモノしか入れない。社員テーブルに商品を混ぜたりはしない
コラム
「カラム(column)」は英語で「柱」という意味があります。ギリシャ神殿の縦の柱と、表の縦の列が同じ単語なのは少し意外ですよね。一方「ロー(row)」は「列」と訳すと混乱するので、本研修では「行」「レコード」で統一します。SQLの世界では、表記が複数あるとき先輩同士で「ロウ」「行」「レコード」が混ざって飛び交うことがあります。「全部同じ意味」と知っておくと議事録読みが楽になります。
2. ExcelとRDB、似ているけど違う
ここで少し考えてみてください。「これ、Excelでよくない?」と思いませんか?正直、形だけ見れば似ています。違いは、見えないところにあります。
Excelとの主な違いは3つです。
- 列ごとに「型」が決まっている:salary列は数値しか入らない、hire_date列は日付しか入らない。「給料の欄に『たぶん40万くらい』」とは書けない
- 複数人が同時に触れる:何百人が同時に読み書きしても壊れない設計
- 「他のテーブルとつなげる」設計が前提:これが次に出てくる「主キー」「外部キー」の話
つまりRDBは、「型」と「整合性」と「つなげる」を本気で守るために作られた表、と考えると分かりやすいです。
3. 主キー——表の中の「住民票番号」
ここからが「リレーショナル」の本番です。
たとえばemployeesテーブルに「山田太郎」さんが3人いたら、上司が「山田太郎の給与を上げて」と言ってきた時に困ります。「どの山田太郎ですか?」となるからです。
これを防ぐために、レコードごとに絶対に重複しない番号を1つだけ振っておくのが**主キー(Primary Key)**です。employeesテーブルでは employee_id がそれにあたります。
これは、いわば住民票番号のようなものです。同姓同名の人がいても、番号さえあれば一意に特定できます。
コード例・実例
サンドボックスの employees テーブルの定義を抜粋すると、こうなっています。
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
...
);
PRIMARY KEY と書かれた列が主キーです。SERIAL は「1, 2, 3, …と自動で番号を振ってくれる」指定です(詳しくは次のデータ型のセッションで)。
ここがポイント
- 主キーは1テーブルに必ず1つ
- 値は重複NG、NULL(空)もNG
- ユーザー名やメールアドレスを主キーにすることもできるが、「変わらない・短い」番号が一般的
4. 外部キーとリレーション——テーブル同士をつなぐ「線」
ここまで来ると、いよいよ「リレーション(関係)」が見えてきます。
employeesテーブルには department_id という列がありました。値は 1, 2, 3 などの数字です。この数字が何を指しているかというと、departmentsテーブルの department_id です。
departmentsテーブルを見ると、
| department_id | department_name | location |
|---|---|---|
| 1 | 営業部 | 東京 |
| 2 | 開発部 | 東京 |
| 3 | 人事部 | 大阪 |
つまり、employeesの「太郎・山田・department_id = 1」は、departmentsの「department_id = 1 = 営業部」を指しているわけです。これで「山田太郎は営業部所属」と分かります。
この「あるテーブルの列が、別のテーブルの主キーを指している」状態を作るのが**外部キー(Foreign Key)**です。CREATE TABLE文では REFERENCES departments(department_id) と書かれています。
「リレーショナル」とは、まさにこの「テーブル間を線で結ぶ」関係のことです。線を引くことで、社員と部署、顧客と注文、注文と商品が全部つながり、後で自由に組み合わせて取り出せるようになります。
ここがポイント
- 主キーは「自分の表の中での背番号」
- 外部キーは「他の表の背番号を指さす矢印」
- 同じ情報を2か所に書かない(部署名はdepartmentsに1回だけ。社員側には番号だけ)
コラム
「同じ情報は1か所に書く」という考え方には、正規化という立派な名前があります。1970年に IBM の研究者エドガー・F・コッドが論文で提案したのが始まりで、これが現代RDBの礎です。コッドはこの功績で1981年にチューリング賞(コンピュータ界のノーベル賞)を受賞しました。「同じことを2回書かない」だけで賞が取れるのか、と感心するかもしれませんが、当時はそれくらい革命的だったのです。
5. サンドボックスのテーブル全体像
今学んだ「テーブル間の線」で、サンドボックスの7テーブルがどうつながっているかを見てみましょう。
「部署 → 社員」「カテゴリ → 商品」「顧客 → 注文 → 注文明細 ← 商品」と、線でつながっています。次のセッションで、実際にこれらのテーブルを覗きに行きます。
💬 AIに聞いてみよう
- 「主キーと外部キーを、料理のレシピに例えて説明して」
- 「同じ社員番号を2人に振ろうとしたらどうなる?PostgreSQLは何を返す?」
- 「『正規化』って何のためにあるの?1回しか書かないと何が嬉しいの?」
まとめ(5分)
今回学んだことを一言でまとめると「テーブルという表があり、レコード(行)とカラム(列)でできていて、主キーがレコードを一意に特定し、外部キーがテーブル同士をつなぐ」です。「リレーショナル」の正体は、テーブル間に引かれた線そのものでした。
次のセッションでは、実際に psql に戻って、サンドボックスの7テーブルを1つずつ覗いていきます。今日学んだ「主キー」「外部キー」が、実データの中でどう現れているかを確かめましょう。
🔄 振り返りチェック
- テーブル、レコード、カラムをそれぞれ「Excelで言うと何?」と「社員データで言うと何?」の両方で説明できますか?
- 主キーと外部キーの違いを、自分の言葉で1文ずつ説明できますか?
- サンドボックスの中で、orders テーブルはどのテーブルとどう線がつながっていますか?
補足資料
- 発展課題: 自分が普段使っているサービス(例: SNS、ECサイト)の裏側に、どんなテーブルがありそうか3つ挙げ、それぞれの主キーと、テーブル間の外部キーを推測してみる
学習ガイド
想定される質問と回答例
| 質問 | ヒント |
|---|---|
| 主キーは必ず数字じゃないとダメ? | 文字列でも可。ただし「変わらない・短い・重複しない」が条件。メールアドレスは変わる可能性があるので主キー向きではない |
| 主キーを2つの列で作れる? | 可能(複合主キー)。たとえば order_items は order_id + product_id の組み合わせで一意にする設計もあり得る |
| 外部キーって絶対に張らないとダメ? | DB上はなくても動く。ただし「データの嘘」を防ぐためには張った方が安心。これは Day2 の制約のセッションで詳しく扱う |
| ExcelよりRDBが優れているなら、Excelは使わなくていい? | 1人で数百〜数千件なら Excel が速い。「同時に触る・件数が桁違い・壊れたら困る」になったら DB の出番 |
つまずきやすいポイント
| つまずきポイント | ヒント |
|---|---|
| 「主キー」と「キー」が混ざる | キーは広い言葉。主キーはその中で1つだけ選ばれた特別な存在、と覚える |
| 外部キーの向きが分からない | 「持っている側(社員)」が「参照される側(部署)」を指す。矢印は「社員 → 部署」 |
| 「リレーション」を「テーブル」と混同する | 学術用語ではテーブル=リレーションだが、実務では「テーブル間の関係=リレーション」と理解しておけばOK |
| 同じ情報を複数テーブルに書きたくなる | それを防ぐのが正規化と外部キー。「部署名を変えるとき、何か所書き換えるか」を想像する |