DBデータベーススペシャリスト試験 午前Ⅱ

平成30年度春期 データベーススペシャリスト 午前Ⅱ 問2

問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。

問題

関係データベースの表を設計する過程で,A表とB表が抽出された。主キーはそれぞれ列aと列bである。この二つの表の対応関係を実装する表の設計に関する記述のうち,適切なものはどれか。
図。表構造を示す図。左の表Aは先頭列aに下線があり主キーであることを示し、その右に空欄の列がある。右の表Bは先頭列bに下線があり主キーであることを示し、その右に空欄の列がある。二つの表の間に関連線はない。
図。表構造を示す図。左の表Aは先頭列aに下線があり主キーであることを示し、その右に空欄の列がある。右の表Bは先頭列bに下線があり主キーであることを示し、その右に空欄の列がある。二つの表の間に関連線はない。

選択肢

  1. ア
    A表とB表の対応関係が1対1の場合,列aをB表に追加して外部キーとしてもよいし,列bをA表に追加して外部キーとしてもよい。
  2. イ
    A表とB表の対応関係が1対多の場合,列bをA表に追加して外部キーとする。
  3. ウ
    A表とB表の対応関係が多対多の場合,新しい表を作成し,その表に列aか列bのどちらかを外部キーとして設定する。
  4. エ
    A表とB表の対応関係が多対多の場合,列aをB表に,列bをA表にそれぞれ追加して外部キーとする。
解き方のヒントを見る

対応関係の多重度を両側から確認

二つの表の対応を実装する設計では、一方の行が他方の何行と結び付くかを両方向から確かめることが出発点になります。その対応の数え方を問題の条件から読み取り、考えられる表の構成で矛盾や重複が生じないかを落ち着いて照らし合わせましょう。

この問題で問われていること

この問題で絞り込む観点は「対応の多重度」です。業務上のルールとして、片方の表の一行に対して相手側の行がいくつまで対応し得るのかを、逆方向も含めて言葉で書き出してから判断に進むと整理しやすくなります。

視点

表同士の結び付きは、ある表の列が相手の表の行を参照することで表現されます。ただし、どのような構成がふさわしいかは、対応が各方向でそれぞれ一つなのか複数なのかという条件に左右されます。まずその条件を正確に言語化してください。そのうえで、一つの欄に複数の値を詰め込む必要が出ないか、同じ事実を何度も記録することにならないかを確認する姿勢が大切です。

確認ポイント

  • 一方の表の一行から見て、相手側の表に対応する行が最大いくつになり得るかを条件から読み取ったか
  • 逆方向から見た場合の対応数も同じように確認し、両方向の条件をそろえて把握したか
  • 把握した対応数の条件のもとで、一つの欄に複数の値を入れる必要や同じ事実の重複記録が生じないかを確かめたか
正解と解説を見る

正解

ア

解説

1対1の関係では、どちらの表の1行も相手の1行としか対応しないため、列aをB表に置いても列bをA表に置いても、外部キー1つで対応関係を表せます。したがって正解はアです。

理由

1対1では、A表の1行に対応するB表の行は多くても1行で、逆も同じです。そのため列aをB表に外部キーとして追加しても、列bをA表に追加しても、各行が持つ参照値は1つで済みます。どちらの配置でも関係を正しく表せるので、アが適切です。

比較

1対多では、「多」側の表に「1」側の主キーを外部キーとして持たせます。A表とB表が1対多ならB表に列aを追加するのが正しく、イは向きが逆です。多対多では新しい表(連関表)を作り、その表に列aと列bの両方を外部キーとして持たせます。通常は{a、 b}を主キーにします。片方だけを持たせるウや、互いの表に追加するエでは、対応関係を表現できません。

選択肢ア(正解)

これは正解だよ。1対1の対応では、A表の1行に対応するB表の行は多くても1行で、逆も同じだよ。だから列aをB表に外部キーとして持たせても、列bをA表に持たせても、各行が持つ参照値は1つで済み、対応関係を表現できる。どちらに置くかは、対応が必須かどうかや検索のしやすさで決めればいいんだ。

選択肢イ

これは不正解だよ。A表とB表が1対多なら、A表の1行にB表の複数行が対応するよ。列bをA表に追加すると、A表の1行に複数のbの値を入れる必要が出てきて、第1正規形に反するか、行の重複を招いてしまう。正しくは「多」側のB表に、「1」側の主キーである列aを外部キーとして追加するんだ。

選択肢ウ

これは不正解だよ。多対多を実装するために新しい表(連関表)を作る点は正しいよ。でも、その表には列aと列bの両方を外部キーとして持たせ、通常は{a, b}を主キーにする必要があるんだ。どちらか一方だけでは、どのA表の行とどのB表の行が対応するのかを表せないよ。

選択肢エ

これは不正解だよ。多対多では、A表の1行に複数のB表の行が対応し、B表の1行にも複数のA表の行が対応するよ。列aをB表に、列bをA表に追加しても、1行に複数の参照値を入れる必要があるので、繰返し項目や冗長な重複行が生じてしまう。新しい表を作り、その表に列aと列bの両方を外部キーとして持たせるのが適切だよ。

学習のポイント

多重度ごとの外部キーの配置と、多対多の関係を連関表で実装する方法

出典:独立行政法人 情報処理推進機構(IPA)平成30年度春期 データベーススペシャリスト試験 午前Ⅱ 問2(公式資料:問題冊子(PDF) / 解答例)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針