令和2年度 10月 午前 問28
データベース
第3正規形に関する問題
関係 "注文記録" の属性間に ①〜⑥ の関数従属性があり,それに基づいて第 3 正規形まで正規化を行って,"商品","顧客","注文","注文明細" の各関係に分解した。関係 "注文明細" として,適切なものはどれか。ここで,{X,Y}は,属性 X と Y の組みを表し,X→Y は,X が Y を関数的に決定することを表す。また,実線の下線は主キーを表す。
〔注文記録〕
注文記録(注文番号,注文日,顧客番号,顧客名,商品番号,商品名,数量,販売単価)
〔関数従属性〕
- ① 注文番号 → 注文日
- ② 注文番号 → 顧客番号
- ③ 顧客番号 → 顧客名
- ④ {注文番号,商品番号} → 数量
- ⑤ {注文番号,商品番号} → 販売単価
- ⑥ 商品番号 → 商品名
- ア注文明細(注文番号,顧客番号,商品番号,顧客名,数量,販売単価)
- イ注文明細(注文番号,顧客番号,数量,販売単価)
- ウ注文明細(注文番号,商品番号,数量,販売単価)
- エ注文明細(注文番号,数量,販売単価)
答えと解説を見る
✓ これが正解ウ注文明細(注文番号,商品番号,数量,販売単価)
解説
主キーは注文番号と商品番号の組で数量と単価だけ残します。
この設問は、関数従属性を手がかりに元の表を三つ以上に分ける正規化の途中の姿を選ばせています。ですから、選び方の軸は、注文明細に残す主キーが何で、そこに完全に依存する属性だけが残っているかという一点です。関数従属性を仕分けると、注文番号だけで決まるもの、顧客番号だけで決まるもの、商品番号だけで決まるものは、それぞれ別の表に移すのが正規化の考え方です。注文明細に残るのは、二つの番号の組でようやく値が決まる属性で、これは行を、どの注文でどの商品を、いくつ、いくらで、といった単位に切り分けた表に当たります。他の表へ移した属性を明細に持ち込むと、推移的な従属や部分的な従属を作り込むことになり、第 3 正規形の要求から外れます。
ほかの選択肢はなぜ違うのか
- ア注文明細(注文番号,顧客番号,商品番号,…:注文番号と顧客番号と商品番号を主キーに置き、顧客名までを明細に持たせています。顧客名は、主キーの一部である顧客番号だけで決まる属性なので、これは主キーの一部への部分関数従属にあたり、第 3 正規形より手前の第 2 正規形の要求から外れます。
- イ注文明細(注文番号,顧客番号,数量,販売…:注文番号と顧客番号を主キーに置いた形になっています。数量や単価は注文番号と商品番号の組で決まる属性であり、商品番号を主キーに含めない明細では、その関数従属性を捉えきれません。
- エ注文明細(注文番号,数量,販売単価):主キーが注文番号だけになっています。一つの注文で複数の商品を扱う関係を、注文番号だけで一意に決めることはできず、数量や単価を持つ明細としては行を切り分けられません。
出典:令和2年度 10月 応用情報技術者試験 午前 問28
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)