📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

リレーショナルデータベースの基本概念

概要

  • 日程: Day 1 / セッション 3
  • 時間: 10:25-10:55
  • 形式: 座学
  • ゴール: テーブル、レコード、カラム、主キー、外部キーをそれぞれ身近な例で説明できる
  • 学習形式: 対話型解説

導入(5分)

前のセッションで、皆さんのPCの中でPostgreSQLが動き始め、\dt で7つのテーブルが見えました。departments、employees、customers……名前は見えたものの、「で、テーブルって結局なに?」というのが正直な感想ではないでしょうか。

このセッションは、その「なに?」に答える時間です。テーブル、レコード、カラム、主キー、外部キー——リレーショナルデータベース(RDB)の世界の登場人物を、Excelとの対比と身近なたとえで一気に整理します。

ここで先に問いを置いておきます。「リレーショナル(関係的)」という名前のデータベースですが、いったい何と何の「関係」を表しているのでしょうか?セッションの終わりには答えが見えているはずです。

本編(20分)

1. テーブル・レコード・カラム——表の世界の三人組

リレーショナルデータベースのデータは、すべて「表」の形で持たれます。これは、いわば Excel のシートにそっくりです。違いはあとで触れます。

flowchart TB Table["テーブル: employees"] --> Row["レコード(行): 1人の社員"] Table --> Col["カラム(列): 名前・給与・入社日など"] Row --> Cell["セル(値): 山田太郎・450000・2020-04-01"] Col --> Cell
  • テーブル:表そのもの。「社員」「商品」「注文」など、扱うモノの種類ごとに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つです。

  1. 列ごとに「型」が決まっている:salary列は数値しか入らない、hire_date列は日付しか入らない。「給料の欄に『たぶん40万くらい』」とは書けない
  2. 複数人が同時に触れる:何百人が同時に読み書きしても壊れない設計
  3. 「他のテーブルとつなげる」設計が前提:これが次に出てくる「主キー」「外部キー」の話

つまり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 = 営業部」を指しているわけです。これで「山田太郎は営業部所属」と分かります。

flowchart LR Emp["employees: 山田 太郎 (department_id=1)"] --|参照|--> Dep["departments: 1 = 営業部"]

この「あるテーブルの列が、別のテーブルの主キーを指している」状態を作るのが**外部キー(Foreign Key)**です。CREATE TABLE文では REFERENCES departments(department_id) と書かれています。

「リレーショナル」とは、まさにこの「テーブル間を線で結ぶ」関係のことです。線を引くことで、社員と部署、顧客と注文、注文と商品が全部つながり、後で自由に組み合わせて取り出せるようになります。

ここがポイント

  • 主キーは「自分の表の中での背番号」
  • 外部キーは「他の表の背番号を指さす矢印」
  • 同じ情報を2か所に書かない(部署名はdepartmentsに1回だけ。社員側には番号だけ)

コラム

「同じ情報は1か所に書く」という考え方には、正規化という立派な名前があります。1970年に IBM の研究者エドガー・F・コッドが論文で提案したのが始まりで、これが現代RDBの礎です。コッドはこの功績で1981年にチューリング賞(コンピュータ界のノーベル賞)を受賞しました。「同じことを2回書かない」だけで賞が取れるのか、と感心するかもしれませんが、当時はそれくらい革命的だったのです。

5. サンドボックスのテーブル全体像

今学んだ「テーブル間の線」で、サンドボックスの7テーブルがどうつながっているかを見てみましょう。

flowchart LR Dep["departments"] --> Emp["employees"] Cat["categories"] --> Prod["products"] Cust["customers"] --> Ord["orders"] Ord --> OI["order_items"] Prod --> OI

「部署 → 社員」「カテゴリ → 商品」「顧客 → 注文 → 注文明細 ← 商品」と、線でつながっています。次のセッションで、実際にこれらのテーブルを覗きに行きます。

💬 AIに聞いてみよう

  • 「主キーと外部キーを、料理のレシピに例えて説明して」
  • 「同じ社員番号を2人に振ろうとしたらどうなる?PostgreSQLは何を返す?」
  • 「『正規化』って何のためにあるの?1回しか書かないと何が嬉しいの?」

まとめ(5分)

今回学んだことを一言でまとめると「テーブルという表があり、レコード(行)とカラム(列)でできていて、主キーがレコードを一意に特定し、外部キーがテーブル同士をつなぐ」です。「リレーショナル」の正体は、テーブル間に引かれた線そのものでした。

次のセッションでは、実際に psql に戻って、サンドボックスの7テーブルを1つずつ覗いていきます。今日学んだ「主キー」「外部キー」が、実データの中でどう現れているかを確かめましょう。

🔄 振り返りチェック

  • テーブル、レコード、カラムをそれぞれ「Excelで言うと何?」と「社員データで言うと何?」の両方で説明できますか?
  • 主キーと外部キーの違いを、自分の言葉で1文ずつ説明できますか?
  • サンドボックスの中で、orders テーブルはどのテーブルとどう線がつながっていますか?

補足資料

学習ガイド

想定される質問と回答例

質問 ヒント
主キーは必ず数字じゃないとダメ? 文字列でも可。ただし「変わらない・短い・重複しない」が条件。メールアドレスは変わる可能性があるので主キー向きではない
主キーを2つの列で作れる? 可能(複合主キー)。たとえば order_items は order_id + product_id の組み合わせで一意にする設計もあり得る
外部キーって絶対に張らないとダメ? DB上はなくても動く。ただし「データの嘘」を防ぐためには張った方が安心。これは Day2 の制約のセッションで詳しく扱う
ExcelよりRDBが優れているなら、Excelは使わなくていい? 1人で数百〜数千件なら Excel が速い。「同時に触る・件数が桁違い・壊れたら困る」になったら DB の出番

つまずきやすいポイント

つまずきポイント ヒント
「主キー」と「キー」が混ざる キーは広い言葉。主キーはその中で1つだけ選ばれた特別な存在、と覚える
外部キーの向きが分からない 「持っている側(社員)」が「参照される側(部署)」を指す。矢印は「社員 → 部署」
「リレーション」を「テーブル」と混同する 学術用語ではテーブル=リレーションだが、実務では「テーブル間の関係=リレーション」と理解しておけばOK
同じ情報を複数テーブルに書きたくなる それを防ぐのが正規化と外部キー。「部署名を変えるとき、何か所書き換えるか」を想像する
読み上げを開始します...

AIに質問する