応用情報技術者試験 令和2年秋 午前問28 解説付き過去問
問題
関係"注文記録"の属性間に①~⑥の関数従属性があり、それに基づいて第3正規形まで正規化を行って、"商品","顧客","注文","注文明細"の各関係に分解した。
関係"注文明細"として、適切なものはどれか。
ここで、{X,Y} は、属性XとYの組みを表し、X→Yは、XがYを関数的に決定することを表す。
また、実線の下線は主キーを表す。
注文記録(注文番号、注文日、顧客番号、顧客名、商品番号、商品名、数量、販売単価)
[関数従属性]
①注文番号 → 注文日
②注文番号 → 顧客番号
③顧客番号 → 顧客名
④{注文番号、商品番号} → 数量
⑤{注文番号、商品番号} → 販売単価
⑥商品番号 → 商品名
注文記録(注文番号、注文日、顧客番号、顧客名、商品番号、商品名、数量、販売単価)
[関数従属性]
①注文番号 → 注文日
②注文番号 → 顧客番号
③顧客番号 → 顧客名
④{注文番号、商品番号} → 数量
⑤{注文番号、商品番号} → 販売単価
⑥商品番号 → 商品名
正解
解説
この問題は、与えられた関係と関数従属性に基づき、第3正規形まで正規化を行ったうえで、「注文明細」として適切な属性の組合せを選ぶものです。
- 関数従属性の読み取り
関係「注文記録」には以下の関数従属性があります。
① 注文番号 → 注文日
② 注文番号 → 顧客番号
③ 顧客番号 → 顧客名
④ {注文番号, 商品番号} → 数量
⑤ {注文番号, 商品番号} → 販売単価
⑥ 商品番号 → 商品名
これらを分析すると、注文番号と商品番号の組(複合キー)で数量や販売単価が一意に決まることが分かります。 - 第1〜第3正規形への分解
第1正規形では、繰り返しを含まないリレーションであることが前提となっており、本問はすでにその条件を満たしています。
第2正規形では、複合主キーの一部にのみ依存する属性(部分関数従属性)を切り離します:
・注文番号 → 注文日、顧客番号
・顧客番号 → 顧客名(推移的関数従属性)
・商品番号 → 商品名
これにより、関係は「注文」「顧客」「商品」「注文明細」に分割されます。 - 「注文明細」表の定義
「注文明細」は、1件の注文の中に含まれる各商品とその数量・単価を管理する表です。数量と販売単価は、注文番号と商品番号の組によって一意に決定されるため、主キーはこの2つの複合キーになります。
顧客情報や商品名などは他の表に移しているため、ここには含めません。
したがって、「注文明細(注文番号, 商品番号, 数量, 販売単価)」が正しく、第3正規形に適合した関係となります。