コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

エンティティ関係モデル (ER)

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

エンティティ関係モデル (ER)

このレッスンで分かること

  • ER モデルの 3 要素(エンティティ・関係・属性)
  • 1 対 1、1 対多、多対多の表現方法
  • ER 図からテーブル定義への落とし込み

エンティティ関係モデル とは

実体・関係・属性で現実世界をモデル化する手法を学ぶ。本レッスンでは、エンティティ関係モデル の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

ER モデルとは

ER (Entity-Relationship) モデル は、現実世界をデータベースに落とし込むための設計記法です。1976 年に Peter Chen が提唱しました。実装の前に「世界をどう切り取るか」を整理するのが目的です。

要素は次の 3 つです。

  • エンティティ (Entity) — 識別可能な「もの」。例えば ユーザー商品注文。これがテーブルに対応します。
  • 関係 (Relationship) — エンティティ間のつながり。「ユーザーが注文する」「商品が注文に含まれる」など。
  • 属性 (Attribute) — エンティティが持つ性質。nameemailprice など。これがカラムに対応します。

カーディナリティ(多重度)

関係には「何対何か」という多重度があります。

diagram (will load when visible)

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 は単独では意味を持ちません。必ず orderproduct が存在して初めて意味を成します。こういうエンティティを 弱エンティティ (Weak Entity) と呼びます。親が消えると一緒に消える、いわば従属関係です。

属性の種類

  • 単純属性age のような分割不能な値
  • 複合属性addresszipcitystreet に分解できる
  • 多値属性 — 1 人が複数の電話番号を持つ場合。別テーブルに切り出して表現
  • 派生属性agebirthday から計算できる。保存せず関数で算出するのが定石

ER 図の記法

伝統的な Chen 記法と、現代的な IE 記法(俗にカラスの足)があります。実務では IE 記法 の方が主流です。

diagram (will load when visible)

||--o{ のような記号で「ユーザー 1 人につき注文 0 個以上」を示します。

設計の手順

  1. ヒアリングして名詞を洗い出す(エンティティ候補)
  2. 動詞・「持つ」関係を洗い出す(関係候補)
  3. 多重度を決める
  4. 属性を割り当てる
  5. 主キー・外部キーを定義する
  6. 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_itemsordersproducts をつなぐように、中間テーブルは両親テーブルへの外部キーを複合主キーとして持ちます。

次のレッスン

次は 主キー・外部キー・候補キー で、実体・関係・属性で現実世界をモデル化する手法を学ぶ を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. エンティティ関係モデル (ER) の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. エンティティ関係モデル (ER) とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン