応用情報技術者 2020年 秋期 午前2 問28
問題文
関係 “注文記録”の属性間に①〜⑥の関数従属性があり、それに基づいて第3正規形まで正規化を行って、“商品”、“顧客”、“注文”、“注文明細”の各関係に分解した。関係“注文明細” として、適切なものはどれか。ここで、{X, Y) は、属性XとYの組みを表し、X→Yは、XがYを関数的に決定することを表す。また、実線の下線は主キーを表す。
注文記録 (注文番号、注文日、顧客番号、顧客名、商品番号、商品名、数量、販売単価)
〔関数従属性〕
① 注文番号 → 注文日 ② 注文番号 → 顧客番号
③ 顧客番号 → 顧客名 ④ {注文番号、商品番号} → 数量
⑤(注文番号、商品番号)→ 販売単価 ⑥ 商品番号 → 商品名
選択肢
ア:注文明細(注文番号、 顧客番号、 商品番号、 顧客名、 数量、 販売単価)
イ:注文明細(注文番号、 顧客番号、 数量、 販売単価)
ウ:注文明細(注文番号、 商品番号、 数量、 販売単価)(正解)
エ:注文明細(注文番号、 数量、 販売単価)
注文明細の正規化と第3正規形【午前2 解説】
要点まとめ
- 結論:注文明細は「注文番号」と「商品番号」の複合主キーで数量と販売単価を管理する関係が適切です。
- 根拠:関数従属性から、{注文番号、商品番号}→数量・販売単価が成り立ち、これが主キーとなるためです。
- 差がつくポイント:主キーに含まれない属性の関数従属性を見落とさず、部分関数従属や推移的関数従属を排除することが重要です。
正解の理由
選択肢ウは、注文明細の主キーを「注文番号」と「商品番号」の複合キーとし、数量と販売単価を属性として持っています。
これは関数従属性④⑤に合致し、部分関数従属や推移的関数従属がなく第3正規形を満たします。
一方、顧客番号や顧客名は注文に関する情報であり、注文明細には含めず別関係に分離すべきです。
これは関数従属性④⑤に合致し、部分関数従属や推移的関数従属がなく第3正規形を満たします。
一方、顧客番号や顧客名は注文に関する情報であり、注文明細には含めず別関係に分離すべきです。
よくある誤解
顧客番号や顧客名を注文明細に含めると、冗長性が生じて更新異常の原因になります。
また、主キーの一部だけで決まる属性を含めると第2正規形を満たせません。
また、主キーの一部だけで決まる属性を含めると第2正規形を満たせません。
解法ステップ
- 関数従属性を整理し、主キーを特定する(注文番号、商品番号の複合キー)。
- 部分関数従属を排除し、数量・販売単価を主キーに従属させる。
- 推移的関数従属を排除し、顧客情報や商品名は別関係に分離。
- 第3正規形を満たす関係に分解し、注文明細の属性を決定。
選択肢別の誤答解説
- ア:顧客名を含むため推移的関数従属が残り第3正規形を満たさない。
- イ:顧客番号を含むが、商品番号が抜けており主キーとして不完全。
- ウ:正解。主キーと属性の関係が正しく第3正規形を満たす。
- エ:商品番号が抜けており、主キーとして不完全で数量・販売単価の決定ができない。
補足コラム
第3正規形は「非キー属性が主キーに対して直接的に関数従属し、かつ推移的関数従属がない」状態を指します。
これによりデータの冗長性が減り、更新・削除・挿入時の異常を防止できます。
関数従属性の理解は正規化の基本であり、試験対策に必須の知識です。
これによりデータの冗長性が減り、更新・削除・挿入時の異常を防止できます。
関数従属性の理解は正規化の基本であり、試験対策に必須の知識です。
FAQ
Q: なぜ顧客名は注文明細に含めてはいけないのですか?
A: 顧客名は顧客番号に依存し、注文番号・商品番号の主キーには依存しないため推移的関数従属となり、正規化の観点で分離が必要です。
A: 顧客名は顧客番号に依存し、注文番号・商品番号の主キーには依存しないため推移的関数従属となり、正規化の観点で分離が必要です。
Q: 複合主キーとは何ですか?
A: 複数の属性を組み合わせて一意にレコードを特定する主キーのことです。今回の注文明細では注文番号と商品番号の組み合わせが該当します。
A: 複数の属性を組み合わせて一意にレコードを特定する主キーのことです。今回の注文明細では注文番号と商品番号の組み合わせが該当します。
関連キーワード: 正規化、第3正規形、関数従属性、複合主キー、データベース設計

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

