📊 STEP 3: ER図の読み方・書き方
データベース設計の「設計図」を読み書きできるようになろう
- ER図とは何か、なぜ必要なのか
- ER図の「読み方」をマスターする
- エンティティとリレーションシップの「書き方」を学ぶ
- 実践:ブログシステムのER図を作成する
学習時間の目安: 2.5時間 | 前提知識: STEP 1-2修了
🎯 1. ER図とは何か?
STEP 2で学んだことを「図」にする
STEP 2では、以下の4つの概念を学びました。
- エンティティ:管理したい「モノ」や「概念」(例:顧客、商品、注文)
- 属性:エンティティが持つ情報(例:顧客名、メールアドレス)
- リレーションシップ:エンティティ同士の関係(例:1対多、多対多)
- カーディナリティ:関係の数量的な制約(例:(0,*)、(1,1))
これらは「頭の中の概念」です。ER図とは、この概念を「目に見える図」にしたものです。
ER図(Entity-Relationship Diagram)=エンティティ・リレーションシップ図
STEP 2で学んだエンティティ、属性、リレーションシップ、カーディナリティを、図(ダイアグラム)で表現したものです。
つまり、STEP 2 = 概念を理解する、STEP 3 = 概念を図に書くという関係です。
なぜER図が必要なのか?
データベース設計をチームで共有するとき、文章だけで説明するのは大変です。
「顧客テーブルがあって、顧客IDと顧客名とメールアドレスを持っていて、注文テーブルは注文IDと注文日と合計金額を持っていて、注文テーブルには顧客IDがあって顧客テーブルを参照していて、1人の顧客は複数の注文ができて…」
これを図にすると、一目で構造がわかります。
図で見れば、「顧客と注文が関係している」「1人の顧客が複数の注文を持つ」ことが一目瞭然です。
ER図の4つのメリット
文章で説明するより、図で見た方がわかりやすい。エンティティ同士の関係が一目瞭然。
技術者だけでなく、非技術者とも共有できる。「こういう構造になります」と見せられる。
実装前に図で確認することで、設計の問題点に気づきやすい。修正コストが低い。
後から見返したり、新メンバーへの説明に使える。システムの理解が早まる。
ER図の記法について
ER図には複数の「記法(書き方のルール)」があります。主なものは2つです。
| 記法 | 特徴 | 使用頻度 |
|---|---|---|
| IE記法 | シンプルでわかりやすい。カラスの足(Crow’s Foot)で多を表現 | ⭐⭐⭐⭐⭐ 最も普及 |
| IDEF1X記法 | 厳密な表現が可能。大規模プロジェクト向け | ⭐⭐⭐ 企業標準で使用 |
IE記法は最も普及している記法で、多くのツールがサポートしています。シンプルで学習コストも低いため、まずはIE記法をマスターしましょう。IDEF1Xは、企業の標準として採用されている場合に学べば十分です。
📖 2. ER図の読み方をマスターしよう
ER図を「書く」前に、まず「読む」ことができるようになりましょう。読み方がわかれば、書き方も自然と身につきます。
ER図の3つの構成要素
ER図は、以下の3つの要素で構成されています。
① 四角形 = エンティティ
管理したい「モノ」や「概念」を表す
② 四角形の中 = 属性
エンティティが持つ情報(カラム)を表す
③ 線と記号 = リレーションシップとカーディナリティ
エンティティ同士の関係と、その数量を表す
① 四角形の読み方(エンティティと属性)
四角形の中身を詳しく見てみましょう。
PK(Primary Key)= 主キー
そのエンティティを一意に識別するための属性。
例:customer_id(顧客ID)で、どの顧客かを特定できる。
FK(Foreign Key)= 外部キー
他のエンティティを参照するための属性。
例:注文テーブルのcustomer_idは、顧客テーブルを参照している。
② 線と記号の読み方(リレーションシップとカーディナリティ)
線の端についている記号は、カーディナリティ(数量の制約)を表します。IE記法では以下の4種類の記号を使います。
| 記号 | 意味 | STEP 2での表記 | 読み方 |
|---|---|---|---|
──│ |
必ず1つ | (1, 1) | 「1」 |
──o│ |
0または1 | (0, 1) | 「0か1」 |
──< |
1つ以上 | (1, *) | 「多(必須)」 |
── |
0以上 | (0, *) | 「多(任意)」 |
縦棒(│)= 1を表す
丸(o)= 0の可能性があることを表す
カラスの足(<)= 複数(多)を表す。鳥の足跡の形に似ているため「Crow's Foot(カラスの足)」と呼ばれます。
③ 実際にER図を読んでみよう
では、実際のER図を一緒に読んでみましょう。
①エンティティの確認
「顧客」と「注文」という2つのエンティティがある
②属性の確認
顧客:customer_id(主キー)、name、email
注文:order_id(主キー)、customer_id(外部キー)、order_date、total
③リレーションシップの確認
顧客と注文が線で結ばれている → 関係がある
④カーディナリティの確認
・顧客側:記号なし(1) → 1つの注文は、必ず1人の顧客に属する
・注文側:
カーディナリティの記号は、相手側から見た数を表します。
・顧客側の「1」 → 注文から見て、顧客は「1人」
・注文側の「
最初は混乱しやすいので、「〜から見て」と考えると理解しやすくなります。
✏️ 3. エンティティの書き方
読み方がわかったところで、次は「書き方」を学びましょう。まずはエンティティ(四角形の部分)から始めます。
基本的なエンティティの書き方
エンティティは、四角形の中にエンティティ名と属性を書くというシンプルな形式です。
商品を管理するエンティティを書いてみます。
属性:商品ID、商品名、価格、在庫数、カテゴリID
主キーと外部キーの書き方のルール
主キー(PK)の書き方
PK:と明記する(または下線を引く)- エンティティ内の一番上に書く
- 1つのエンティティに1つが基本
外部キー(FK)の書き方
FK:と明記する- エンティティ内の下の方に書く
- 参照先のテーブル名がわかる名前にする(例:customer_id → 顧客を参照)
複合主キーの書き方
2つ以上の属性を組み合わせて主キーにする場合、複合主キーと呼びます。
「どの注文の、どの商品か」を表すには、注文IDと商品IDの組み合わせで一意になります。
🔗 4. リレーションシップの書き方
次に、エンティティ同士を線で結ぶ「リレーションシップ」の書き方を学びます。シンプルな例から順番に見ていきましょう。
ステップ1:1対多のリレーションシップ(最も基本)
まずは最もよく使う「1対多」の関係から始めましょう。
・1人の顧客は、複数の注文ができる
・1つの注文は、必ず1人の顧客に属する
1対多の関係では、「多」側のエンティティに外部キーを追加します。
上の例では、注文テーブルに「customer_id」という外部キーがあり、これで「どの顧客の注文か」を表します。
ステップ2:1対1のリレーションシップ
次に、「1対1」の関係を見てみましょう。これは比較的珍しいパターンです。
・1人のユーザーは、1つのプロフィールを持つ(または持たない)
・1つのプロフィールは、必ず1人のユーザーに属する
1対1の関係は、以下のようなケースで使います:
・データを分割したい:頻繁にアクセスする情報と、たまにしかアクセスしない情報を分ける
・セキュリティ:機密情報を別テーブルに分離する
・オプショナルな情報:全員が持つわけではない情報を分ける
ステップ3:多対多のリレーションシップ(中間テーブル)
「多対多」の関係は、直接線で結ぶことができません。中間テーブル(連関エンティティ)を作成して表現します。
・1人の学生は、複数の授業を履修できる
・1つの授業は、複数の学生が履修できる
リレーショナルデータベースでは、多対多の関係を直接表現することができません。
そこで、「中間テーブル」を作成し、2つの1対多の関係に分解します。
中間テーブルには、関係に付随する情報(履修日、成績など)を追加できます。
上の例では「enrolled_at(履修日)」を追加しています。
ステップ4:自己参照のリレーションシップ
同じエンティティ内で関係を持つ場合、自己参照と呼びます。
社員テーブルで、「この社員の上司は誰か」を表現したい場合
カテゴリに親子関係を持たせたい場合(家電 → テレビ、冷蔵庫)
📝 5. 実践:ブログシステムのER図を作成しよう
ここまで学んだことを使って、ブログシステムのER図を一緒に作成してみましょう。
Step 1:要件を確認する
- ユーザーが記事を投稿できる
- 記事は1つのカテゴリに属する
- 記事には複数のコメントがつけられる
- コメントはユーザーが投稿する
- 記事には複数のタグをつけられる(多対多)
Step 2:エンティティを抽出する
要件から、管理すべき「モノ」を洗い出します。
Step 3:リレーションシップを整理する
Step 4:ER図を完成させる
- ✅ まずエンティティを全て書き出す
- ✅ 次にリレーションシップを線で結ぶ
- ✅ カーディナリティを正しく表記する
- ✅ 多対多は中間テーブルで解決する
- ✅ 読みやすいようにレイアウトを工夫する
🛠️ 6. ER図作成ツール
ER図は手書きでも作成できますが、ツールを使うと修正や共有が簡単になります。
おすすめツール
- 完全無料
- Webブラウザで使える
- ER図用のテンプレートあり
- 初心者に最適
- 無料プランあり
- 美しいデザイン
- 共同編集可能
- チーム利用に最適
- MySQL公式ツール
- ER図からDDL自動生成
- リバースエンジニアリング可
- 実務向け
- コードで図を描く
- GitHubに埋め込める
- バージョン管理しやすい
- プログラマ向け
まずはdraw.ioから始めるのがおすすめです。無料で、直感的に操作でき、学習コストが低いです。慣れてきたら、MySQL Workbenchなどの実務向けツールに移行しましょう。
📝 STEP 3 のまとめ
- ER図は、STEP 2で学んだ概念を「図」にしたもの
- 記法にはIE記法とIDEF1X記法があり、IE記法が主流
- ER図は四角形(エンティティ)と線(リレーションシップ)で構成
- 主キーはPK:、外部キーはFK:で明記
- カーディナリティは4種類の記号で表現(│、o│、<、
- 多対多は中間テーブルで2つの1対多に分解
- ER図作成にはdraw.ioなどのツールが便利
次のSTEP 4では、データ型の選択と設計を学び、より実践的なテーブル設計に進みます!
📝 練習問題
IE記法の4つの記号(│、o│、<、
【解答】
│(縦棒):必ず1つ (1, 1)
o│(丸+縦棒):0または1 (0, 1)
<(カラスの足):1つ以上 (1, *)
:0以上 (0, *)
│(縦棒):必ず1つ (1, 1)
o│(丸+縦棒):0または1 (0, 1)
<(カラスの足):1つ以上 (1, *)
以下のER図を読んで、顧客と注文の関係を日本語で説明してください。
・1人の顧客は、0個以上の注文を持つことができる( ・1つの注文は、必ず1人の顧客に属する(記号なし = 1)
「部署」エンティティ(部署ID、部署名)をER図で書いてください。
「部署」と「社員」の1対多の関係をER図で表現してください。
(1つの部署には複数の社員がいる、社員は必ず1つの部署に所属)
以下の要件からER図を作成してください。
【要件】図書館システム
・会員が本を借りる
・1冊の本は同時に1人にしか貸せない
・貸出履歴を記録したい
ポイント:「貸出」テーブルを作ることで、履歴を記録できます。status(貸出中/返却済み)で現在の状態を管理すれば、「1冊の本は同時に1人にしか貸せない」という制約もアプリケーション側で制御できます。
❓ よくある質問
Q1: ER図は手書きでもいいですか?
手書きでも全く問題ありません!特に学習段階では、紙とペンで書く方が理解が深まることもあります。
ただし、実務では修正が簡単、きれいに整形できる、チームで共有しやすい、DDLを自動生成できるなどの理由でツールを使うことが多いです。
Q2: 記号を覚えられません。コツはありますか?
以下のように覚えると楽です:
- 縦棒(│)→ 数字の「1」に見える → 「1」
- 丸(o)→ 数字の「0」に見える → 「0の可能性あり」
- カラスの足(<)→ 足跡がたくさん → 「多」
実際に何度か書いてみれば、すぐに覚えられます。
Q3: 外部キーはどちら側に書けばいいですか?
「多」側のエンティティに外部キーを書きます。
例:顧客(1)と注文(多)の関係では、注文テーブルにcustomer_id(外部キー)を追加します。これで「どの顧客の注文か」を表現できます。
Q4: ER図に属性を全部書く必要がありますか?
場合によります。概念設計の段階では主要な属性だけを書いて全体の構造を理解しやすくし、論理設計・物理設計の段階ではすべての属性を書いて詳細な設計書として使います。
Q5: 多対多を中間テーブルなしで表現できませんか?
リレーショナルデータベースでは、中間テーブルなしでは表現できません。
これはリレーショナルデータベースの仕組み上の制約です。多対多の関係は必ず中間テーブルを作成し、2つの1対多の関係に分解して表現します。
学習メモ
データベース設計・データモデリング - Step 3