データベーススペシャリスト 2018年 午前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表にそれぞれ追加して外部キーとする。
🔒 解説は解答すると表示されます
表間関係の実装方式【午前2解説】
正解の理由
設問の正解は、1対1の対応関係を実装する場合に、A表の主キー列aをB表に外部キーとして追加してもよいし、逆にB表の主キー列bをA表に外部キーとして追加してもよい、という記述(ア)です。理由は次の通りです。
- 1対1の関係は、論理的にはどちらの表のレコードが対応するかが一対一で決まるため、参照側に相手表の主キーを外部キーとして持たせることで関係を表現できます。どちら側に外部キーを置くかは設計上の都合(NULL許容、オプション性、アクセス頻度など)で決められます。
- ただし、外部キーを単に追加するだけでは一意性は自動的に保証されません。1対1を厳密に保証するには、外部キー列に対して UNIQUE 制約を付けるか、外部キー列自体を主キーにするなどして一意性を確保する必要があります。これにより「1」の側に複数の「1」側参照が生じることを防げます。
- その他の選択肢は、1対多や多対多の実装ルールと合致しないため誤りです(後述)。
以上から、1対1の表現方法として「どちらの表に外部キーを置いてもよい」という記述を含む ア が適切です(ただし一意性確保のための制約設定が前提となります)。
解法ステップ
- 問題が問うのが「1対1/1対多/多対多それぞれの外部キー配置や表の作り方」だと把握する。
- 各関係に対する基本ルールを思い出す:
- 1対多:多側に多対1の参照(多側に外部キー)
- 1対1:どちらか一方に外部キーを置ける(ただし一意性を保証する)
- 多対多:中間(結合)テーブルを作り、両方の外部キーを持たせる
- 選択肢をルールに照らして検証する。特に「外部キーを置くだけで一意性が自動的に保たれるか」を見落とさない。
- 最終的に、1対1についての記述が正しいものを選び、他の選択肢はルール違反や不完全さで除外する。
選択肢別の誤答解説
-
ア(正解): 1対1の場合、列aをB表に追加して外部キーにしてもよいし、列bをA表に追加してもよい、という点は正しい。ただし重要な補足として、外部キー列に UNIQUE 制約を付与するか、外部キーを主キーにするなどして一意性を明示的に保証する必要があります。NULL許容により「0対1」のような設計も可能です。
-
イ(誤り): 「1対多の場合、列bをA表に追加して外部キーとする」は誤りです。1対多(A:1 — B:N)のときは「多」側(B)に「1」側(A)の主キーを参照する外部キーを置きます。多側に外部キーを置くことで、複数のBが同じAを参照できる設計になります。Aに列bを置くと、A側にBの主キーを持つことになり、多側の複数を参照できず不整合になります。
-
ウ(誤り): 「多対多の場合、新しい表を作成し、その表に列aか列bのどちらかを外部キーとして設定する」は不十分です。多対多を正しく表現する中間表(結合表)には、Aの主キーとBの主キーの両方を外部キーとして持たせ、通常は (a, b) の組合せを主キー(または少なくとも UNIQUE)として重複を防ぎます。片方だけでは多対多を表現できません。
-
エ(誤り): 「多対多の場合、列aをB表に、列bをA表にそれぞれ追加して外部キーとする」は誤りです。これは双方に相手の主キーを置く形で、理論上は双方に複数件の参照を許してしまい、多対多を適切に管理できません(データ冗長・整合性管理の困難・参照の重複などの問題が生じる)。多対多は中間テーブルで両者を関連付けるべきです。
よくある誤解
- 外部キーを追加すれば自動的に1対1になる:誤りです。外部キー追加だけでは同じ外部キー値を複数行が持つことが可能なため、UNIQUE 制約や主キー化で一意性を保証する必要があります。
- どちら側が外部キーを持つかは常に固定:誤りです。1対1では設計の都合でどちら側にも置けます。例えば「必ず存在する」側と「任意で存在する」側の関係なら、任意側に外部キーを置くのが自然です。
- 多対多は単に両方の表に相手のキーを追加すればよい:誤りです。中間表で両方のキーを参照する設計が正しい実装です。
補足コラム
- 中間表(結合表)の実装例:多対多の関係を表す table_AB を作成し、列 a, b をそれぞれ外部キー(A.a → table_AB.a、B.b → table_AB.b)とします。重複を防ぐには以下のいずれかを設定します。
- 複合主キー: PRIMARY KEY(a, b)
- または surrogate key(id)を主キーにしつつ UNIQUE(a, b) を設定
これにより同じ組合せの重複挿入を防げます。
- 1対1での実例:ユーザ情報A(基本情報)とユーザ追加情報B(オプション)なら、BにAの主キーを外部キーかつ主キーにして1対1(かつBはAに必ず対応しない)を表現するのがよくあるパターン。
- インデックス:外部キーに対しては検索・結合性能向上のためインデックスを張ることが推奨されます(UNIQUE 制約は暗黙のインデックスを作るDBMSが多い)。
FAQ
Q: 1対1で両方に外部キーを置くことはできるか?
A: 技術的には可能ですが冗長で管理が煩雑になります。両側に外部キーを置く場合、それぞれに UNIQUE 制約を付けるなどして整合性を保つ必要があり、通常は片側に外部キー(かつ一意性を保証)を置く設計が推奨されます。
A: 技術的には可能ですが冗長で管理が煩雑になります。両側に外部キーを置く場合、それぞれに UNIQUE 制約を付けるなどして整合性を保つ必要があり、通常は片側に外部キー(かつ一意性を保証)を置く設計が推奨されます。
Q: 多対多の中間表に追加属性(例えば関係を表す日時や状態)を持たせてもよいか?
A: はい。中間表は単なる関連付けだけでなく、関係に関する属性(登録日、役割、状態など)を持たせる設計が一般的です。
A: はい。中間表は単なる関連付けだけでなく、関係に関する属性(登録日、役割、状態など)を持たせる設計が一般的です。
Q: 外部キーをNULLにできる場合、どのように解釈すべきか?
A: NULL許容の外部キーは「該当する関連が存在しない(任意)」ことを表します。設計上、オプションな関係を表す際に使われます。NULLを許さない(NOT NULL)と必須の関係を強制できます。
A: NULL許容の外部キーは「該当する関連が存在しない(任意)」ことを表します。設計上、オプションな関係を表す際に使われます。NULLを許さない(NOT NULL)と必須の関係を強制できます。
関連キーワード: 外部キー、主キー、UNIQUE制約、参照整合性、1対1、1対多、多対多、中間表、正規化、外部キー配置、結合テーブル

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

