関係"注文記録"の属性間に①〜⑥の関数従属性があり,それに基づいて第3正規形まで正規化を行って,"商品","顧客","注文","注文明細"の各関係に分解した。
関係"注文明細"として,適切なものはどれか。
ここで,{X,Y}は,属性XとYの組みを表し,X→Yは,XがYを関数的に決定することを表す。
また,(主キー)を付けた項目は主キーを表す。
注文記録(注文番号,注文日,顧客番号,顧客名,商品番号,商品名,数量,販売単価)
〔関数従属性〕
① 注文番号 → 注文日 ② 注文番号 → 顧客番号
③ 顧客番号 → 顧客名 ④ {注文番号,商品番号} → 数量
⑤ {注文番号,商品番号} → 販売単価 ⑥ 商品番号 → 商品名
正答4
解説
正解は4です。
関数従属性をもとに第3正規形まで正規化し、"注文明細"の関係を求める問題です。
各属性が、どの属性の組によって一意に決まるかを確認して分解します。
注文日と顧客番号は、注文番号だけで決まります(①②)。
顧客名は顧客番号で決まり(③)、商品名は商品番号で決まります(⑥)。
数量と販売単価は、注文番号と商品番号の組で決まります(④⑤)。
したがって、4つの関係は次のようになります。
商品(商品番号、商品名)、顧客(顧客番号、顧客名)です。
注文(注文番号、注文日、顧客番号)、注文明細(注文番号、商品番号、数量、販売単価)です。
注文明細の主キーは、注文番号と商品番号の組です。
【選択肢別解説】
1:× 商品番号が含まれていません。
数量と販売単価は注文番号と商品番号の組で決まるので、注文番号だけでは同じ注文の中の商品を区別できません。
2:× 顧客番号は注文番号だけで決まる属性なので、"注文"に置くべきです。
また、商品番号がないため数量と販売単価を一意に決められません。
3:× 顧客番号と顧客名を含んでいます。
顧客名は顧客番号を介して推移的に決まるので、第3正規形では"顧客"に分ける必要があります。
4:○ 主キーである注文番号と商品番号の組と、その組で決まる数量と販売単価だけから成ります。
部分関数従属も推移的関数従属もないので第3正規形です。
【ポイント】
第2正規形では主キーの一部だけで決まる属性(部分関数従属)を、第3正規形では主キー以外の属性で決まる属性(推移的関数従属)を別の関係に分けます。
明細系の表では、「伝票の番号」と「商品の番号」の組が主キーになるのが典型です。