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記法で書くと、こうなります。
記号の読み方:
||は「ちょうど1」、o{は「0以上の多」||--o{で「1対多(0件もあり)」- 線の鳥の足のような側が「多」。だからこの記法は「鳥の足記法(Crow's Foot)」と呼ばれます
前セッションの注文票の例なら、こうなります。
注文明細が、注文と商品の多対多を解決する中間テーブルになっていることに注目してください。
正規化で自然に生まれたテーブルが、ER図では関係の要になります。
ここがポイント
- リレーションを見つける手がかりは外部キー。「FKのある所に線あり」
- 多対多を見つけたら中間テーブルで1対多×2に分解する。これが今日一番の山場
- 「多」側の見積もりを口に出して確認する。「1人の会員は予約をいくつ持てる?」「1つの予約に会員は何人?」の2方向から問う
- ER図とテーブル定義書は必ず一致させる。図にあるのに定義書にないテーブル(またはその逆)は設計漏れ
コラム
ER図は1976年、台湾出身の計算機科学者ピーター・チェンが提案しました。
チェンの論文は、データベース分野で最も引用された論文の1つです。
彼は「漢字が物事を絵で表すように、データも図で表せるはずだ」と考えたと語っています。
ちなみに「鳥の足記法」の足マークは、本当にニワトリの足跡が由来。
世界中の設計書がニワトリの足跡だらけだと思うと、少し和みませんか。
💬 AIに聞いてみよう
実習前に疑問を解消しておきましょう。たとえば:
- 「1対1の関係って本当に必要?テーブルを1つにまとめてはだめ?」
- 「自チームの○○と△△は多対多だと思うけど、中間テーブルの名前はどうつけるのが普通?」
- 「MermaidのerDiagramで『0か1』はどう書くの?」
実習・演習(50分)
課題
テーブル定義書をもとに、自チームの全テーブルを含むER図を作成してください。
- テーブル定義書から全テーブルを書き出し、外部キーを手がかりに関係線を引く
- 各関係について「1対1 / 1対多 / 多対多」を判定する。判定時は両方向から問う(AはBをいくつ持つ?BはAをいくつ持つ?)
- 多対多が見つかったら中間テーブルを設計し、テーブル定義書にも追加する
- MermaidのerDiagram(または使い慣れた作図ツール)でER図を清書する
- ER図とテーブル定義書の整合性を相互チェックする
- 図にあるテーブルはすべて定義書にあるか
- 定義書の外部キーはすべて図の線になっているか
- 完成した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人で描いて他メンバーが理解していない | 完成後に別のメンバーが図を口頭で説明する読み合わせを行う(話す&行う) |