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

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


問題文

次の“受注台帳”表を“注文”表と“顧客”表に分解し、第3正規形にしたとき、両方に必要な属性はどれか。ここで、送付先と支払方法は注文ごとに決めるものとする。また、表の下線は主キーを表す。
受注台帳(注文番号, 注文年月日, 顧客ID, 顧客名, 顧客住所, 品目, 数量, 送付先, 支払方法, 受注金額)

選択肢

顧客ID(正解)
顧客名
支払方法
注文番号

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

外部キーの扱い【午前解説】

正解の理由

受注表を「注文」表と「顧客」表に分解して第3正規形にする場合、顧客に関する属性(顧客名、顧客住所)は顧客を一意に識別するキーである顧客IDに従属します。顧客情報を顧客表へ移動したあと、注文と顧客を関連づけるために注文側にも顧客の識別子が必要です。したがって、両方の表に存在するべき属性は (顧客ID)です。
  • 顧客名・顧客住所は顧客IDに関数従属するため顧客表に移す(重複排除)。
  • 注文ごとに誰の注文かを示すため、注文表に顧客IDを外部キーとして残す。
これによりデータの冗長性が減り、更新異常や削除異常を防げます。

解法ステップ

  1. 関数従属性を洗い出す
    • 注文番号 → 注文年月日, 品目, 数量, 送付先, 支払方法, 受注金額(注文単位の属性)
    • 顧客ID → 顧客名, 顧客住所(顧客単位の属性)
  2. 候補キーを特定する
    • 受注台帳の主キーは注文番号(問題文の下線)。
  3. 第1・第2・第3正規形の観点で分解
    • 部分従属を排除(複合キーの部分従属があれば分割)。今回は主キーが単一の注文番号なので該当なし。
    • 推移的従属(transitive dependency)を排除:注文番号 → 顧客ID → 顧客名・顧客住所 のような推移を解消するため、顧客名・住所を顧客表へ移す。
  4. 関連付けのための外部キーを残す
    • 注文表に顧客ID(外部キー)、顧客表に顧客ID(主キー)。
  5. 検算(各属性がどの表に属すべきか確認):送付先・支払方法は注文ごとに変わるため注文表に残す。

選択肢別の誤答解説

  • :顧客ID
    正解。顧客情報を顧客表にまとめる際、注文と顧客を結びつけるために顧客IDが両表に必要(顧客表の主キーであり、注文表の外部キー)。
  • イ:顧客名
    顧客名は顧客IDに依存する非キー属性であり、顧客表に移動すべき。重複を避けるため注文表に残すべきではない。人名は一意でない場合や変更されうるため、参照のためのキーに適さない。
  • ウ:支払方法
    問題文で「送付先と支払方法は注文ごとに決める」と明示されている。したがって支払方法は注文表側の属性であり、顧客表に置くべきではない。
  • エ:注文番号
    注文番号は注文表の主キーとして各注文を一意に識別するが、顧客表側で各顧客に対して複数の注文番号が存在し得るため、顧客表の主キーにはならない。顧客表に注文番号を持たせるのは冗長または多対多の設計ミス。

よくある誤解

  1. 「顧客名をキーにすればよい」
    顧客名は重複や変更があり得るため、キー(識別子)に適さない。識別には不変で一意なIDを用いるのが基本。
  2. 「第3正規形は‘部分従属だけ’を排除すればよい」
    第3正規形では部分従属に加え、推移的従属(例:注文番号 → 顧客ID → 顧客名)も排除する必要がある点を見落としがち。
  3. 「すべてを正規化すればよい」
    正規化は整合性向上に有効だが、性能や可用性の観点から必要に応じて意図的に冗長化(非正規化)することもある点を理解しておく。

補足コラム

正規化を進めるときの実務的判断:
  • 顧客に複数の送付先(配送先登録)がある場合、送付先を別テーブル(顧客ID + 送付先ID)として管理するのが望ましい。今回の問題では「送付先は注文ごとに決める」とされているため注文表に含める。
  • 外部キーは論理的な参照を示すため、DDLでは次のように定義します。
CREATE TABLE Customer (
  customer_id VARCHAR(20) PRIMARY KEY,
  customer_name VARCHAR(100),
  address TEXT
);

CREATE TABLE Orders (
  order_no VARCHAR(20) PRIMARY KEY,
  order_date DATE,
  customer_id VARCHAR(20),
  item VARCHAR(100),
  quantity INT,
  ship_to TEXT,
  payment_method VARCHAR(50),
  amount DECIMAL(10,2),
  FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);

FAQ

Q1. 顧客IDがない場合はどうするか?
A1. 通常はサロゲートキー(自動採番の顧客ID)を導入し、各顧客を一意に識別する仕組みを作ります。
Q2. 顧客ごとに請求先住所と送付先がある場合は?
A2. 請求先・送付先を別エンティティ(住所テーブル)として分離し、顧客テーブルや注文テーブルから参照する設計が適切です。
Q3. 第3正規形で必ず冗長性がゼロになるか?
A3. 第3正規形で多くの冗長性は排除されるが、実運用や性能要件により意図的に冗長化することもあるため「常にゼロ」とは限りません。

関連キーワード: 第3正規形、正規化、外部キー、推移的従属、関数従属、テーブル分割、冗長性排除
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する

すぐに利用可能!

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

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