戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2018年 午前202


問題文

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

選択肢

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対多/多対多それぞれの外部キー配置や表の作り方」だと把握する。
  2. 各関係に対する基本ルールを思い出す:
    • 1対多:多側に多対1の参照(多側に外部キー)
    • 1対1:どちらか一方に外部キーを置ける(ただし一意性を保証する)
    • 多対多:中間(結合)テーブルを作り、両方の外部キーを持たせる
  3. 選択肢をルールに照らして検証する。特に「外部キーを置くだけで一意性が自動的に保たれるか」を見落とさない。
  4. 最終的に、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 制約を付けるなどして整合性を保つ必要があり、通常は片側に外部キー(かつ一意性を保証)を置く設計が推奨されます。
Q: 多対多の中間表に追加属性(例えば関係を表す日時や状態)を持たせてもよいか?
A: はい。中間表は単なる関連付けだけでなく、関係に関する属性(登録日、役割、状態など)を持たせる設計が一般的です。
Q: 外部キーをNULLにできる場合、どのように解釈すべきか?
A: NULL許容の外部キーは「該当する関連が存在しない(任意)」ことを表します。設計上、オプションな関係を表す際に使われます。NULLを許さない(NOT NULL)と必須の関係を強制できます。

関連キーワード: 外部キー、主キー、UNIQUE制約、参照整合性、1対1、1対多、多対多、中間表、正規化、外部キー配置、結合テーブル
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について