コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
エンティティ関係モデル (ER)
エンティティ関係モデル (ER)
このレッスンで分かること
- ER モデルの 3 要素(エンティティ・関係・属性)
- 1 対 1、1 対多、多対多の表現方法
- ER 図からテーブル定義への落とし込み
エンティティ関係モデル とは
実体・関係・属性で現実世界をモデル化する手法を学ぶ。本レッスンでは、エンティティ関係モデル の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
ER モデルとは
ER (Entity-Relationship) モデル は、現実世界をデータベースに落とし込むための設計記法です。1976 年に Peter Chen が提唱しました。実装の前に「世界をどう切り取るか」を整理するのが目的です。
要素は次の 3 つです。
- エンティティ (Entity) — 識別可能な「もの」。例えば
ユーザー、商品、注文。これがテーブルに対応します。 - 関係 (Relationship) — エンティティ間のつながり。「ユーザーが注文する」「商品が注文に含まれる」など。
- 属性 (Attribute) — エンティティが持つ性質。
name、email、priceなど。これがカラムに対応します。
カーディナリティ(多重度)
関係には「何対何か」という多重度があります。
1 対 1 はユーザーとプロフィールの関係です。実装ではどちらかに FOREIGN KEY を持たせるか、テーブルを統合します。
1 対多 は最頻出のパターンで、1 ユーザーが複数注文を持ちます。実装では「多」側に外部キーを持たせます。
SQL クエリ
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);多対多 は、1 注文に複数商品、1 商品が複数注文に含まれるパターンです。これは中間テーブル(関連エンティティ)で表現します。
SQL クエリ
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);order_items のように 複合主キー を持つテーブルで、多対多関係を表現するのが定石です。
弱エンティティ
order_items は単独では意味を持ちません。必ず order と product が存在して初めて意味を成します。こういうエンティティを 弱エンティティ (Weak Entity) と呼びます。親が消えると一緒に消える、いわば従属関係です。
属性の種類
- 単純属性 —
ageのような分割不能な値 - 複合属性 —
addressはzip、city、streetに分解できる - 多値属性 — 1 人が複数の電話番号を持つ場合。別テーブルに切り出して表現
- 派生属性 —
ageはbirthdayから計算できる。保存せず関数で算出するのが定石
ER 図の記法
伝統的な Chen 記法と、現代的な IE 記法(俗にカラスの足)があります。実務では IE 記法 の方が主流です。
||--o{ のような記号で「ユーザー 1 人につき注文 0 個以上」を示します。
設計の手順
- ヒアリングして名詞を洗い出す(エンティティ候補)
- 動詞・「持つ」関係を洗い出す(関係候補)
- 多重度を決める
- 属性を割り当てる
- 主キー・外部キーを定義する
CREATE TABLEに落とす
トレードオフと注意点
ER 図は完璧を目指すと迷宮になります。最初は 粗く 書いて、実装しながら精緻化するのが現実的です。また、多対多を見つけたら必ず中間テーブルにすること、属性が増えてきたら別エンティティに切り出すことを意識しましょう。
ER モデルは「設計言語」。読めるかどうかで、他人と DB を共有できるかが決まる。
やってみよう
- 自分のお気に入りの SNS(X や Instagram など)を ER 図に起こす
- 「ユーザー」「投稿」「いいね」「フォロー」の 4 つで多対多を 2 つ見つける
- 中間テーブルが何になるか考えて、
CREATE TABLE文を書く
よくある質問
Q. このトピックは実務でどう役立ちますか?
A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。
Q. 1 対 1 の関係はいつテーブルを分けるべきですか?
A. アクセス頻度が大きく異なるカラム群を分離したいとき、または特定カラムを一部のユーザーにしか持たせたくないときに分割します。例えば users テーブルに滅多に参照しない詳細情報を持たせたくない場合、user_profiles として分離することで主テーブルの行サイズを抑えられます。単純に「1 対 1 だから」という理由だけでは分割しない方がクエリがシンプルになります。
Q. 多対多はなぜ中間テーブルが必要なのですか?
A. RDB では 1 つのカラムに複数の値を持たせられないため、多対多を直接表現できません。中間テーブル(関連エンティティ)を設けることで、双方向の 1 対多として分解します。例えば order_items が orders と products をつなぐように、中間テーブルは両親テーブルへの外部キーを複合主キーとして持ちます。
次のレッスン
次は 主キー・外部キー・候補キー で、実体・関係・属性で現実世界をモデル化する手法を学ぶ を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- エンティティ関係モデル (ER) の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. エンティティ関係モデル (ER) とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン