基本情報技術者 2015年 秋期 午前(科目A) 問27
問題文
関係“注文記録”の属性間に①の関数従属性があり、それに基づいて第3正規形まで正規化を行って、“商品”、“顧客”、“注文”、“注文明細”の各関係に分解した。関係“注文明細”として、適切なものはどれか。ここで、は、属性XとYの組みを表し、は、がを関数的に決定することを表す。また、実線の下線は主キーを表す。
注文記録(注文番号, 注文日, 顧客番号, 顧客名, 商品番号, 商品名, 数量, 販売単価)
〔関数従属性〕
① 注文番号 → 注文日
② 注文番号 → 顧客番号
③ 顧客番号 → 顧客名
④ {注文番号, 商品番号} → 数量
⑤ {注文番号, 商品番号} → 販売単価
⑥ 商品番号 → 商品名
選択肢
ア:注文明細(注文番号, 数量, 販売単価)
イ:注文明細(注文番号, 顧客番号, 数量, 販売単価)
ウ:注文明細(注文番号, 顧客番号, 商品番号, 顧客名, 数量, 販売単価)
エ:注文明細(注文番号, 商品番号, 数量, 販売単価)(正解)
🔒 解説は解答すると表示されます
注文明細の属性構成【午前解説】
正解の理由
与えられた関数従属性から、注文ごとの明細行は「注文番号+商品番号」の複合キーで一意に識別され、数量と販売単価はその複合キーに従属します(④、⑤)。また、商品名は商品番号に従属(⑥)、顧客名は顧客番号に従属(③)、注文日・顧客番号は注文番号に従属(①、②)します。したがって、注文明細にはキーとなる注文番号と商品番号、およびそのキーに従属する数量・販売単価を含めるのが第3正規形の要請に合致します。これに該当する選択肢が エ です。
解法ステップ
- 関数従属性を整理する(①〜⑥を把握)。
- 候補キーを求める。
- {注文番号, 商品番号}+ を計算すると、注文日(①)、顧客番号(②)、顧客名(③)、商品名(⑥)、数量・販売単価(④、⑤)をすべて導出できるため、{注文番号, 商品番号} は関係全体の候補キーになる。
- よって注文明細行の一意性は {注文番号, 商品番号} によって保証される。
- 正規化の観点で分解する。
- 注文に固有の属性(注文日、顧客番号)は注文テーブルへ分離する(部分従属性の除去)。
- 顧客番号→顧客名や商品番号→商品名のような従属性は別テーブルへ分離する(推移従属性の除去)。
- 注文明細には複合キーと、そのキーに完全従属する属性(数量、販売単価)だけを残す。
(候補キーの閉包例)
選択肢別の誤答解説
-
ア: 注文明細(注文番号, 数量, 販売単価)
- 誤り。注文番号のみでは複数商品の存在を区別できないため、数量や販売単価は一意に決定できない(部分キー不足)。よって識別子が不十分であり正規化の観点でも不適切。
-
イ: 注文明細(注文番号, 顧客番号, 数量, 販売単価)
- 誤り。顧客番号は注文番号から導出可能(②)であり注文明細に含めるべきではない。また商品番号が欠けているため明細行を一意に識別できない。
-
ウ: 注文明細(注文番号, 顧客番号, 商品番号, 顧客名, 数量, 販売単価)
- 誤り。顧客名は顧客番号に従属(③)であり注文明細に保持すると冗長で推移的従属性を生む。第3正規形の目的に反する。さらに顧客関連属性は注文/顧客テーブルへ分離すべきである。
-
エ: 注文明細(注文番号, 商品番号, 数量, 販売単価)
- 正しい。{注文番号, 商品番号} が明細行の候補キーであり、数量と販売単価はそのキーに完全従属するため第3正規形に合致する。したがって選択肢は エ が適切。
よくある誤解
- 「注文明細の主キーは注文番号だけ」と考える誤り
- 注文1件に複数の商品があるため、明細の主キーは通常 {注文番号, 商品番号} の複合キーになる点を忘れないこと。
- 顧客情報を「まとめる/分離する」で混同する誤り
- 顧客番号と顧客名は顧客テーブルに分離し、注文テーブルには顧客番号のみを保持する。顧客名を注文明細へ残すと冗長性と更新異常を招く。
- 商品名や顧客名を明細に残しておけば便利、という発想
- 実務上は「注文時点のスナップショット」が必要な場合があるが、通常の正規化ルールでは商品名・顧客名はそれぞれの商品・顧客テーブルへ置く(ただし価格など時点情報は注文明細に保持することが多い)。
補足コラム
- 販売単価を注文明細に保持する理由
- マスターの「標準価格」が変わっても、過去の注文に記録された単価を維持したい場合があるため、販売単価は注文明細に保存する設計が一般的です。関数従属性⑤でも {注文番号, 商品番号} → 販売単価 と定義されていることからも、単価は明細レベルの属性と考えます。
- 第3正規形とBCNFの関係
- 第3正規形では「非キー属性が他の非キー属性に従属しない(推移従属性の排除)」ことを重視します。与件の分解は第3正規形に合致しており、さらに厳密にするならBCNFの観点も検討しますが、ここでは与えられた従属性からの分解で十分です。
FAQ
Q. 商品名を注文明細に含めても実務上は問題ないですか?
A. 冗長化と更新異常を招くため原則は商品テーブルへ分離します。ただし「注文時点の名称が必要」など明確な要件があれば、履歴用の列を設ける設計はあり得ます。
A. 冗長化と更新異常を招くため原則は商品テーブルへ分離します。ただし「注文時点の名称が必要」など明確な要件があれば、履歴用の列を設ける設計はあり得ます。
Q. なぜ販売単価は商品マスターにだけ置かないのですか?
A. 商品マスター価格は変動することがあり、過去注文の価格を保持する必要があるため、販売単価は注文明細に保存するのが通常です。与件の従属性でもそれが示されています(⑤)。
A. 商品マスター価格は変動することがあり、過去注文の価格を保持する必要があるため、販売単価は注文明細に保存するのが通常です。与件の従属性でもそれが示されています(⑤)。
Q. 顧客名を注文明細に入れるとどんな問題が起きますか?
A. 顧客名の更新(改名、誤記訂正など)時に複数行を更新する必要が生じ、整合性の維持が困難になります。これが正規化で除去するべき冗長性です。
A. 顧客名の更新(改名、誤記訂正など)時に複数行を更新する必要が生じ、整合性の維持が困難になります。これが正規化で除去するべき冗長性です。
関連キーワード: 正規化、第3正規形、関数従属性、複合主キー、部分従属性、推移従属性、注文明細、属性分解

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

