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)を使用します。

ユースケース

多対多リレーションシップの結合テーブルを設計している場合、またはビジネスドメインに自然な複合識別子がある場合(日付と場所の組み合わせ、または翻訳のエンティティとロケールなど)。

試してみる — ERD Editor

フルツールを開く