基礎ER図

多対多 (N:M) と連関実体

定義

多対多 (N:M) 関連とは、両側のエンティティが互いに複数個と結び付く関連であり、実装時には両者を参照する連関実体 (関連実体・中間テーブル) に分解される。

まず身近な例で: 履修登録

大学の履修登録を思い浮かべる。1 人の学生は複数の科目を取り、 1 つの科目には複数の学生が集まる。両側とも「複数」の関係、 これが多対多 (N:M) の関連。

直感的には ER 図で「学生」と「科目」に線を 1 本引いて、両端に鳥足を付ければ済みそうに見える。 でも、それでは 「誰がいつ何を履修したか」を記録する場所がない

直接 N:M で繋いだ状態 (実装できない)
学生学籍番号 (PK)氏名科目科目ID (PK)科目名

ER 図の記法上は書けても、実装時にこのまま SQL テーブル 2 つに落とせない。

解決: 連関実体 (中間テーブル) に分解する

両側から参照される第 3 のエンティティ 「履修登録」 を挟む。 履修登録には「学籍番号」と「科目ID」の 2 本の FK が入り、それが複合主キーになる。 履修年度・成績・登録日 などの固有属性もここに持たせられる。

連関実体で N:M を分解
学生学籍番号 (PK)氏名履修登録学籍番号 (PK)科目ID (PK)履修年度成績科目科目ID (PK)科目名

「履修登録」が学生と科目の両方から FK を借り、複合主キー (学籍番号, 科目ID) で行を一意に識別する。IE 記法では弱エンティティを特別な記号で区別せず、主キーが親エンティティのキーを含むかどうかで判定する。

連関実体を作らないと失うもの

  • 履歴: 「田中さんが 4/10 にデータベース概論を履修登録した」の登録日を記録する場所がない
  • 状態遷移: 「登録済み → 履修中 → 完了」といったステータスを持たせる場所がない
  • 重複制御: 「同じ学生が同じ科目を 2 回履修登録することはない」を主キーで担保できない
  • 属性: 「成績」「出席回数」など履修対応そのものに紐付くデータを置く場所がない

練習問題

別の題材で自分でも試してみる。答えを見る前に、どんな連関実体を作ればいいか、 主キーや FK、追加すべき属性をノートに書き出してみてほしい。

練習問題 — 社員 と プロジェクト の N:M を連関実体で分解する
以下の ER 図では「社員」と「プロジェクト」が N:M で直接繋がっている (1 人の社員は複数プロジェクトに参加し、1 プロジェクトには複数社員が参加する)。 このままでは 「誰がいつ、どの役割でそのプロジェクトに参加したか」を記録する場所がない。 連関実体を挟んで N:M を分解した ER 図を描け。連関実体の 名前・主キー・追加属性 を明示すること。
分解前 — 社員 ⇔ プロジェクト の N:M
参加社員社員ID (PK)氏名プロジェクトプロジェクトID (PK)プロジェクト名

両端に鳥足 = N:M。参加日・役割などの「対応固有の属性」を格納する場所がまだない。

答えを見る

連関実体を 「参加」 とし、両側から FK を借りて(社員ID, プロジェクトID) の複合主キー で行を一意に識別する。 対応固有の属性として 役割参加開始日 をここに持たせる。 こうすると「田中さんが 4/1 から新Webサイトにリーダーとして参加している」といった情報が 1 行で表現できる。

分解後 — 連関実体「参加」を挟む
社員社員ID (PK)氏名参加社員ID (PK)プロジェクトID (PK)役割参加開始日プロジェクトプロジェクトID (PK)プロジェクト名

連関実体「参加」に 2 本の FK が入り、それが複合主キー ((社員ID, プロジェクトID)) を構成する。役割・参加開始日 のような対応固有の属性はこの連関実体にだけ置ける。

下は 3 テーブルにサンプルデータを載せた例。

参加
社員IDPKプロジェクトIDPK役割参加開始日
E01P01リーダー2026-04-01
E01P02メンバー2026-05-01
E02P01メンバー2026-04-15
E03P03リーダー2026-06-01
社員
社員IDPK氏名
E01田中
E02山田
E03佐藤
プロジェクト
プロジェクトIDPKプロジェクト名
P01新Webサイト
P02社内システム
P03データ移行

変なER図 との対応: 違和感 #5「顧客×商品」に中間実体なし

架空 EC サイト運営システム ER 図
発注確定購入5階層所属明細P対象配送先配送先ID (PK)郵便番号住所カテゴリカテゴリID (PK)名称サブカテゴリID商品商品ID (PK)商品名価格カテゴリID顧客顧客ID (PK)氏名注文履歴JSONカート内商品ID配列レビュー全て血液型注文注文ID (PK)注文日顧客IDレビューレビューID (PK)評価本文サブカテゴリサブカテゴリID (PK)名称親カテゴリID注文明細明細ID (PK)商品名数量

変なER図 では、「顧客」と「商品」が直接 N:M の線で繋がっている。 EC サイトでは明らかに 購入履歴 (誰が いつ 何をいくつ買ったか) を記録したい はずだが、 この構造だと「田中さんが 8/1 にこの商品を 2 個買った」を格納する場所がない。 しかも図の別の場所に「注文明細」エンティティが描かれているのに、この線は迂回していない。

正しくは 顧客 → 注文 → 注文明細 → 商品 と辿って、注文明細を連関実体として (注文ID, 明細番号) や (注文ID, 商品ID) の複合主キーで表現する。 これで購入履歴も数量も金額も全部乗る。

よくある疑問

Q.多対多を直接テーブル 2 つで実装できないのはなぜですか?
A.「学生」テーブルに「履修科目」列を複数値で持たせようとすると 1NF 違反になる。逆に「科目」テーブルに「履修学生」を持たせても同じ問題。両者の対応関係は、1 行につき「1 学生 × 1 科目」の組を持つ第 3 のテーブル (連関実体) にしか収まらない。
Q.連関実体には常に属性を持たせるべきですか?
A.対応関係そのものだけを表現する場合は最低限 (両側の FK 2 本) で足りるが、「いつ登録した」「成績は」「支払済みか」など対応固有のデータが発生する場合は必ず属性として持たせる。多くの場合、業務要件を精査すると何らかの属性が必要になる。
Q.連関実体は弱エンティティですか?
A.両側のエンティティなしには意味を持たないので、実質的には弱エンティティに近い。ただし主キーの設計上、独立の代理キー (履修ID など) を付けて強エンティティとして扱う実装も多い。学術的には弱エンティティ、実務的には状況次第、という中間的な存在。

関連トピック

もっと学びたい方へ(おすすめ書籍)

おすすめ
達人に学ぶDB設計徹底指南書 第2版
ミック

テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。

Amazon で見る →
おすすめ
楽々ERDレッスン (CodeZine BOOKS)
羽生章洋

ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。

Amazon で見る →
情報処理教科書 データベーススペシャリスト 2025年版
三好康之

IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。

Amazon で見る →
達人に学ぶSQL徹底指南書 第2版
ミック

SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。

Amazon で見る →
SQLアンチパターン 第2版
Bill Karwin

実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。

Amazon で見る →
[改訂3版]内部構造から学ぶPostgreSQL
勝俣智成 ほか

PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。

Amazon で見る →
理論から学ぶデータベース実践入門
奥野幹也

リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。

Amazon で見る →

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講