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

ER図の作成

概要

  • 日程: Day 7 / セッション 3
  • 時間: [11:10-12:40]
  • 形式: 実習
  • ゴール: テーブル間のリレーション(1対多・多対多等)を明示したER図を時間内に作成できる
  • 学習形式: ハンズオン実習(AIサポートあり)

導入(5分)

テーブル定義書ができました。
しかし、定義書は1テーブルずつバラバラの紙です。

ここで考えてみてください。
「予約テーブルの member_id 列は会員テーブルを指している」——この関係、定義書のどこを見ればわかるでしょうか?
制約の欄を1枚ずつ読めばわかりますが、全体像は頭に入ってきません。

そこでER図(Entity Relationship Diagram)です。
テーブル(エンティティ)同士の関係(リレーション)を1枚の地図にします。
地下鉄の路線図のようなものです。駅(テーブル)の時刻表(定義書)を全部読むより、路線図を1枚見る方が乗り換え(結合)はすぐわかります。

本編(10分)

1. リレーションの3パターンと多対多の解決

テーブル間の関係は3パターンに整理できます。

  • 1対1: 会員と会員詳細プロフィール。片方の1行に、もう片方の1行だけが対応
  • 1対多: 会員と予約。1人の会員は多くの予約を持つが、1つの予約の持ち主は1人
  • 多対多: 学生と授業。1人の学生は複数の授業を取り、1つの授業には複数の学生がいる

このうち多対多は、リレーショナルデータベースでは直接表現できません。
中間テーブル(連関エンティティ)を間に置いて、1対多を2つに分解します。
「学生」と「授業」の間に「履修」テーブルを置く、という具合です。

MermaidのerDiagram記法で書くと、こうなります。

erDiagram STUDENT ||--o{ ENROLLMENT : "履修する" CLASS ||--o{ ENROLLMENT : "履修される" STUDENT { int student_id PK string name } CLASS { int class_id PK string title } ENROLLMENT { int student_id FK int class_id FK date enrolled_at }

記号の読み方:

  • || は「ちょうど1」、o{ は「0以上の多」
  • ||--o{ で「1対多(0件もあり)」
  • 線の鳥の足のような側が「多」。だからこの記法は「鳥の足記法(Crow's Foot)」と呼ばれます

前セッションの注文票の例なら、こうなります。

erDiagram CUSTOMER ||--o{ ORDER_HEADER : "注文する" ORDER_HEADER ||--|{ ORDER_DETAIL : "明細を持つ" PRODUCT ||--o{ ORDER_DETAIL : "注文される" CUSTOMER { string customer_id PK string name string address } ORDER_HEADER { int order_id PK date order_date string customer_id FK } ORDER_DETAIL { int order_id FK string product_code FK int quantity } PRODUCT { string product_code PK string product_name int unit_price }

注文明細が、注文と商品の多対多を解決する中間テーブルになっていることに注目してください。
正規化で自然に生まれたテーブルが、ER図では関係の要になります。

ここがポイント

  • リレーションを見つける手がかりは外部キー。「FKのある所に線あり」
  • 多対多を見つけたら中間テーブルで1対多×2に分解する。これが今日一番の山場
  • 「多」側の見積もりを口に出して確認する。「1人の会員は予約をいくつ持てる?」「1つの予約に会員は何人?」の2方向から問う
  • ER図とテーブル定義書は必ず一致させる。図にあるのに定義書にないテーブル(またはその逆)は設計漏れ

コラム

ER図は1976年、台湾出身の計算機科学者ピーター・チェンが提案しました。
チェンの論文は、データベース分野で最も引用された論文の1つです。
彼は「漢字が物事を絵で表すように、データも図で表せるはずだ」と考えたと語っています。
ちなみに「鳥の足記法」の足マークは、本当にニワトリの足跡が由来。
世界中の設計書がニワトリの足跡だらけだと思うと、少し和みませんか。

💬 AIに聞いてみよう

実習前に疑問を解消しておきましょう。たとえば:

  • 「1対1の関係って本当に必要?テーブルを1つにまとめてはだめ?」
  • 「自チームの○○と△△は多対多だと思うけど、中間テーブルの名前はどうつけるのが普通?」
  • 「MermaidのerDiagramで『0か1』はどう書くの?」

実習・演習(50分)

課題

テーブル定義書をもとに、自チームの全テーブルを含むER図を作成してください。

  1. テーブル定義書から全テーブルを書き出し、外部キーを手がかりに関係線を引く
  2. 各関係について「1対1 / 1対多 / 多対多」を判定する。判定時は両方向から問う(AはBをいくつ持つ?BはAをいくつ持つ?)
  3. 多対多が見つかったら中間テーブルを設計し、テーブル定義書にも追加する
  4. MermaidのerDiagram(または使い慣れた作図ツール)でER図を清書する
  5. ER図とテーブル定義書の整合性を相互チェックする
    • 図にあるテーブルはすべて定義書にあるか
    • 定義書の外部キーはすべて図の線になっているか
  6. 完成したER図をAIに見せて「不自然な関係や欠けている関係はないか」をレビューしてもらう

成果物

  • ER図(全テーブル・全リレーション・多重度を明示)
  • 更新済みテーブル定義書(中間テーブルを追加した場合)

ヒント

  • どこから線を引くか迷ったら: 外部キー(FK)列を全テーブルから書き出すと、線の一覧がそのまま得られます
  • 多重度に迷ったら: 具体的なデータを2〜3行書いて「この行はあちらの何行と結びつく?」と数えてみましょう
  • 中間テーブルの名前: 「会員_イベント」のような連結名より、「参加」「申込」のような関係そのものの名前が読みやすいです
  • MermaidのerDiagramでエラーが出たら: エラーメッセージとコードをそのままAIに貼り付けると直し方を教えてもらえます
  • 関係線が交差して読みにくいときは: テーブルの配置を変える、中心になるテーブル(一番線が多いもの)を真ん中に置く
  • 時間配分: 関係の洗い出し15分、多対多の解決10分、清書15分、整合性チェックとAIレビュー10分が目安

まとめ(5分)

今回学んだことを一言でまとめると「ER図はテーブル同士の関係を1枚で見渡す地図であり、多対多は中間テーブルで解決する」です。

  • リレーションは1対1・1対多・多対多の3パターン
  • 多対多は中間テーブルで1対多×2に分解
  • ER図とテーブル定義書の整合性チェックで設計漏れを潰す

これでDay 7の成果物(テーブル定義書・ER図)が揃いました。
次回(Day 8)は、このテーブルたちを「どの機能が読み書きするのか」をCRUD図で見える化し、機能設計に進みます。

🔄 振り返りチェック

以下の問いに答えられるか確認してみましょう:

  • 1対多と多対多の例を、自チームのテーブルでそれぞれ挙げられますか?
  • 多対多をそのまま実装できない理由と、解決方法を説明できますか?
  • 自チームのER図で一番線が集まっているテーブルはどれですか?それはなぜですか?

答えに自信がない場合は、該当部分を読み返すか、AIに質問してみてください。

補足資料

  • 参考リンク: Mermaid公式ドキュメントの「Entity Relationship Diagrams」のページ
  • 発展課題: 自チームのER図を見ながら「会員Aの予約一覧を表示するにはどのテーブルをどの順にたどる?」をAIと一緒に考えてみましょう。SQLのJOINの予習になります

学習ガイド

このセクションは、受講者が理解を深めることをサポートする参考情報です。

想定される質問と回答例

質問 ヒント
テーブルが2つしかなくてER図が寂しい。だめ? テーマの規模によっては正常。無理に増やさない。ただし「履歴」「マスタ」の見落としがないかはAIに確認してもらう
1対1はテーブルを分けるべき? 基本は1つにまとめてよい。秘匿性が高い列(パスワード等)や、後から追加するオプション情報は分けることがある
自己参照(社員と上司など)はどう描く? 同じテーブルから自分自身への線を引く。外部キーは自テーブルの主キーを参照する
DBMSを使わないチームもER図は必要? 必要。ファイル間の参照関係(このJSONのidはあのJSONを指す)を同じ記法で描けばよい

つまずきやすいポイント

つまずきポイント ヒント
多対多に気づかず1対多で進めてしまう 必ず両方向から数える。「逆から見ると多では?」が合言葉
中間テーブルに主キーを付け忘れる 両端の外部キーの組み合わせを複合主キーにするか、連番IDを付ける
ER図を直したのにテーブル定義書を直し忘れる 成果物は常にペアで更新する。どちらかを変えたら即もう片方、をルール化する
Mermaidの多重度記号を逆向きに書く 鳥の足(多)がどちら側に付いているかを声に出して読み上げて確認する
全テーブルを1人で描いて他メンバーが理解していない 完成後に別のメンバーが図を口頭で説明する読み合わせを行う(話す&行う)
読み上げを開始します...

AIに質問する