---
title: "データベース正規化とは？第1〜第3正規形と更新時異状を理解する【基本情報技術者試験】"
description: "データベース正規化を、冗長性と更新時異状を防ぐ考え方として整理し、第1正規形、第2正規形、第3正規形、部分関数従属、推移的関数従属、非正規化との違いをFE試験向けに解説します。"
last_modified_at: "2026-07-25"
canonical_url: "https://stemtazoo.github.io/fe/database-normalization/"
section: "fe"
---

## まず結論

データベース正規化とは、**同じ意味のデータを何度も保存する冗長性を減らし、更新・挿入・削除のときに起こる不整合を防ぐために、表を適切に分ける考え方**です。

基本情報技術者試験では、まず第3正規形までを判断できれば十分です。

```text
第1正規形
→ 1つのセルに1つの値

第2正規形
→ 複合主キーの一部だけで決まる項目を分ける

第3正規形
→ 主キー以外を経由して決まる項目を分ける
```

判断基準は次の一文です。

> **正規化は、表を細かくするためではなく、重複による更新時異状を防ぐために行う。**

## 直感的な説明

次の注文表を考えます。

| 注文番号 | 顧客番号 | 顧客名 | 商品番号 | 商品名 |
|---|---|---|---|---|
| 1 | C01 | 山田商事 | P01 | 商品A |
| 2 | C01 | 山田商事 | P02 | 商品B |
| 3 | C01 | 山田商事 | P03 | 商品C |

顧客名や商品名が何度も保存されています。

ここで「山田商事」が「山田株式会社」へ変わった場合、複数の行をすべて直さなければなりません。

```text
1行目だけ更新した
↓
同じ顧客番号なのに顧客名が異なる
↓
データの不整合
```

このような問題を防ぐために、注文表・顧客表・商品表へ分けます。

```text
注文表
→ 注文番号、顧客番号、商品番号

顧客表
→ 顧客番号、顧客名

商品表
→ 商品番号、商品名
```

すると、顧客名は顧客表の1か所だけ直せばよくなります。

## 定義・仕組み

正規化の中心は、**一つの事実を一つの場所で管理すること**です。

正規化によって、次のような問題を減らせます。

- 同じ情報を複数箇所で更新する必要がある
- 更新漏れによって値が食い違う
- 別の情報がないと登録できない
- 行を削除すると必要な情報まで失われる

これらはまとめて、**更新時異状**と呼ばれます。

### 更新異状

同じ情報が複数行にあるため、すべて更新しなければならない問題です。

```text
顧客名を3か所に保存
↓
1か所だけ更新漏れ
↓
値が不一致
```

### 挿入異状

別の情報が存在しないと、登録したい情報を追加できない問題です。

たとえば注文表だけで顧客情報を管理していると、まだ注文していない新規顧客を登録できないことがあります。

### 削除異状

ある行を削除したとき、残しておきたい情報まで失われる問題です。

たとえば顧客の最後の注文を削除すると、顧客情報まで消えることがあります。

正規化では、関数従属という考え方も使います。

関数従属とは、ある項目が決まると、別の項目も一意に決まる関係です。

```text
商品番号 → 商品名
```

これは、商品番号が決まれば商品名も決まる、という意味です。

## 第1正規形

第1正規形では、**1つの項目に1つの値だけを入れる**ようにします。

たとえば、次のような表は第1正規形ではありません。

| 顧客番号 | 電話番号 |
|---|---|
| C01 | 090-xxxx、080-xxxx |

1つのセルに複数の電話番号が入っているからです。

判断ワードは次のとおりです。

- 繰返し項目
- 複数値
- 原子値
- 1セル1値

## 第2正規形

第2正規形では、**複合主キーの一部だけに依存する属性を分離**します。

たとえば、主キーが次の組合せだとします。

```text
注文番号 + 商品番号
```

このとき、商品名が商品番号だけで決まるなら、複合主キー全体には依存していません。

```text
商品番号 → 商品名
```

この関係を**部分関数従属**といいます。

商品番号と商品名を商品表へ分けることで、第2正規形になります。

```text
複合主キーの一部だけで決まる
→ 部分関数従属
→ 別表へ分ける
```

なお、主キーが1項目だけの場合、部分関数従属は発生しません。

## 第3正規形

第3正規形では、**主キー以外の属性を経由して決まる属性を分離**します。

たとえば、社員表に次の関係があるとします。

```text
社員番号 → 部門番号 → 部門名
```

部門名は、社員番号から直接決まるのではなく、部門番号を経由して決まっています。

この関係を**推移的関数従属**といいます。

