IPA過去問ドリル

平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11

テクノロジ/データベース

PCへのメモリカードの取付け状態を管理するデータモデルを作成した。1台のPCは,スロット番号によって識別されるメモリカードスロットを二つ備える。“取付け”表を定義するSQL文のaに入る適切な制約はどれか。ここで,モデルの表記にはUMLを用いる。 〔データモデルの概要〕 PC(PCID)と“取付け”(スロット番号)は多重度1対0..2で関連付けられ,“取付け”(スロット番号)とメモリカード(メモリカードID)は多重度0..1対1で関連付けられる(1台のPCに対し取付けは0~2件,1件の取付けに対応するメモリカードは0~1件)。 〔SQL文〕 CREATE TABLE 取付け ( PCID INTEGER NOT NULL FOREIGN KEY REFERENCES PC(PCID), スロット番号 INTEGER NOT NULL, メモリカードID INTEGER NOT NULL FOREIGN KEY REFERENCES メモリカード(メモリカードID), [ a ] CHECK(スロット番号 IN (1,2)) ) (注:本サイトでは原問題の図を文字表記に変換しています)

出典:平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11

正解:ウ

解説

モデルでは,PC(1)と“取付け”(0..2)が対応し,“取付け”(0..1)とメモリカード(1)が対応します。1台のPCに対して“取付け”は最大2件(スロット番号1と2)まで存在し得るため,“取付け”表の主キーはPCIDとスロット番号の組(PRIMARY KEY(PCID,スロット番号))になります。また,1件の“取付け”に対応するメモリカードは0~1件(一つのメモリカードは高々一つの取付けにしか対応しない)であるため,メモリカードIDが同一の取付け行に重複して現れないよう,UNIQUE(メモリカードID)制約を追加する必要があります。

選択肢ごとの解説

  • 誤り。主キーをPRIMARY KEY(PCID,スロット番号)とするだけでは,同じメモリカードIDが複数の(PCID,スロット番号)の組に重複して登録されることを防げず,一つのメモリカードが複数のスロットに同時に取り付けられているという矛盾したデータを許してしまいます。
  • 誤り。メモリカードIDまで主キーに含めると,同一のPCID・スロット番号の組に対して異なるメモリカードIDを持つ行が複数存在できてしまい,1台のPCの各スロットには高々1枚のメモリカードしか取り付けられないという制約を表現できません。
  • 正しい。PRIMARY KEY(PCID,スロット番号)によって1台のPCの各スロットには高々1件の取付けしか存在しないことを保証し,UNIQUE(メモリカードID)によって1枚のメモリカードは高々一つの取付けにしか対応しない(同じカードが複数のスロットに重複して取り付けられない)ことを保証できます。
  • 誤り。PRIMARY KEY(スロット番号,メモリカードID)とすると,異なるPCの取付けであっても同じスロット番号・メモリカードIDの組を許さないことになってしまい,本来PCごとに独立しているはずのスロット番号の一意性の範囲が誤っています。また,UNIQUE(PCID)では1台のPCにつき取付けが1件しか許されなくなり,スロットを二つ備えるという前提と矛盾します。
データベーススペシャリストの過去問を演習モードで解く