最終更新日:2026年7月25日
fe fe-technology database
まず結論
データベース正規化とは、同じ意味のデータを何度も保存する冗長性を減らし、更新・挿入・削除のときに起こる不整合を防ぐために、表を適切に分ける考え方です。
基本情報技術者試験では、まず第3正規形までを判断できれば十分です。
第1正規形
→ 1つのセルに1つの値
第2正規形
→ 複合主キーの一部だけで決まる項目を分ける
第3正規形
→ 主キー以外を経由して決まる項目を分ける
判断基準は次の一文です。
正規化は、表を細かくするためではなく、重複による更新時異状を防ぐために行う。
直感的な説明
次の注文表を考えます。
| 注文番号 | 顧客番号 | 顧客名 | 商品番号 | 商品名 |
|---|---|---|---|---|
| 1 | C01 | 山田商事 | P01 | 商品A |
| 2 | C01 | 山田商事 | P02 | 商品B |
| 3 | C01 | 山田商事 | P03 | 商品C |
顧客名や商品名が何度も保存されています。
ここで「山田商事」が「山田株式会社」へ変わった場合、複数の行をすべて直さなければなりません。
1行目だけ更新した
↓
同じ顧客番号なのに顧客名が異なる
↓
データの不整合
このような問題を防ぐために、注文表・顧客表・商品表へ分けます。
注文表
→ 注文番号、顧客番号、商品番号
顧客表
→ 顧客番号、顧客名
商品表
→ 商品番号、商品名
すると、顧客名は顧客表の1か所だけ直せばよくなります。
定義・仕組み
正規化の中心は、一つの事実を一つの場所で管理することです。
正規化によって、次のような問題を減らせます。
- 同じ情報を複数箇所で更新する必要がある
- 更新漏れによって値が食い違う
- 別の情報がないと登録できない
- 行を削除すると必要な情報まで失われる
これらはまとめて、更新時異状と呼ばれます。
更新異状
同じ情報が複数行にあるため、すべて更新しなければならない問題です。
顧客名を3か所に保存
↓
1か所だけ更新漏れ
↓
値が不一致
挿入異状
別の情報が存在しないと、登録したい情報を追加できない問題です。
たとえば注文表だけで顧客情報を管理していると、まだ注文していない新規顧客を登録できないことがあります。
削除異状
ある行を削除したとき、残しておきたい情報まで失われる問題です。
たとえば顧客の最後の注文を削除すると、顧客情報まで消えることがあります。
正規化では、関数従属という考え方も使います。
関数従属とは、ある項目が決まると、別の項目も一意に決まる関係です。
商品番号 → 商品名
これは、商品番号が決まれば商品名も決まる、という意味です。
第1正規形
第1正規形では、1つの項目に1つの値だけを入れるようにします。
たとえば、次のような表は第1正規形ではありません。
| 顧客番号 | 電話番号 |
|---|---|
| C01 | 090-xxxx、080-xxxx |
1つのセルに複数の電話番号が入っているからです。
判断ワードは次のとおりです。
- 繰返し項目
- 複数値
- 原子値
- 1セル1値
第2正規形
第2正規形では、複合主キーの一部だけに依存する属性を分離します。
たとえば、主キーが次の組合せだとします。
注文番号 + 商品番号
このとき、商品名が商品番号だけで決まるなら、複合主キー全体には依存していません。
商品番号 → 商品名
この関係を部分関数従属といいます。
商品番号と商品名を商品表へ分けることで、第2正規形になります。
複合主キーの一部だけで決まる
→ 部分関数従属
→ 別表へ分ける
なお、主キーが1項目だけの場合、部分関数従属は発生しません。
第3正規形
第3正規形では、主キー以外の属性を経由して決まる属性を分離します。
たとえば、社員表に次の関係があるとします。
社員番号 → 部門番号 → 部門名
部門名は、社員番号から直接決まるのではなく、部門番号を経由して決まっています。
この関係を推移的関数従属といいます。
部門番号と部門名を部門表へ分けることで、第3正規形になります。
主キー
→ 非キー属性A
→ 非キー属性B
このつながりを分離
→ 第3正規形
このテーマは、基本情報技術者試験の「データベース」や「データベース設計」と関係する内容です。公式の出題範囲やシラバスは、IPA:基本情報技術者試験 から確認できます。
科目Aでどう出る?
科目Aでは、正規化の目的や、表を第3正規形へ分解した結果を選ぶ問題として出題されます。
| 問題文・選択肢の表現 | 判断 |
|---|---|
| 1つのセルに複数の値がある | 第1正規形を疑う |
| 複合主キーの一部だけで属性が決まる | 第2正規形を疑う |
| 主キー以外の属性を経由して別の属性が決まる | 第3正規形を疑う |
| 冗長性を減らして更新時異状を防ぐ | 正規化の目的 |
| 検索性能を上げるために重複を持たせる | 非正規化を疑う |
試験中は、次の順番で考えると安定します。
1. 1セル1値になっているか
2. 複合主キーの一部だけに依存していないか
3. 主キー以外を経由して決まっていないか
4. 目的が冗長性と更新時異状の防止か確認する
今回のように「第3正規形まで正規化する目的」を問われた場合は、次の選択肢を選びます。
冗長性を排除する
↓
更新時異状を回避する
一方、次の説明は外します。
- 格納効率の向上だけを目的とする
- 整合性制約を不要にする
- ロック待ちを減らす
- 必ず処理を高速化する
どんな場面で使う?
問題文では、正規化そのものの名前を問うより、データの重複や更新ミスを避ける設計として出てくることがあります。
同じ情報が何度も出ている
↓
更新ミスが起きそう
↓
何で決まる項目かを見る
↓
別表に分ける
表を分けた後も、参照に必要なキーは元の表に残します。
たとえば商品名を商品表へ分けても、注文表には商品表を参照する商品番号を残します。
正規化と整合性制約
正規化すると表が分かれるため、表同士を正しく結び付ける必要があります。
顧客表
↓ 主キー
顧客番号
↑ 外部キー
注文表
そのため、正規化によって整合性制約が不要になるわけではありません。
むしろ、表を分けた後は、主キー・外部キー・参照整合性が重要になります。
正規化と非正規化
正規化すれば、必ず処理が速くなるわけではありません。
表を分けると、必要な情報を取り出すときに結合処理が増える場合があります。
注文表
JOIN
顧客表
JOIN
商品表
読取り性能を優先する場面では、あえて一部の重複を許すことがあります。これを非正規化といいます。
| 比較 | 正規化 | 非正規化 |
|---|---|---|
| 主な目的 | 一貫性、保守性、更新時異状の防止 | 読取り性能の向上 |
| データ重複 | 減らす | 一部許容する |
| 表の数 | 増えやすい | 減る場合がある |
| 結合処理 | 増える場合がある | 減らせる場合がある |
重複を減らして整合性を守る
→ 正規化
検索を速くするために重複を許す
→ 非正規化
よくある誤解・混同
| 誤解 | 正しい理解 |
|---|---|
| 商品名を商品表に分けたら、注文表から商品番号も消す | 注文表には商品表を参照する商品番号を残す |
| 第2正規形は、主キー以外で決まる項目を分ける | それは第3正規形の考え方 |
| 第3正規形では、複合主キーの一部で決まる項目を見る | それは第2正規形の考え方 |
| 正規化は表を細かくするほどよい | 分割は手段であり、目的は更新時異状の防止 |
| 正規化すれば必ず高速になる | 結合が増えて検索が複雑になる場合もある |
| 表を分けると整合性制約が不要になる | 外部キーなどによる整合性管理が必要 |
試験では、次の切り分けを残しておくと強いです。
1セル1値
→ 第1正規形
主キーの一部で決まる
→ 第2正規形
主キー以外を経由して決まる
→ 第3正規形
まとめ(試験直前用)
- 正規化の目的は、冗長性を減らして更新時異状を防ぐこと
- 更新時異状には、更新異状・挿入異状・削除異状がある
- 第1正規形は、繰返し項目をなくして1セル1値にする
- 第2正規形は、部分関数従属をなくす
- 第3正規形は、推移的関数従属をなくす
- 正規化は、処理速度やロック待ちの改善が主目的ではない
- 表を分けた後も、外部キーなどの整合性制約が必要
- 読取り性能のために重複を許す考え方が非正規化
試験直前には、次の一文を思い出してください。
第1は1セル1値、第2は主キーの一部、第3は主キー以外を経由。目的は更新時異状の防止。