戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2015年 秋期 午前(科目A)27


問題文

関係“注文記録”の属性間に①の関数従属性があり、それに基づいて第3正規形まで正規化を行って、“商品”、“顧客”、“注文”、“注文明細”の各関係に分解した。関係“注文明細”として、適切なものはどれか。ここで、は、属性XとYの組みを表し、は、を関数的に決定することを表す。また、実線の下線は主キーを表す。    注文記録(注文番号, 注文日, 顧客番号, 顧客名, 商品番号, 商品名, 数量, 販売単価)   〔関数従属性〕  ① 注文番号 → 注文日  ② 注文番号 → 顧客番号  ③ 顧客番号 → 顧客名  ④ {注文番号, 商品番号} → 数量  ⑤ {注文番号, 商品番号} → 販売単価  ⑥ 商品番号 → 商品名 

選択肢

注文明細(注文番号, 数量, 販売単価)
注文明細(注文番号, 顧客番号, 数量, 販売単価)
注文明細(注文番号, 顧客番号, 商品番号, 顧客名, 数量, 販売単価)
注文明細(注文番号, 商品番号, 数量, 販売単価)(正解)

🔒 解説は解答すると表示されます

注文明細の属性構成【午前解説】

正解の理由

与えられた関数従属性から、注文ごとの明細行は「注文番号+商品番号」の複合キーで一意に識別され、数量と販売単価はその複合キーに従属します(④、⑤)。また、商品名は商品番号に従属(⑥)、顧客名は顧客番号に従属(③)、注文日・顧客番号は注文番号に従属(①、②)します。したがって、注文明細にはキーとなる注文番号と商品番号、およびそのキーに従属する数量・販売単価を含めるのが第3正規形の要請に合致します。これに該当する選択肢が です。

解法ステップ

  1. 関数従属性を整理する(①〜⑥を把握)。
  2. 候補キーを求める。
    • {注文番号, 商品番号}+ を計算すると、注文日(①)、顧客番号(②)、顧客名(③)、商品名(⑥)、数量・販売単価(④、⑤)をすべて導出できるため、{注文番号, 商品番号} は関係全体の候補キーになる。
    • よって注文明細行の一意性は {注文番号, 商品番号} によって保証される。
  3. 正規化の観点で分解する。
    • 注文に固有の属性(注文日、顧客番号)は注文テーブルへ分離する(部分従属性の除去)。
    • 顧客番号→顧客名や商品番号→商品名のような従属性は別テーブルへ分離する(推移従属性の除去)。
  4. 注文明細には複合キーと、そのキーに完全従属する属性(数量、販売単価)だけを残す。
(候補キーの閉包例)

選択肢別の誤答解説

  • ア: 注文明細(注文番号, 数量, 販売単価)
    • 誤り。注文番号のみでは複数商品の存在を区別できないため、数量や販売単価は一意に決定できない(部分キー不足)。よって識別子が不十分であり正規化の観点でも不適切。
  • イ: 注文明細(注文番号, 顧客番号, 数量, 販売単価)
    • 誤り。顧客番号は注文番号から導出可能(②)であり注文明細に含めるべきではない。また商品番号が欠けているため明細行を一意に識別できない。
  • ウ: 注文明細(注文番号, 顧客番号, 商品番号, 顧客名, 数量, 販売単価)
    • 誤り。顧客名は顧客番号に従属(③)であり注文明細に保持すると冗長で推移的従属性を生む。第3正規形の目的に反する。さらに顧客関連属性は注文/顧客テーブルへ分離すべきである。
  • エ: 注文明細(注文番号, 商品番号, 数量, 販売単価)
    • 正しい。{注文番号, 商品番号} が明細行の候補キーであり、数量と販売単価はそのキーに完全従属するため第3正規形に合致する。したがって選択肢は が適切。

よくある誤解

  • 「注文明細の主キーは注文番号だけ」と考える誤り
    • 注文1件に複数の商品があるため、明細の主キーは通常 {注文番号, 商品番号} の複合キーになる点を忘れないこと。
  • 顧客情報を「まとめる/分離する」で混同する誤り
    • 顧客番号と顧客名は顧客テーブルに分離し、注文テーブルには顧客番号のみを保持する。顧客名を注文明細へ残すと冗長性と更新異常を招く。
  • 商品名や顧客名を明細に残しておけば便利、という発想
    • 実務上は「注文時点のスナップショット」が必要な場合があるが、通常の正規化ルールでは商品名・顧客名はそれぞれの商品・顧客テーブルへ置く(ただし価格など時点情報は注文明細に保持することが多い)。

補足コラム

  • 販売単価を注文明細に保持する理由
    • マスターの「標準価格」が変わっても、過去の注文に記録された単価を維持したい場合があるため、販売単価は注文明細に保存する設計が一般的です。関数従属性⑤でも {注文番号, 商品番号} → 販売単価 と定義されていることからも、単価は明細レベルの属性と考えます。
  • 第3正規形とBCNFの関係
    • 第3正規形では「非キー属性が他の非キー属性に従属しない(推移従属性の排除)」ことを重視します。与件の分解は第3正規形に合致しており、さらに厳密にするならBCNFの観点も検討しますが、ここでは与えられた従属性からの分解で十分です。

FAQ

Q. 商品名を注文明細に含めても実務上は問題ないですか?
A. 冗長化と更新異常を招くため原則は商品テーブルへ分離します。ただし「注文時点の名称が必要」など明確な要件があれば、履歴用の列を設ける設計はあり得ます。
Q. なぜ販売単価は商品マスターにだけ置かないのですか?
A. 商品マスター価格は変動することがあり、過去注文の価格を保持する必要があるため、販売単価は注文明細に保存するのが通常です。与件の従属性でもそれが示されています(⑤)。
Q. 顧客名を注文明細に入れるとどんな問題が起きますか?
A. 顧客名の更新(改名、誤記訂正など)時に複数行を更新する必要が生じ、整合性の維持が困難になります。これが正規化で除去するべき冗長性です。

関連キーワード: 正規化、第3正規形、関数従属性、複合主キー、部分従属性、推移従属性、注文明細、属性分解
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について