ITパスポート 2014年 春期 問60
問題文
ファイルで管理されていた受注データを、受注に関する情報と商品に関する情報に分割して、正規化を行った上で関係データベースの表で管理する。正規化を行った結果の表の組合せとして、最も適切なものはどれか。ここで、同一商品名で単価が異なるときは商品番号も異なるものとする。


選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
受注データを受注情報と商品情報に分割する問題【ITパスポート 解説】
正解の理由
この問題では、ファイルで管理されていた受注データを「受注に関する情報」と「商品に関する情報」に分けて、重複を減らすために正規化(データの重複や矛盾を減らす処理)を行い、関係データベース(表形式でデータを管理するデータベース)の表にすることが求められています。
ポイントは「どの項目が受注(注文)に固有で、どの項目が商品に固有か」を見分けることです。与えられたデータでは、同じ商品番号(M0001)は複数の受注に現れますが、商品名や単価は商品番号で一意に決まります。つまり関数従属としては
が成り立ちます。一方、個数は「どの受注でどれだけ買ったか」という受注固有の情報です。
したがって、受注側の表には「受注番号、発注者名、商品番号、個数」を置き、商品側の表には「商品番号、商品名、単価」を置くのが正しい分割です。これに合致している選択肢は ウ です。
解法ステップ
- 項目ごとに「その値が誰に属する情報か」を考える
- 商品に関する情報:商品番号、商品名、単価(商品番号で決まる)
- 受注に関する情報:受注番号、発注者名、個数(どの注文でいくつ買ったか)
- 同じ値が複数レコードに現れるか確認する
- 商品番号 M0001 が複数の受注行に出現 → 商品情報は独立の表にまとめるべき
- 正しく分割できる図(表)の組合せを選ぶ
- 受注表(受注番号, 発注者名, 商品番号, 個数)
- 商品表(商品番号, 商品名, 単価)
- 機能的な理由(重複の排除、変更の一元化)を確認する
- 単価を商品表に置けば、商品価格変更時に1箇所だけ更新すれば良い
選択肢別の誤答解説
-
ア
上段に受注番号・発注者名、下段に商品番号・商品名・個数・単価となっています。問題は「個数」が商品側に入っている点です。個数は受注ごとに変わる情報なので商品表に入れると誤りです。また、上段に商品番号が無いため受注と商品を結び付けられません。 -
イ
上段に商品番号があり、下段にも商品番号がある配置です。見た目では「商品番号を参照している」とも読めますが、下段に個数と単価が含まれている点が問題です。個数は受注固有、単価は商品固有です。個数が商品表に入っているため正規化として不適切です。 -
ウ
上段:受注番号、発注者名、商品番号、個数
下段:商品番号、商品名、単価
ここでは「個数」は受注表にあり、「単価」は商品表にあります。商品番号は両表でキー(上は外部キー、下は主キー)として使われ、冗長性が無く正規化に適しています。よって正解は ウ です。 -
エ
上段に単価が入っており、下段には商品番号と商品名だけです。これだと単価が受注表側にあり、同じ単価情報が注文ごとに繰り返されることになります(冗長)。問題文で「同一商品名で単価が異なるときは商品番号も異なる」と決めているので、単価は商品の属性であり商品表に置くべきです。よって不適切です。
よくある誤解
-
「単価は受注時の情報だから受注表に入れるべき」
→ 単価が商品固有であり、同じ商品番号に対して同じ単価なら商品表に置くのが正しいです。ただし、実務的には過去の受注時の価格を記録したい場合(価格履歴)には、受注表側に当時の単価をコピーして保存することがあります。試験問題では“正規化”という観点で考えます。 -
「商品番号が2つある配置(上段と下段)が重複しているのでダメ」
→ 商品番号が受注表に存在するのは外部キー(参照)として自然です。外部キーは正規化で普通に使います。問題なのは「どの属性がどちらの表に属するか」です。 -
「とにかく項目を分ければ良い」
→ 分けるだけでなく「関係(参照)が分かるか」「重複や更新のしやすさ」が重要です。機能的依存(どのキーがどの属性を決めるか)を考えると判断しやすくなります。
補足コラム
-
用語メモ
- 正規化:データの重複や矛盾を減らすために表を分割する方法。第一正規形(1NF)、第二正規形(2NF)など段階があります。
- 主キー(primary key):表の各行を一意に識別する列。例:商品表の「商品番号」。
- 外部キー(foreign key):他表の主キーを参照する列。例:受注表の「商品番号」は商品表の主キーを参照する。
-
実務での例(単純なSQL定義例)
-- 商品表(主キー: product_id)
CREATE TABLE 商品 (
商品番号 VARCHAR(10) PRIMARY KEY,
商品名 VARCHAR(100),
単価 INTEGER
);
-- 受注明細表(受注ごとに購入した商品の行を管理)
CREATE TABLE 受注明細 (
受注番号 VARCHAR(10),
商品番号 VARCHAR(10),
個数 INTEGER,
PRIMARY KEY (受注番号, 商品番号),
FOREIGN KEY (商品番号) REFERENCES 商品(商品番号)
);
上のように、商品情報は商品表に、受注に関する数量などは受注明細表に分けます。
FAQ
Q1. 単価は将来変わるかもしれないのに商品表に入れてよいですか?
A1. 問題文の条件(同一商品名で単価が異なるときは商品番号を変える)なら、単価は商品属性です。現実運用で過去注文時点の価格を保存したい場合は、受注明細に「注文時単価」をコピーして保存する設計もあります(履歴保持のため)。
A1. 問題文の条件(同一商品名で単価が異なるときは商品番号を変える)なら、単価は商品属性です。現実運用で過去注文時点の価格を保存したい場合は、受注明細に「注文時単価」をコピーして保存する設計もあります(履歴保持のため)。
Q2. 「商品番号」が両方の表にあるのはデータの重複ではないですか?
A2. 商品番号が商品表の主キーであり、受注表の外部キーとして参照されるのは正常な設計です。主キーと外部キーは表を結びつけるための重要な仕組みです。
A2. 商品番号が商品表の主キーであり、受注表の外部キーとして参照されるのは正常な設計です。主キーと外部キーは表を結びつけるための重要な仕組みです。
Q3. 正規化の程度はどこまでやれば良いですか?
A3. 基本的には「同じ情報を複数の場所で持たない」ことを目安にします。実務では性能や履歴要件に応じて意図的に正規化を崩す(デノーマライズする)こともありますが、まずは正規化の基本を理解しておくことが重要です。
A3. 基本的には「同じ情報を複数の場所で持たない」ことを目安にします。実務では性能や履歴要件に応じて意図的に正規化を崩す(デノーマライズする)こともありますが、まずは正規化の基本を理解しておくことが重要です。
関連キーワード: 正規化、関係データベース、主キー、外部キー、関数従属、受注明細、データ冗長性

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

