ERD設計における複合主キー
ER図で複合主キーを使用するタイミングと方法。結合テーブル、ナチュラルキー、サロゲートキーとのトレードオフを解説します。
Design Patterns
詳細な説明
複合主キーとは?
複合主キーは2つ以上のカラムを組み合わせて行を一意に識別します。単一のカラムだけではユニークではありませんが、組み合わせはユニークです。これは多対多リレーションシップの結合テーブルで最もよく使用されます。
結合テーブルの例
CREATE TABLE course_enrollments (
student_id INT NOT NULL,
course_id INT NOT NULL,
enrolled_at TIMESTAMP NOT NULL DEFAULT NOW(),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
複合キー(student_id, course_id)は、学生が1つのコースに1度だけ登録できることを保証します。どちらのカラムも単独ではユニークではありません — 学生は多くのコースに登録し、コースには多くの学生がいます。
ナチュラル複合キー
一部のエンティティはビジネスルールに基づくナチュラル複合キーを持ちます:
| テーブル | 複合キー | 理由 |
|---|---|---|
schedule_slots |
(room_id, time_slot) |
1つの部屋は1スロットにつき1回のみ予約可能 |
price_history |
(product_id, effective_date) |
日付ごとに1つの価格 |
translations |
(entity_id, locale) |
言語ごとに1つの翻訳 |
複合PK vs サロゲートPK
| 側面 | 複合PK | サロゲートPK(id SERIAL) |
|---|---|---|
| ユニーク性 | ビジネスカラムで強制 | 自動増分で強制 |
| ORMサポート | 一部のORMは複合PKで問題あり | 普遍的にサポート |
| インデックスサイズ | 大きい(複数カラム) | 小さい(単一整数) |
| 意味論 | 自己文書化 | 別途UNIQUE制約が必要 |
| JOINパフォーマンス | カラム型に依存 | 高速な整数JOIN |
ERDエディタでの操作
複合主キーを持つエンティティを作成する場合、複数のカラムでPKチェックボックスをオンにします。両方のカラムはダイアグラムでゴールドでハイライトされます。生成されたSQLはテーブルレベルでPRIMARY KEY (col1, col2)制約を生成します。
ベストプラクティス
結合テーブルで、およびナチュラルキーが安定して意味のある場合は複合主キーを使用します。ナチュラルキーが広すぎる、不安定、またはORM互換性が優先される場合はサロゲートキー(id)を使用します。
ユースケース
多対多リレーションシップの結合テーブルを設計している場合、またはビジネスドメインに自然な複合識別子がある場合(日付と場所の組み合わせ、または翻訳のエンティティとロケールなど)。