正規化とは
正規化(Normalization) とは、
データベースの冗長性(重複)を減らし、不整合や更新ミスを防ぐための設計手法です。
データ構造を段階的に整えていくことで、
「一貫性・保守性・拡張性」に優れたデータベースを作ることができます。
第1正規形(1NF):繰り返し要素の排除
● ルール
- 各列(カラム)は**1つの値のみ(原子値)**を持つ。
- 同じ意味の列を複数持たない。
❌ 非正規化の例:
| 顧客ID | 顧客名 | 購入商品 |
|---|---|---|
| C001 | 田中太郎 | ノートPC, マウス |
| C002 | 鈴木花子 | スマートフォン |
→ 「購入商品」列が**複数値(カンマ区切り)**を含む。
✅ 第1正規形の例:
| 顧客ID | 顧客名 | 商品名 |
|---|---|---|
| C001 | 田中太郎 | ノートPC |
| C001 | 田中太郎 | マウス |
| C002 | 鈴木花子 | スマートフォン |
→ 各セルが単一値になり、1NFを満たす。
第2正規形(2NF):部分関数従属の排除
● ルール
- 主キーが複合キー(2つ以上の列)である場合、
その一部の列に依存するデータを分離する。
❌ 第1正規形の例:
| 顧客ID | 商品ID | 顧客名 | 商品名 | 単価 |
|---|---|---|---|---|
| C001 | P001 | 田中太郎 | ノートPC | 100000 |
| C001 | P002 | 田中太郎 | マウス | 2000 |
→ 「顧客名」は「顧客ID」にのみ依存しており、
主キー(顧客ID+商品ID)の一部に依存している。
✅ 第2正規形の例:
顧客マスタ
| 顧客ID | 顧客名 |
|---|---|
| C001 | 田中太郎 |
| C002 | 鈴木花子 |
商品マスタ
| 商品ID | 商品名 | 単価 |
|---|---|---|
| P001 | ノートPC | 100000 |
| P002 | マウス | 2000 |
購入履歴
| 顧客ID | 商品ID |
|---|---|
| C001 | P001 |
| C001 | P002 |
| C002 | P002 |
→ 部分依存が排除され、冗長性がなくなった。
第3正規形(3NF):推移的関数従属の排除
● ルール
- 主キー以外の列が、他の非キー列に依存してはいけない。
❌ 第2正規形の例:
| 商品ID | 商品名 | カテゴリID | カテゴリ名 |
|---|---|---|---|
| P001 | ノートPC | C01 | コンピュータ |
| P002 | マウス | C01 | コンピュータ |
| P003 | スマートフォン | C02 | モバイル |
→ 「カテゴリ名」は「カテゴリID」に依存している(推移的従属)。
✅ 第3正規形の例:
商品マスタ
| 商品ID | 商品名 | カテゴリID |
|---|---|---|
| P001 | ノートPC | C01 |
| P002 | マウス | C01 |
| P003 | スマートフォン | C02 |
カテゴリマスタ
| カテゴリID | カテゴリ名 |
|---|---|
| C01 | コンピュータ |
| C02 | モバイル |
→ 推移的従属を分離し、更新・削除時の不整合を防止。
第4正規形(4NF):多値従属の排除
● ルール
- 主キーに対して、複数の独立した繰り返し属性を持つ場合は分離する。
- 「一つの主キーに対し、複数の異なる多対多関係」があるケースが対象。
❌ 第3正規形の例:
| 顧客ID | 商品ID | 連絡先 |
|---|---|---|
| C001 | P001 | 080-1111-2222 |
| C001 | P001 | 090-3333-4444 |
| C001 | P002 | 080-1111-2222 |
| C001 | P002 | 090-3333-4444 |
→ 顧客IDごとに「複数の商品」と「複数の連絡先」が独立して存在。
組み合わせが不必要に膨大になっている。
✅ 第4正規形の例:
顧客商品テーブル
| 顧客ID | 商品ID |
|---|---|
| C001 | P001 |
| C001 | P002 |
顧客連絡先テーブル
| 顧客ID | 連絡先 |
|---|---|
| C001 | 080-1111-2222 |
| C001 | 090-3333-4444 |
→ 「商品」と「連絡先」は独立した関係なので分離。
これで多値従属が解消され、データが簡潔になる。
第5正規形(5NF):結合従属の排除
● ルール
- すべての結合が主キーに基づいて復元可能であること。
- 不必要な結合や冗長な関係を排除する。
- 3つ以上のテーブル間に成り立つ複雑な多対多関係を最小単位に分割。
❌ 第4正規形の例:
| 商品ID | 仕入先ID | 配送業者ID |
|---|---|---|
| P001 | S01 | D01 |
| P001 | S02 | D01 |
| P001 | S01 | D02 |
→ 「商品」「仕入先」「配送業者」の関係が混在しており、
どの組み合わせが有効なのか曖昧。
✅ 第5正規形の例:
商品-仕入先テーブル
| 商品ID | 仕入先ID |
|---|---|
| P001 | S01 |
| P001 | S02 |
商品-配送業者テーブル
| 商品ID | 配送業者ID |
|---|---|
| P001 | D01 |
| P001 | D02 |
仕入先-配送業者テーブル(必要な場合)
| 仕入先ID | 配送業者ID |
|---|---|
| S01 | D01 |
| S02 | D02 |
→ 各関係を独立して保持し、
不要な結合や不整合を防止。これが第5正規形です。
正規化まとめ
| 正規形 | 主な目的 | 対応する従属関係 | 設計上の効果 |
|---|---|---|---|
| 第1正規形 | 繰り返しの排除 | 繰り返し属性 | データを1件1行に整える |
| 第2正規形 | 部分関数従属の排除 | 部分関数従属 | 主キーの一部に依存する項目を分離 |
| 第3正規形 | 推移的従属の排除 | 推移的関数従属 | 非キー属性間の依存を排除 |
| 第4正規形 | 多値従属の排除 | 多値従属 | 独立した繰り返しを分離 |
| 第5正規形 | 結合従属の排除 | 結合従属 | 不要な結合・冗長関係を除去 |
補足:実務上のポイント
- 多くの業務システムでは、第3正規形までで十分。
- 第4・第5正規形は、分析DBやマスタ統合などで役立つ。
- 過度な正規化はJOINが増えパフォーマンス低下を招くため、
場合によっては意図的に非正規化する設計も必要。
Midjourneyプロンプト
Data being inserted into a database, digital data flow, glowing binary streams, futuristic interface, server room environment, precision, focused and technical mood, isometric composition, cool blue lighting, –no text::5 –ar 16:9 –q 2 –s 750


コメント