ITパスポート 2019年 秋期 問87
問題文
売上伝票のデータを関係データベースの表で管理することを考える。売上伝票の表を設計するときに、表を構成するフィールドの関連性を分析し、データの重複及び不整合が発生しないように、複数の表に分ける作業はどれか。
選択肢
ア:結合
イ:射影
ウ:正規化(正解)
エ:排他制御
🔒 解説は解答すると表示されます
売上伝票の表の設計でデータを分ける作業はどれか【ITパスポート 解説】
正解の理由
問題では「表を構成するフィールドの関連性を分析し、データの重複及び不整合が発生しないように、複数の表に分ける作業」とあります。これはデータの冗長(重複)や矛盾を防ぐために、1つの大きな表を意味のあるまとまりに分割する設計手法の説明です。関係データベース(表=テーブルでデータを管理する仕組み)において、こうした設計作業は「正規化」と呼ばれます。したがって該当するのは ウ です。
ポイントをかみ砕くと:
- 正規化は「同じデータを何度も持たない」「更新時に矛盾しない」ように表を分ける作業です。
- 売上伝票で言えば、顧客情報・商品情報・明細(行)情報を別々の表に分けるのが典型例です。
解法ステップ
試験でこの種の問題に当たったら、以下を順に確認します。
- 問題文のキーワードを探す:「データの重複」「不整合」「複数の表に分ける」など。
- 各選択肢の意味を短く思い出す。
- 結合=テーブルをつなげる操作
- 射影=選んだ列(フィールド)だけ取り出す操作
- 正規化=表を分割して冗長性を減らす設計手法
- 排他制御=同時アクセスの整合性を保つ仕組み
- 問題の要求(分割=冗長性を防ぐ設計)に最も合う語を選ぶ。ここでは「正規化」が該当します。
選択肢別の誤答解説
-
ア: 結合
結合(ジョイン、join)は複数の表をつなげて1つの結果にする操作です。表を「分ける」作業ではなく、むしろ分かれた表を元に戻して利用する場面で使います。よって該当しません。 -
イ: 射影
射影(プロジェクション、projection)は関係代数の用語で、テーブルから特定の列だけを取り出す操作です。列の選択・表示に関する操作であり、表を分割して設計することとは別です。 -
ウ: 正規化
正規化(normalization)は表を分解して冗長性や更新時の不整合を避ける設計手法です。問題文の説明と一致します。したがって正解は ウ です。 -
エ: 排他制御
排他制御(ロックなど)は複数ユーザーが同時にデータを操作したときの整合性を保つための仕組みです。表の設計(分割)自体を指す言葉ではありません。
よくある誤解
-
「正規化=データベースを速くする」は誤り
正規化はデータの一貫性と冗長性の排除が目的です。場合によっては表結合が増え、読み取り性能が低下することがあります。性能対策としては「正規化」と「非正規化(意図的に冗長を許す)」を適切に組み合わせます。 -
「正規化すれば必ず矛盾が起きない」は誤り
正規化は構造的な矛盾(重複による不整合)を減らしますが、アプリケーション設計や運用ルールが不適切だと別の矛盾は起きえます。運用と設計の両方が重要です。 -
用語の混同(結合・射影と混同する)
結合や射影はデータの操作(問い合わせ)に関する言葉で、正規化はスキーマ設計に関する言葉です。操作と設計を区別して覚えましょう。
補足コラム
正規化には段階(正規形:normal form)があります。代表的なものを簡単に示します。
- 第1正規形(1NF): 各フィールドが原子的(分割できない値)であること。例:1つのセルに複数の商品名を書かない。
- 第2正規形(2NF): 主キーの一部にのみ依存する列を分離すること(複合キーを使う場合に関係する)。要するに「部分依存」の解消。
- 第3正規形(3NF): 非キー属性同士の依存を排除すること(推移的依存の解消)。例えば「郵便番号→住所」を別表にする。
実務では第3正規形まで行うことが多いですが、読み取り性能や実装のしやすさを考えて部分的に正規化を緩める(非正規化)場合もあります。
簡単な例(売上伝票の分割前と分割後のイメージ):
分割前(冗長になりやすい)
分割後(正規化)
- 顧客表(顧客ID, 顧客名, 顧客住所)
- 商品表(商品ID, 商品名, 価格)
- 伝票ヘッダ(伝票ID, 日付, 顧客ID)
- 伝票明細(伝票ID, 商品ID, 数量)
分割により、顧客住所を変更するときは顧客表だけを更新すれば済み、伝票ごとに住所がばらばらになる危険が減ります。
簡単なテーブル作成SQL(例)
CREATE TABLE Customer (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
address VARCHAR(200)
);
CREATE TABLE Product (
product_id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2)
);
CREATE TABLE Invoice (
invoice_id INT PRIMARY KEY,
date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);
CREATE TABLE InvoiceLine (
invoice_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (invoice_id, product_id),
FOREIGN KEY (invoice_id) REFERENCES Invoice(invoice_id),
FOREIGN KEY (product_id) REFERENCES Product(product_id)
);
FAQ
Q1. 正規化とER図(エンティティ関係図)は同じですか?
A1. ER図は「どんなデータ(エンティティ)とその関係があるか」を視覚化する設計図です。正規化はその設計をより整える(冗長を減らす)工程です。両方は連携しますが役割は異なります。
A1. ER図は「どんなデータ(エンティティ)とその関係があるか」を視覚化する設計図です。正規化はその設計をより整える(冗長を減らす)工程です。両方は連携しますが役割は異なります。
Q2. 正規化しすぎると何がまずいですか?
A2. 表が細かく分かれすぎると、データを読み出すときに多くの結合(ジョイン)が必要になり、性能や実装の複雑さが増します。実用上は正規化と性能のバランスが重要です。
A2. 表が細かく分かれすぎると、データを読み出すときに多くの結合(ジョイン)が必要になり、性能や実装の複雑さが増します。実用上は正規化と性能のバランスが重要です。
Q3. 射影って聞いたことがあるが、試験対策でどう覚える?
A3. 射影=列を選ぶ操作(例:「顧客名だけ取り出す」)。結合=行をつなぐ操作(例:「伝票と顧客を顧客IDでつなぐ」)。「射影=列」「結合=表をつなぐ」と短く覚えるとよいです。
A3. 射影=列を選ぶ操作(例:「顧客名だけ取り出す」)。結合=行をつなぐ操作(例:「伝票と顧客を顧客IDでつなぐ」)。「射影=列」「結合=表をつなぐ」と短く覚えるとよいです。
関連キーワード: 関係データベース、正規化、冗長性削減、第3正規形、スキーマ設計

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

