データベーススペシャリスト 2024年 午前2 問05
問題文
あるエンティティを関係データベース上に実装しようとしたとき、その主キーが多くの属性から構成される複合キーとなることが分かった。主キーとして扱う属性を少なくして扱いやすくしたい。この対応として、適切なものはどれか。
選択肢
ア:複合キーを構成する属性のうち、エンティティの性格を最もよく表している一つの属性を主キーとし、残りの属性を外部キー(foreign key)にする。
イ:複合キーを構成する属性のうち、エンティティの性格を最もよく表している一つの属性を主キーとし、残りの属性を代替キー(alternate key)とする。
ウ:連番などを値としてとる列を新たに設けて主キーとし、複合キーの代理キー(surrogate key)とする。(正解)
エ:連番などを値としてとる列を新たに設けて主キーとし、複合キーを外部キー(foreign key)にする。
🔒 解説は解答すると表示されます
代理キー導入【午前2解説】
正解の理由
複合キーが多属性で扱いにくい場合、システム側で新たに一意の単一列(例:連番、UUID)を追加して主キーにする方法が実務的で扱いやすいため、選択肢ウが適切です。こうした新設列は代理キー(surrogate key)と呼ばれ、内部識別子として各行を単一の列で一意に識別します。元の複合キーをそのまま捨てるのではなく、必要であれば代替キー(alternate key)やユニーク制約として保持し、業務上の一意性や検索に使えるようにします。これにより、参照整合性や結合の単純化、アプリ実装や拡張性の向上といった利点が得られます。
解法ステップ
- 複合キーの属性群が業務的に「自然キー(natural key)」として必須かを判断する(外部との参照・一意性要件の有無)。
- 取り扱いが困難であれば、連番やUUID等の新しい単一列を追加して主キー(代理キー)とする(CREATE TABLE における ID 列の追加)。
- 元の複合キーが一意性を保証すべきなら、UNIQUE 制約や代替キーとして保持する(DROP しない)。
- 参照テーブルは可能なら代理キーを参照するように変更し、移行時はデータ整合性を保つためにマッピングを行う。
- インデックスやクエリ性能を考慮し、必要に応じて元の自然キー属性に対してインデックスを張る。
例:SQL(新しい代理キーと複合キーのユニーク制約)
CREATE TABLE 商品 (
商品ID BIGINT AUTO_INCREMENT PRIMARY KEY, -- 代理キー
メーカーコード VARCHAR(10) NOT NULL,
商品コード VARCHAR(20) NOT NULL,
商品名 VARCHAR(100),
-- 元の複合キーの一意性を維持
UNIQUE (メーカーコード, 商品コード)
);
選択肢別の誤答解説
- ア: 複合キーの残り属性を「外部キー」にする案は不適切です。外部キーは通常、他テーブルの主キー(または別の候補キー)を参照するための参照制約であり、同一エンティティ内の単に属性を分離して外部キーにするという意味にならない(自己参照の外部キーは可能だが、本問の趣旨には合致しない)。したがって属性の性格説明だけで残りを外部キーにするのは誤りです。
- イ: 「一つを主キー、残りを代替キーにする」という案は、多くの場合成立しません。代替キー(alternate key)は“別に一意性を持つ候補”を指しますが、複合キーの残り属性群が単独で一意性を保証しないなら代替キーにはなりません。つまり、単一属性で一意にならない場合は代替キーにできない点が問題です。
- ウ: 新たに連番等の列を設けて主キーとする案は、実務上もっとも扱いやすく汎用性が高い。元の属性群は必要に応じて代替キーやユニーク制約として残す点を忘れないこと。
- エ: 代理キーは設けるが「複合キーを外部キーにする」案は不適切です。外部キーは他テーブル(あるいは意図的な自己参照先)の主キーを参照するためのものであり、単に自身の元の属性群を外部キーにするという設計は意味をなさない。複合属性群は内部的には代替キーやユニーク制約として扱うべきです。
よくある誤解
- 代理キーを導入すれば元の自然キーの一意性チェックは不要になる、という誤解。業務的に自然キーの一意性が要求される場合は、代理キー導入後もUNIQUE制約などで一意性を保持すべきです。
- 外部キーは「必ず別テーブルを参照しなければならない」との誤認。自己参照(同一テーブルを参照する外部キー)は可能だが、本設問の目的(複合キー簡素化)には通常関係しない、という点を混同しやすいです。
- 代理キーだけで全て解決すると思い込むこと。代理キーは識別の便利さを提供するが、検索性や業務上の意味(自然キーによる検索や検証)は別途考慮しインデックスや制約で補う必要があります。
補足コラム
- 代理キーを採る利点:テーブル結合が単一列で済み実装が簡潔、主キーの幅が狭いことでインデックスや外部テーブルの参照が効率化される、主キー変更の影響が少ない。
- 欠点:代理キーは業務的意味を持たないため、業務での一意性検査やデータ重複の検出は自然キー側で行う必要がある。ログや外部連携で自然キーの扱いが必要になる場合もある。
- 運用上の勧め:代理キー導入後も、元の自然キー(複合キー)に対してUNIQUE制約やインデックスを設定して、業務ルールと整合性を保つ設計が望ましい。
FAQ
Q: 代理キー導入後、元の複合キー列は完全に削除してよいですか?
A: 一般に削除は推奨されません。元の複合キーが業務で意味を持つなら、検索やバリデーション用に列とUNIQUE制約を残すべきです。外部連携で必要なら当然保持します。
A: 一般に削除は推奨されません。元の複合キーが業務で意味を持つなら、検索やバリデーション用に列とUNIQUE制約を残すべきです。外部連携で必要なら当然保持します。
Q: 既存の参照(子)テーブルはどう移行すればよいですか?
A: 子テーブルに代理キー列を追加し、親テーブルの対応行をJOINして代理キー値をコピー後、外部キー制約を定義します。移行中はトランザクションや一時的な参照整合性処理を慎重に行ってください。
A: 子テーブルに代理キー列を追加し、親テーブルの対応行をJOINして代理キー値をコピー後、外部キー制約を定義します。移行中はトランザクションや一時的な参照整合性処理を慎重に行ってください。
Q: 代理キーは連番とUUIDどちらが良いですか?
A: 選択は用途次第。連番は順序性と省スペース性に優れるが分散生成が難しい。UUIDは分散環境で生成しやすいがサイズが大きく索引コストが増える。負荷や設計方針で選んでください。
A: 選択は用途次第。連番は順序性と省スペース性に優れるが分散生成が難しい。UUIDは分散環境で生成しやすいがサイズが大きく索引コストが増える。負荷や設計方針で選んでください。
関連キーワード: 代理キー、代替キー、複合キー、外部キー、主キー、ユニーク制約、自然キー

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