部門番号と部門名を部門表へ分けることで、第3正規形になります。

```text
主キー
→ 非キー属性A
→ 非キー属性B

このつながりを分離
→ 第3正規形
```

このテーマは、基本情報技術者試験の「データベース」や「データベース設計」と関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、正規化の目的や、表を第3正規形へ分解した結果を選ぶ問題として出題されます。

| 問題文・選択肢の表現 | 判断 |
|---|---|
| 1つのセルに複数の値がある | 第1正規形を疑う |
| 複合主キーの一部だけで属性が決まる | 第2正規形を疑う |
| 主キー以外の属性を経由して別の属性が決まる | 第3正規形を疑う |
| 冗長性を減らして更新時異状を防ぐ | 正規化の目的 |
| 検索性能を上げるために重複を持たせる | 非正規化を疑う |

試験中は、次の順番で考えると安定します。

```text
1. 1セル1値になっているか
2. 複合主キーの一部だけに依存していないか
3. 主キー以外を経由して決まっていないか
4. 目的が冗長性と更新時異状の防止か確認する
```

今回のように「第3正規形まで正規化する目的」を問われた場合は、次の選択肢を選びます。

```text
冗長性を排除する
↓
更新時異状を回避する
```

一方、次の説明は外します。

- 格納効率の向上だけを目的とする
- 整合性制約を不要にする
- ロック待ちを減らす
- 必ず処理を高速化する

## どんな場面で使う？

問題文では、正規化そのものの名前を問うより、データの重複や更新ミスを避ける設計として出てくることがあります。

```text
同じ情報が何度も出ている
↓
更新ミスが起きそう
↓
何で決まる項目かを見る
↓
別表に分ける
```

表を分けた後も、参照に必要なキーは元の表に残します。

たとえば商品名を商品表へ分けても、注文表には商品表を参照する商品番号を残します。

## 正規化と整合性制約

正規化すると表が分かれるため、表同士を正しく結び付ける必要があります。

```text
顧客表
↓ 主キー
顧客番号
↑ 外部キー
注文表
```

そのため、正規化によって整合性制約が不要になるわけではありません。

むしろ、表を分けた後は、主キー・外部キー・参照整合性が重要になります。

## 正規化と非正規化

正規化すれば、必ず処理が速くなるわけではありません。

表を分けると、必要な情報を取り出すときに結合処理が増える場合があります。

```text
注文表
JOIN
顧客表
JOIN
商品表
```

読取り性能を優先する場面では、あえて一部の重複を許すことがあります。これを**非正規化**といいます。

| 比較 | 正規化 | 非正規化 |
|---|---|---|
| 主な目的 | 一貫性、保守性、更新時異状の防止 | 読取り性能の向上 |
| データ重複 | 減らす | 一部許容する |
| 表の数 | 増えやすい | 減る場合がある |
| 結合処理 | 増える場合がある | 減らせる場合がある |

```text
重複を減らして整合性を守る
→ 正規化

検索を速くするために重複を許す
→ 非正規化
```

## よくある誤解・混同

| 誤解 | 正しい理解 |
|---|---|
| 商品名を商品表に分けたら、注文表から商品番号も消す | 注文表には商品表を参照する商品番号を残す |
| 第2正規形は、主キー以外で決まる項目を分ける | それは第3正規形の考え方 |
| 第3正規形では、複合主キーの一部で決まる項目を見る | それは第2正規形の考え方 |
| 正規化は表を細かくするほどよい | 分割は手段であり、目的は更新時異状の防止 |
| 正規化すれば必ず高速になる | 結合が増えて検索が複雑になる場合もある |
| 表を分けると整合性制約が不要になる | 外部キーなどによる整合性管理が必要 |

試験では、次の切り分けを残しておくと強いです。

```text
1セル1値
→ 第1正規形

主キーの一部で決まる
→ 第2正規形

主キー以外を経由して決まる
→ 第3正規形
```

## まとめ（試験直前用）

- 正規化の目的は、冗長性を減らして更新時異状を防ぐこと
- 更新時異状には、更新異状・挿入異状・削除異状がある
- 第1正規形は、繰返し項目をなくして1セル1値にする
- 第2正規形は、部分関数従属をなくす
- 第3正規形は、推移的関数従属をなくす
- 正規化は、処理速度やロック待ちの改善が主目的ではない
- 表を分けた後も、外部キーなどの整合性制約が必要
- 読取り性能のために重複を許す考え方が非正規化

試験直前には、次の一文を思い出してください。

> **第1は1セル1値、第2は主キーの一部、第3は主キー以外を経由。目的は更新時異状の防止。**
