データベーススペシャリスト 2012年 午前2 問02
問題文
関係データベースの表を設計する過程で、A表とB表が抽出された。主キーはそれぞれ列aと列bである。この二つの表の対応関係に基づいた表の設計に関する記述のうち、適切なものはどれか。

選択肢
ア:A表とB表の対応関係が1対1の場合、列aをB表に追加して外部キーとしてもよいし、列bをA表に追加して外部キーとしてもよい。(正解)
イ:A表とB表の対応関係が1対多の場合、列bをA表に追加して外部キーとする。
ウ:A表とB表の対応関係が多対多の場合、新しい表を作成し、その表に列aか列bのどちらかを外部キーとして設定する。
エ:A表とB表の対応関係が多対多の場合、列aをB表に、列bをA表にそれぞれ追加して外部キーとする。
🔒 解説は解答すると表示されます
1対1リレーション設計【午前2解説】
正解の理由
設問の正しい選択肢は ア です。二つの表が1対1の関係にある場合、外部キー(FK)をどちらの表に持たせしてもよい設計上の選択肢となります。重要なのは「1対1(一意性)」を保証することです。外部キーを単に追加するだけでは1対1の一意性は自動的に保たれないため、参照先に対して1つしか対応しないことを保証するために、外部キー列に UNIQUE 制約を付けるか、外部キー自体を主キーにするなどの措置が必要です。これにより、どちらの表にFKを置いても1行につき最大1つの対応先しか持てないことが保証されます。
例:
- B表に A の主キー a を外部キーとして追加し、B側の列 a に UNIQUE を付与する。
- あるいは B 表の主キー自体を a にしてしまう(FK 兼 PK)。
解法ステップ
- 関係の種類(1対1、1対多、多対多)を判定する。
- 1対1なら「どちらにFKを置けるか」「一意性をどう担保するか」を考える。
- 1対多なら「多側にFKを置く(多側の表に相手の主キーを持たせる)」を適用。
- 多対多なら「中間表(結合表)を作成し、両方の主キーを外部キーとして持たせる(通常は複合主キー)」を適用。
- 最後にNULL許可・参照整合性制約(ON DELETE/UPDATE)やインデックスの有無を確認する。
選択肢別の誤答解説
-
ア: 正解。1対1ではどちらに外部キーを置いてもよいが、外部キー列に UNIQUE 制約を付けるか、外部キーを主キーにする等で一意性を明示的に保証する必要がある点を忘れないこと。
- 例SQL(B表にFKを置き、UNIQUEで一意性確保):
ALTER TABLE B ADD COLUMN a INTEGER; ALTER TABLE B ADD CONSTRAINT fk_b_a FOREIGN KEY (a) REFERENCES A(a); CREATE UNIQUE INDEX ux_b_a ON B(a); - あるいは:
-- B の主キーを a にする(FK兼PK) CREATE TABLE B ( a INTEGER PRIMARY KEY, ..., FOREIGN KEY (a) REFERENCES A(a) );
- 例SQL(B表にFKを置き、UNIQUEで一意性確保):
-
イ: 誤り。仮に「A対B が 1対多」であれば、A側が「1」、B側が「多」であることが通常の解釈です。従って多側(B)に A の主キー(a)を外部キーとして持たせるべきで、選択肢イのように列 b(B の主キー)を A に追加するのは逆であり不適切です。
-
ウ: 誤り。多対多の場合、新しい中間表(例えば AB)を作成するのは正しいが、その中間表には両方の外部キー(a と b)を持たせ、通常はそれらを合わせて主キーまたは少なくとも複合ユニーク制約を付けます。選択肢ウは「どちらか一方だけを外部キーにする」と述べており不十分です。
-
エ: 誤り。多対多を解消するために A に b を、B に a をそれぞれ入れる設計は正しくありません。これでは各表が相手の主キーを持つだけで多対多を表現できず、重複行や不整合を招きます。多対多は中間表で両側の参照を持つのが正解です。
よくある誤解
- 外部キーを設ければ自動的に1対1になる:誤り。外部キーは参照整合性(存在)を保証するが、一意性(1対1)を保証するには UNIQUE や PK 制約が必要です。
- 1対多で外部キーは「どちらでもよい」:誤り。1対多では「多側」に外部キーを置くのが正しい。逆にすると冗長・不整合の原因になります。
- 多対多を片側の外部キー追加で表現できる:誤り。多対多は中間(結合)テーブルが必要で、両側のFKを持たせるのが標準。
補足コラム
- 1対1関係でどちらにFKを置くかの判断基準:
- 頻繁に参照される側、レコードの追加削除の将来性、NULL 許容の必要性、分離して管理したい属性の所在、パフォーマンス(インデックス)などを考慮して決めます。
- 例えば「オプション情報を持つ稀なレコード」は別表にして FK を置き、NULL を許す形にするとストレージ効率が良くなる場合があります。
- 中間表の設計では、両FKに対してインデックスを張るか、複合主キーにして重複を防ぎます。また、削除/更新時の伝播(ON DELETE CASCADE 等)も仕様に応じて設定します。
FAQ
Q. 1対1で外部キーに NULL を許容してよいか?
A. 設計次第です。対応が存在しないケースがある(オプション的な関係)なら NULL を許容することがあります。ただし一意性制約を付ける場合、NULL の扱い(DBMS によって UNIQUE と NULL の挙動が異なる)を確認してください。
A. 設計次第です。対応が存在しないケースがある(オプション的な関係)なら NULL を許容することがあります。ただし一意性制約を付ける場合、NULL の扱い(DBMS によって UNIQUE と NULL の挙動が異なる)を確認してください。
Q. 外部キーを主キーにするメリットは?
A. FK を PK にすると自然に1対1が保障され、結合や検索の際の一意性が明確になります。一方でその表が独立して ID を持てない設計になる点に注意。
A. FK を PK にすると自然に1対1が保障され、結合や検索の際の一意性が明確になります。一方でその表が独立して ID を持てない設計になる点に注意。
Q. パフォーマンス面の注意点は?
A. FK 列に対しては検索や結合性能向上のためインデックスを付与することが多いです。UNIQUE 制約はインデックスを伴うため、検索性能も向上します。
A. FK 列に対しては検索や結合性能向上のためインデックスを付与することが多いです。UNIQUE 制約はインデックスを伴うため、検索性能も向上します。
関連キーワード: 外部キー、UNIQUE制約、一意性保証、1対1関係、1対多関係、多対多関係、中間表、参照整合性、ON DELETE、複合主キー

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

