ITパスポート 2016年 春期 問94
問題文
商品の仕入状況を管理している関係データベースの“仕入一覧”表を正規化して、“仕入”表と“商品”表に分割したい。分割後の二つの表に共通して必要なフィールドとして、最も適切なものはどれか。ここで、仕入れは一度に一つの商品だけを仕入れることとし、仕入番号で一意に識別できる。また、商品は商品番号で一意に識別できる。

選択肢
ア:仕入番号
イ:支払方法
ウ:商品番号(正解)
エ:商品名
🔒 解説は解答すると表示されます
仕入一覧表の正規化【ITパスポート 解説】
正解の理由
表を「仕入」表(仕入の履歴)と「商品」表(商品ごとの情報)に分けるとき、両方の表に共通して持たせるべきフィールドは、商品を一意(他と区別して)に特定できる識別子です。問題文では「商品は商品番号で一意に識別できる」とあるので、共通フィールドは ウ の「商品番号」が最も適切です。
理由をかみ砕くと:
- 「商品番号」は商品そのものを識別するキーです。商品に関する情報(商品名・規格など)は「商品」表にまとめ、各仕入れ行はその商品番号を参照(外部キー)してどの商品が仕入れられたかを示します。これにより、商品情報の重複を防げます。
解法ステップ
- 問題文を読み、各列の意味を確認する(仕入番号、商品番号、商品名、個数、単価、支払方法、納品日)。
- 「どの列が『商品そのもの』を一意に識別するか」を探す。設問で「商品は商品番号で一意に識別できる」と明記されている点に注目。
- 正規化の目的(同じ商品名を繰り返し持たない、更新や削除の異常を防ぐ)を思い出す。商品名など商品固有の属性は商品表へ、仕入固有の属性(仕入番号、個数、単価、支払方法、納品日)は仕入表へ。
- 両表で共通に必要なのは「商品を紐づけるためのキー」であり、それが商品番号であることを確認する。
実際のテーブル設計例(イメージ):
CREATE TABLE 商品 (
商品番号 VARCHAR(20) PRIMARY KEY,
商品名 VARCHAR(100)
);
CREATE TABLE 仕入 (
仕入番号 VARCHAR(20) PRIMARY KEY,
商品番号 VARCHAR(20) REFERENCES 商品(商品番号),
個数 INTEGER,
単価 INTEGER,
支払方法 VARCHAR(20),
納品日 DATE
);
選択肢別の誤答解説
-
ア: 仕入番号
仕入番号は「その仕入れ行」を一意に識別するキーです。仕入ごとに異なるので「商品」表側では意味を持ちません。共通フィールドには向きません。 -
イ: 支払方法
支払方法はその仕入取引の属性です(例:現金・掛け・カード)。商品固有の情報ではないため、商品表に入れるべきではありませんし、共通フィールドにもなりません。 -
ウ: 商品番号
(正解)商品を一意に特定する識別子なので、商品表の主キーであり、仕入表では外部キーとして参照されます。したがって両表で共通して必要です。 -
エ: 商品名
商品名は商品固有の属性であり「商品」表に置くべきです。しかし同じ商品名を仕入表に毎回書くと重複が生じます。仕入表には商品番号だけを置き、表示時に商品名を参照するのが正しい設計です。
よくある誤解
-
「商品名を共通フィールドにすればいい」と思うミス
- 商品名は同じ商品でも表記のゆらぎや変更が起きやすく、商品番号で紐づけないと更新漏れや矛盾が発生します。識別子としては不適切です。
-
「支払方法や納品日は商品に関係する」と誤解すること
- 支払方法や納品日は取引(仕入)に関する情報で、商品の性質ではありません。取引ごとに値が変わる属性は取引側(仕入表)に置きます。
補足コラム
正規化(Normalization)は、関係データベースでデータの重複を減らし、更新や削除で矛盾が起きないようにする手法です。基本的な考え方は「1つの事実は1箇所だけに書く」です。
- 主キー(Primary Key):その表の行を一意に識別する列。ここでは商品表の主キーが「商品番号」、仕入表の主キーが「仕入番号」。
- 外部キー(Foreign Key):別の表の主キーを参照する列。仕入表の「商品番号」は商品表の主キーを参照する外部キーになります。
これを守ると、例えば商品名が変更になったとき、商品表の1箇所を更新するだけで済み、仕入表のすべての行を更新する必要がなくなります。更新ミスやデータの不整合を防ぐのが目的です。
FAQ
Q1. 商品番号がない場合はどうする?
A1. その場合は商品を一意に識別する何らかのコード(管理番号)を新たに作るのが一般的です。名前だけで識別すると誤認や重複の原因になります。
A1. その場合は商品を一意に識別する何らかのコード(管理番号)を新たに作るのが一般的です。名前だけで識別すると誤認や重複の原因になります。
Q2. 仕入が一度に複数商品ある場合は?
A2. その場合は「仕入伝票」ヘッダ(仕入伝票番号、支払方法、納品日)と「仕入明細」行(伝票番号、商品番号、個数、単価)に分けて、伝票ヘッダと明細で1対多の関係を作ります。今回の問題は「一度に一つの商品だけ仕入れる」と明記されているため、単純化して考えます。
A2. その場合は「仕入伝票」ヘッダ(仕入伝票番号、支払方法、納品日)と「仕入明細」行(伝票番号、商品番号、個数、単価)に分けて、伝票ヘッダと明細で1対多の関係を作ります。今回の問題は「一度に一つの商品だけ仕入れる」と明記されているため、単純化して考えます。
Q3. 商品名の重複は問題?
A3. 同じ名前の商品が複数存在することがあり得ます。そのため名前だけで識別するのは危険で、番号(ID)で識別するのが安全です。
A3. 同じ名前の商品が複数存在することがあり得ます。そのため名前だけで識別するのは危険で、番号(ID)で識別するのが安全です。
関連キーワード: 正規化、関係データベース、主キー、外部キー、商品番号、仕入管理、データの冗長性、更新異常

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

