【ふくごうきー】

複合キー とは?

💡 複数のカラムを「組み合わせて主キー」にする設計
📌 このページのポイント
複合キー(Composite Key) enrollment(履修テーブル) student_id course_id grade S001 C101 A S001 C102 B S002 C101 A S002 C102 C 🔑 複合主キー(PK) student_id だけ → S001が重複 ✗ 一意でない course_id だけ → C101が重複 ✗ 一意でない ✓ 2つ組み合わせると各行が一意に識別できる
複合キーの仕組み
ひよこ ひよこ

複合キーってどんなときに使うの?

ペンギン先生 ペンギン先生

例えばユーザーと商品の「お気に入り」中間テーブル(user_favoritesなど)。user_idだけでは一意にならない(1人が複数の商品をお気に入りできる)。product_idだけでも同様。「user_id + product_id」の組み合わせが一意になるから複合主キーにする。

ひよこ ひよこ

代わりにIDを振ってもいいの?

ペンギン先生 ペンギン先生

サロゲートキー方式という。「favorite_id」という自動採番IDを主キーにして、user_idとproduct_idは外部キーにする。シンプルな構成で参照しやすいが、user_idとproduct_idの組み合わせのUNIQUE制約は別途設定が必要。どちらの設計もよく使われる。

ひよこ ひよこ

複合キーのカラム順番は関係ある?

ペンギン先生 ペンギン先生

インデックスの観点では関係ある。複合インデックスは先頭カラムの検索で効果を発揮する。「(user_id, product_id)」の複合キーなら「user_idのみの検索」は速くなるが「product_idのみの検索」は速くならない。

ひよこ ひよこ

複合キーとサロゲートキー(自動採番ID)はどっちがいいの?

ペンギン先生 ペンギン先生

これはDB設計の永遠の議論だね。複合キーは「業務的に意味のある値」で一意性を保証するから、データの意味が明確になるメリットがある。一方サロゲートキーは「id SERIAL PRIMARY KEY」のように自動採番するから、JOIN外部キー参照がシンプルになる。実はRailsのActiveRecordはサロゲートキー前提の設計で、複合主キーのサポートが長らく不完全だったんだ。フレームワーク制約も考慮して選ぶ必要があるよ。現実的には「サロゲートキー+複合ユニーク制約」の組み合わせが多いね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
複合キーって出てきたら「複数カラムを組み合わせて主キーにする設計、中間テーブルでよく使う」と思えばOK!
📖 おまけ:英語の意味
「Composite Key(Compound Key)」 = 複合鍵・複数の要素からなる鍵
💬 「composite」は「複数の要素からなる」という意味。単一のキーで一意性を保証できない場合の設計手法
← 用語集にもどる