平成29年度 春期 午前Ⅱ 問11
データ操作
主キーに関する問題
PCへのメモリカードの取付け状態を管理するデータモデルを作成した。1台のPCは,スロット番号によって識別されるメモリカードスロットを二つ備える。“取付け”表を定義するSQL文のaに入る適切な制約はどれか。ここで,モデルの表記にはUMLを用いる。
データモデル:
[PC]PCID 1 ──── 0..2 [取付け]スロット番号 0..1 ──── 1 [メモリカード]メモリカードID
〔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))
)- アPRIMARY KEY(PCID,スロット番号),
- イPRIMARY KEY(PCID,スロット番号,メモリカードID),
- ウPRIMARY KEY(PCID,スロット番号), UNIQUE(メモリカードID),
- エPRIMARY KEY(スロット番号,メモリカードID), UNIQUE(PCID),
答えと解説を見る
✓ これが正解ウPRIMARY KEY(PCID,スロット番号), UNIQUE(メモリカードID),
解説
スロットを主キーにし、メモリカードIDに一意性制約を付けます。
見分ける軸は、モデルの多重度をどの制約で表すかです。取付けは、PCとスロット番号の組で一つに決まります。1台のPCにはスロットが二つあり、スロット番号はCHECK制約で1か2に限っています。そのため、主キーをPCIDとスロット番号の組にすれば、同じスロットに2枚を登録することを防げます。一方、メモリカードから見た取付けの多重度は0..1で、1枚のメモリカードは高々一つのスロットにしか取り付けられません。これを表すには、メモリカードIDに一意性制約が必要です。主キーとUNIQUEの両方を備えた組合せが、モデルの意味をすべて表しています。多重度の1側ごとに、一意にすべき列を書き出すのが見分け方です。
ほかの選択肢はなぜ違うのか
- アPRIMARY KEY(PCID,スロッ…:PCとスロット番号の組で一意になるので、同じスロットへの二重登録は防げます。しかし、メモリカードIDに一意性の制約がないため、同じ1枚を別のPCや別のスロットにも登録できてしまいます。
- イPRIMARY KEY(PCID,スロッ…:3列の組を主キーにすると、同じPCの同じスロットに、異なるメモリカードIDの行を何行でも登録できます。同じメモリカードを複数のスロットに登録することも防げません。
- エPRIMARY KEY(スロット番号,メ…:PCIDに一意性制約を付けると、1台のPCにつき取付けの行は1行しか持てません。スロットを二つ備え、0..2枚を取り付けられるというモデルの多重度と食い違います。
出典:平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)