データベース設計において、テーブルの行を一意に識別するためのキー設計は非常に重要です。
その中でも複合キーは、複数の列を組み合わせて主キーとして機能させる設計手法であり、単一列では一意性を確保できない場合に活躍します。
本記事では、複合キーの定義・役割・設定方法・注意点について詳しく解説していきます。
複合キーとは?データベース設計における結論
それではまず、複合キーの基本的な定義と概念について解説していきます。
複合キーとは、リレーショナルデータベースにおいて、2つ以上の列(カラム)を組み合わせることで行を一意に識別するキーのことです。
「複合主キー」や「コンポジットキー(Composite Key)」とも呼ばれており、単一の列だけでは重複が生じてしまう場合に使用します。
例えば「注文明細テーブル」において、注文IDと商品IDを組み合わせることで各行を一意に識別できるケースが典型的な複合キーの活用例です。
キーの種類と役割の比較
| キーの種類 | 説明 | 列数 |
|---|---|---|
| 単一主キー | 1列で行を一意に識別 | 1列 |
| 複合主キー | 複数列の組み合わせで行を一意に識別 | 2列以上 |
| 外部キー | 他テーブルの主キーを参照する列 | 1列以上 |
| 候補キー | 主キーになり得る列または列の組み合わせ | 1列以上 |
| 代理キー | 自動採番などで生成された人工的な識別子 | 1列 |
複合キーを使用することで、自然な業務データの組み合わせを識別子として活用できますが、設計上の注意点もいくつか存在します。
複合キーと単一主キーの使い分け
単一主キーは管理がシンプルで外部参照も容易ですが、業務データの性質によっては単一列での一意性確保が難しいケースがあります。
複合キーはそのような場合に自然な形で一意性を表現できますが、外部キーとして参照する際に複数列を管理する必要があるため設計が複雑になる側面があります。
近年では代理キー(サロゲートキー)として自動採番のIDを使用し、業務上の一意性は別途ユニーク制約で管理する設計も広く採用されています。
複合キーが必要になる典型的なシーン
複合キーが自然に登場するテーブル設計の典型例として、多対多(M:N)の関連を表す中間テーブルがあります。
学生と授業の関係を表す「履修テーブル」では、学生IDと授業IDの組み合わせが一意な履修を表すため、複合キーが適しています。
このような中間テーブルでの複合キー使用は、リレーショナルデータベース設計における基本パターンのひとつです。
複合キーの設定方法とSQL構文
続いては、実際に複合キーを設定する方法とSQL構文について確認していきます。
テーブル作成時の複合主キー設定
複合主キーはCREATE TABLE文のPRIMARY KEY制約を使って設定します。
複合主キーの設定例(SQL)
CREATE TABLE order_items (
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
上記の例では、order_idとproduct_idの組み合わせが主キーとして設定されており、この2列の値の組み合わせがテーブル内で一意であることが保証されます。
どちらか一方の値が同じであっても、もう一方が異なれば異なる行として扱われます。
既存テーブルへの複合キーの追加
既存のテーブルに複合主キーを追加する場合はALTER TABLE文を使用します。
ただし、主キーが既に設定されている場合は一旦削除してから再設定する必要があります。
また、複合キーとして設定する列にNULL値が含まれている場合は、主キー制約を設定できないため事前にデータを整備することが必要です。
複合外部キーの設定
複合キーを持つテーブルを別テーブルから参照する場合、外部キーも複数列で構成されます。
複合外部キーの設定例
CREATE TABLE shipments (
shipment_id INT PRIMARY KEY,
order_id INT,
product_id INT,
FOREIGN KEY (order_id, product_id) REFERENCES order_items(order_id, product_id)
);
複合外部キーは参照先の複合主キーと列数・型が一致している必要があります。
複合キーと正規化の関係
続いては、複合キーとデータベース正規化の関係について確認していきます。
第2正規形と複合キーの関係
データベース正規化の第2正規形(2NF)は、複合主キーを持つテーブルにおいて特に重要な概念です。
第2正規形では、非キー属性がすべての主キー列に対して完全関数従属でなければなりません。
複合主キーの一部にのみ依存する属性(部分関数従属)が存在する場合は、別テーブルに分離することで第2正規形を達成できます。
例えば「注文明細テーブル」に商品名が含まれている場合、商品名は商品IDにのみ依存するため、商品テーブルとして分離する必要があります。
正規化による複合キーの扱い変化
正規化が進むにつれて、複合キーが単一キーに置き換えられることもあります。
第3正規形(3NF)以上への正規化を進める過程で、複合キーの一部に推移的関数従属が見つかった場合は、テーブルを分割して独立した主キーを持つ設計に変更されることがあります。
正規化と複合キーの関係を理解することで、冗長性のないクリーンなデータベース設計が実現できます。
複合キー使用時のパフォーマンスへの影響
複合キーはインデックスとしても機能しますが、列の順序がクエリのパフォーマンスに影響します。
複合インデックスは先頭の列から順に効果を発揮するため、最も絞り込み効果の高い列を先頭に配置することが検索効率の向上につながります。
| 観点 | 複合キーのメリット | 複合キーのデメリット |
|---|---|---|
| 一意性 | 自然なデータの組み合わせで識別可能 | 設計が複雑になる |
| 外部参照 | 業務的な意味を持つ参照が可能 | 複数列の管理が必要 |
| 正規化 | 中間テーブルの設計に適している | 部分関数従属に注意が必要 |
| パフォーマンス | 列の組み合わせで絞り込み可能 | 列順序の設計が重要 |
まとめ
本記事では、複合キーの定義・役割・設定方法・正規化との関係について解説しました。
複合キーは2つ以上の列を組み合わせてテーブル行を一意に識別するキーであり、多対多の中間テーブルや業務的な組み合わせを識別子とする設計で活躍します。
正規化の観点からも複合キーの扱いを正しく理解し、適切なテーブル設計と一意性の管理を実現することがデータベース品質向上の基盤となります。
SQL構文による設定方法もあわせて習得し、実践的なデータベース設計に役立てていきましょう。