データベースの「正規化」はITパスポートのデータベース分野で頻繁に出題される重要テーマです。「第1正規形」「第2正規形」「部分従属」など、専門用語が多くて難しそうに感じる方も多いのではないでしょうか。
この記事では、注文伝票という身近な例を使いながら、正規化の目的と第1〜第3正規形への段階的な変換手順を丁寧に解説します。各ステップを一つずつ追っていけば、試験でも確実に解けるようになります!
正規化とは?一言でいうとデータの整理整頓
正規化とは、データの重複や矛盾を排除するために、データベースのテーブル構造を整理・最適化する設計手法のことです。
正規化をしていない粗削りなテーブルでは、次のような問題が起きます。
- データの重複:同じ情報を複数の行に繰り返し入力する必要がある
- 更新異常:1か所のデータを変更すると、ほかにも漏れなく更新しなければならない
- 削除異常:1件のデータを削除すると、関連する別の重要な情報まで失われる
正規化することで、これらの問題を防ぎ、データの一貫性と保守性を高めることができます。
正規化の3段階
正規化は段階的に行われ、各段階を正規形と呼びます。

| 正規形 | 解決する問題 | 一言まとめ |
|---|---|---|
| 第1正規形 | 繰り返し項目の排除 | 1つのセルに1つの値だけ |
| 第2正規形 | 部分従属の排除 | 主キー全体で決まる情報のみ |
| 第3正規形 | 推移従属の排除 | 主キー以外が決める情報を分離 |
それぞれの正規形を、注文伝票の例で順を追って理解していきましょう。
非正規形:整理前のテーブル
まず、正規化していない状態(非正規形)の注文テーブルを見てみましょう。
| 注文ID | 顧客ID | 顧客名 | 商品1 | 商品2 | 商品3 |
|---|---|---|---|---|---|
| O001 | C01 | 田中一郎 | ボールペン | ノート | |
| O002 | C02 | 佐藤花子 | 付箋 | ||
| O003 | C01 | 田中一郎 | 消しゴム | ボールペン | 定規 |
このテーブルの問題点は、商品の列が商品1・商品2・商品3と繰り返し項目になっていることです。購入商品が4点以上になると列を追加しなければならず、空欄も多く非常に扱いにくい構造です。
第1正規形:繰り返し項目を1行1値に整理する
非正規形から第1正規形へのルールは「1つのセルには1つの値だけを入れる」ことです。繰り返し項目(商品1・商品2・商品3)を縦方向に展開して1行1値の形にします。
| 注文ID | 顧客ID | 顧客名 | 商品名 |
|---|---|---|---|
| O001 | C01 | 田中一郎 | ボールペン |
| O001 | C01 | 田中一郎 | ノート |
| O002 | C02 | 佐藤花子 | 付箋 |
| O003 | C01 | 田中一郎 | 消しゴム |
| O003 | C01 | 田中一郎 | ボールペン |
| O003 | C01 | 田中一郎 | 定規 |
1行1値になりました。ただし、注文ID+商品名の組み合わせが主キーとなります。この状態に問題がないか確認すると、「顧客名」が注文IDだけで決まっており、主キー全体(注文ID+商品名)ではなく主キーの一部(注文IDのみ)に依存していることがわかります。これが次のステップで解決すべき問題です。
第2正規形:部分従属を排除する
部分従属とは、複合主キーの一部にのみ依存する列が存在する状態のことです。
第1正規形のテーブルでは「顧客ID」「顧客名」は注文IDだけわかれば決まるため、商品名(主キーの片方)には関係しません。このような部分的な依存関係を持つ列を別テーブルに分離します。
注文明細テーブル(主キー:注文ID+商品名)
| 注文ID | 商品名 |
|---|---|
| O001 | ボールペン |
| O001 | ノート |
| O002 | 付箋 |
| O003 | 消しゴム |
| O003 | ボールペン |
| O003 | 定規 |
注文テーブル(主キー:注文ID)
| 注文ID | 顧客ID | 顧客名 |
|---|---|---|
| O001 | C01 | 田中一郎 |
| O002 | C02 | 佐藤花子 |
| O003 | C01 | 田中一郎 |
これで部分従属が解消されました。しかし、注文テーブルをよく見ると「顧客名」は顧客IDによって決まります。主キー(注文ID)→顧客ID→顧客名という間接的な依存関係があります。これが次のステップで解決すべき問題です。
第3正規形:推移従属を排除する
推移従属とは、主キー以外の列が別の非キー列に依存している状態のことです。注文テーブルのケースでは、注文IDが顧客IDを決め、顧客IDが顧客名を決めています(注文ID→顧客ID→顧客名)。
この推移的な依存関係を持つ「顧客名」を別テーブルに分離します。
注文テーブル(主キー:注文ID)
| 注文ID | 顧客ID |
|---|---|
| O001 | C01 |
| O002 | C02 |
| O003 | C01 |
顧客テーブル(主キー:顧客ID)
| 顧客ID | 顧客名 |
|---|---|
| C01 | 田中一郎 |
| C02 | 佐藤花子 |
これで第3正規形の完成です。注文テーブル・注文明細テーブル・顧客テーブルの3つに分解されました。各テーブルの列はすべて主キーにのみ依存しており、冗長なデータがなくなりました。
ITパスポート試験での正規化出題傾向と対策
試験でおさえるべきキーワード
- 正規化:データの重複・矛盾を排除してテーブル構造を最適化すること。
- 第1正規形:繰り返し項目を排除し、1セルに1値のみにする。
- 第2正規形:部分従属(複合主キーの一部への依存)を排除する。
- 第3正規形:推移従属(非キー列への依存)を排除する。
- 部分従属:複合主キーの一部の列だけに依存している状態。
- 推移従属:主キー→非キー列A→非キー列Bという間接的な依存関係。
過去問に挑戦!
【問題】
正規化の目的として、最も適切なものはどれか。ア.データ検索の速度を向上させるため
イ.データの冗長性を排除し、整合性を保つため
ウ.データベースのセキュリティを強化するため
エ.データのバックアップを自動化するため【正解】:イ
【解説】:正規化の目的はデータの重複(冗長性)を排除して、更新時の矛盾が生じないよう整合性を保つことです。検索速度の向上は正規化の目的ではなく、むしろ正規化でテーブルが増えると結合処理が増えて速度が下がる場合もあります。【問題】
次の記述のうち、第2正規形の条件として正しいものはどれか。ア.繰り返し項目が存在しない
イ.非キー属性が主キーに対して完全に関数従属している
ウ.非キー属性間の推移的な依存関係が存在しない
エ.すべての属性が単一の原子的な値を持つ【正解】:イ
【解説】:第2正規形の条件は、第1正規形を満たした上で、すべての非キー属性が主キー全体に完全に関数従属していることです。アとエは第1正規形の条件、ウは第3正規形の条件です。
まとめ:正規化は段階を追って理解する
今回はデータベースの正規化について解説しました。ポイントをもう一度確認しましょう。
- 正規化の目的はデータの冗長性排除と整合性確保
- 第1正規形は繰り返し項目を排除して1セル1値にする
- 第2正規形は部分従属(複合主キーの一部への依存)を排除するために別テーブルに分離する
- 第3正規形は推移従属(非キー列→非キー列の依存)を排除するためにさらに分離する
- 試験では部分従属と推移従属の違いが最重要ポイント
注文伝票の例を頭の中でイメージしながら、どの列がどの主キーに依存しているかを追っていく練習をしましょう。手を動かして問題演習を繰り返せば必ず身につきます!
