関係“注文記録”の属性間に①~⑥の関数従属性があり,それに基づいて第3正規形まで正規化を行って,“商品”,“顧客”,“注文”,“注文明細”の各関係に分解した。
関係“注文明細”として,適切なものはどれか。
ここで,〔X,Y〕は,属性XとYの組みを表し,X→Yは,XがYを関数的に決定することを表す。
また,実線の下線は主キーを表す(本文中では*で囲んで示す)。
注文記録(注文番号,注文日,顧客番号,顧客名,商品番号,商品名,数量,販売単価)
〔関数従属性〕
①注文番号→注文日 ②注文番号→顧客番号
③顧客番号→顧客名 ④〔注文番号,商品番号〕→数量
⑤〔注文番号,商品番号〕→販売単価 ⑥商品番号→商品名
正答3
解説
正解は3です。
第3正規形では、すべての非キー属性が主キー全体に完全関数従属し、推移的関数従属がない状態にします。
関数従属性④と⑤より、数量と販売単価は〔注文番号,商品番号〕の組みによって決まります。
この組みを主キーとし、数量と販売単価をもつ関係が注文明細になります。
【選択肢別解説】
1:× 顧客番号は注文番号だけで決まり(②)、顧客名は顧客番号で決まります(③)。
これらを含めると部分関数従属や推移的関数従属が残るので、第3正規形になりません。
2:× 数量と販売単価は、注文番号と顧客番号の組みでは決まりません。
商品番号がないと、どの商品の数量かを特定できないので誤りです。
3:○ 主キー〔注文番号,商品番号〕に対して、数量と販売単価が完全関数従属しています。
部分関数従属も推移的関数従属もないので、第3正規形の注文明細として適切です。
4:× 注文番号だけでは、1件の注文に含まれる複数の商品を区別できません。
数量と販売単価は商品番号との組みで決まるので、主キーに商品番号が必要です。
【ポイント】
分解後の関係は、商品(商品番号、商品名)、顧客(顧客番号、顧客名)、注文(注文番号、注文日、顧客番号)、注文明細(注文番号、商品番号、数量、販売単価)です。
関数従属性の決定する側の属性ごとに関係を作ると、正規化の結果を素早く求められます。