ERD設計における多対多リレーションシップ
ER図で結合テーブルを使用した多対多(M:N)リレーションシップをモデリングする方法。結合テーブル設計、複合キー、実際のパターンを解説します。
Relationship Types
詳細な説明
両側が複数の関連を持てる場合
多対多(M:N)リレーションシップは、テーブルAのレコードがテーブルBの複数のレコードと関連付けられ、テーブルBのレコードもテーブルAの複数のレコードと関連付けられることを意味します。リレーショナルデータベースはこれを直接表現できません — 結合テーブル(ジョインテーブル、ブリッジテーブル、関連エンティティとも呼ばれる)が必要です。
結合テーブルパターン
学生とコースを考えます。1人の学生は多くのコースに登録でき、1つのコースは多くの学生を持てます。
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL
);
CREATE TABLE enrollments (
student_id INT NOT NULL,
course_id INT NOT NULL,
enrolled_at TIMESTAMP NOT NULL DEFAULT NOW(),
grade CHAR(2),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
結合テーブルenrollmentsは2つの外部キーを含み、オプションで独自の属性(enrolled_atやgradeなど)を持ちます。
複合キー vs サロゲートキー
結合テーブルの主キーには2つの選択肢があります:
| アプローチ | 構文 | 使用する場合 |
|---|---|---|
| 複合PK | PRIMARY KEY (student_id, course_id) |
組み合わせが常にユニークな場合 |
| サロゲートPK | id SERIAL PRIMARY KEY + UNIQUE(student_id, course_id) |
ORM互換性のために単一カラムPKが必要な場合 |
ERDでの表現
ERDエディタでは、これを3つのエンティティと2つの1対多リレーションシップとしてモデリングします:
students(1)→enrollments(多)courses(1)→enrollments(多)
結合テーブルは2つのメインエンティティの間に配置されます。結合テーブルの両方の外部キーカラムはブルーのFKインジケータでマークされます。
一般的なM:Nパターン
- Users & Roles:
user_roles結合テーブル - Products & Tags:
product_tags結合テーブル - Authors & Books:
book_authors結合テーブル(1冊の本に複数の著者) - Actors & Movies:
movie_cast結合テーブル(role_nameなどの追加属性付き)
ユースケース
学生のコース登録、ユーザーへのロール割り当て、商品へのカテゴリタグ付けなど、エンティティ間に双方向の複数関連があるシステムを構築している場合。結合テーブルパターンはリレーショナルデータベース設計で最も重要な概念の一つです。