多対多 (N:M) と連関実体
多対多 (N:M) 関連とは、両側のエンティティが互いに複数個と結び付く関連であり、実装時には両者を参照する連関実体 (関連実体・中間テーブル) に分解される。
まず身近な例で: 履修登録
大学の履修登録を思い浮かべる。1 人の学生は複数の科目を取り、 1 つの科目には複数の学生が集まる。両側とも「複数」の関係、 これが多対多 (N:M) の関連。
直感的には ER 図で「学生」と「科目」に線を 1 本引いて、両端に鳥足を付ければ済みそうに見える。 でも、それでは 「誰がいつ何を履修したか」を記録する場所がない。
ER 図の記法上は書けても、実装時にこのまま SQL テーブル 2 つに落とせない。
解決: 連関実体 (中間テーブル) に分解する
両側から参照される第 3 のエンティティ 「履修登録」 を挟む。 履修登録には「学籍番号」と「科目ID」の 2 本の FK が入り、それが複合主キーになる。 履修年度・成績・登録日 などの固有属性もここに持たせられる。
「履修登録」が学生と科目の両方から FK を借り、複合主キー (学籍番号, 科目ID) で行を一意に識別する。IE 記法では弱エンティティを特別な記号で区別せず、主キーが親エンティティのキーを含むかどうかで判定する。
連関実体を作らないと失うもの
- 履歴: 「田中さんが 4/10 にデータベース概論を履修登録した」の登録日を記録する場所がない
- 状態遷移: 「登録済み → 履修中 → 完了」といったステータスを持たせる場所がない
- 重複制御: 「同じ学生が同じ科目を 2 回履修登録することはない」を主キーで担保できない
- 属性: 「成績」「出席回数」など履修対応そのものに紐付くデータを置く場所がない
練習問題
別の題材で自分でも試してみる。答えを見る前に、どんな連関実体を作ればいいか、 主キーや FK、追加すべき属性をノートに書き出してみてほしい。
両端に鳥足 = N:M。参加日・役割などの「対応固有の属性」を格納する場所がまだない。
答えを見る
連関実体を 「参加」 とし、両側から FK を借りて(社員ID, プロジェクトID) の複合主キー で行を一意に識別する。 対応固有の属性として 役割・参加開始日 をここに持たせる。 こうすると「田中さんが 4/1 から新Webサイトにリーダーとして参加している」といった情報が 1 行で表現できる。
連関実体「参加」に 2 本の FK が入り、それが複合主キー ((社員ID, プロジェクトID)) を構成する。役割・参加開始日 のような対応固有の属性はこの連関実体にだけ置ける。
下は 3 テーブルにサンプルデータを載せた例。
| 社員IDPK | プロジェクトIDPK | 役割 | 参加開始日 |
|---|---|---|---|
| E01 | P01 | リーダー | 2026-04-01 |
| E01 | P02 | メンバー | 2026-05-01 |
| E02 | P01 | メンバー | 2026-04-15 |
| E03 | P03 | リーダー | 2026-06-01 |
| 社員IDPK | 氏名 |
|---|---|
| E01 | 田中 |
| E02 | 山田 |
| E03 | 佐藤 |
| プロジェクトIDPK | プロジェクト名 |
|---|---|
| P01 | 新Webサイト |
| P02 | 社内システム |
| P03 | データ移行 |
変なER図 との対応: 違和感 #5「顧客×商品」に中間実体なし
変なER図 では、「顧客」と「商品」が直接 N:M の線で繋がっている。 EC サイトでは明らかに 購入履歴 (誰が いつ 何をいくつ買ったか) を記録したい はずだが、 この構造だと「田中さんが 8/1 にこの商品を 2 個買った」を格納する場所がない。 しかも図の別の場所に「注文明細」エンティティが描かれているのに、この線は迂回していない。
正しくは 顧客 → 注文 → 注文明細 → 商品 と辿って、注文明細を連関実体として (注文ID, 明細番号) や (注文ID, 商品ID) の複合主キーで表現する。 これで購入履歴も数量も金額も全部乗る。
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)