Table of Contents
はじめに
データベース設計をしていると、必ず耳にするのが「正規化」という言葉です。
でも、「正規化って何?」「なぜ必要なの?」と疑問に思ったことはありませんか?
この記事では、正規化の基本から、第1正規形〜第3正規形までを、初心者向けにわかりやすく解説します!
正規化とは?
正規化とは、データベースのテーブル設計において、データの重複や不整合を防ぎ、保守性や効率性を高めるためのルール・手法のことです。
正規化を行うことで:
- データの重複を減らせる
- 更新・削除時の矛盾を防げる
- 保守・拡張がしやすくなる
といったメリットがあります。
正規化が必要な理由
例として、以下のような顧客・注文データのテーブルを考えてみましょう。
顧客ID | 顧客名 | 注文ID | 商品名 |
---|---|---|---|
1 | 田中 | 101 | ノートPC |
1 | 田中 | 102 | マウス |
2 | 鈴木 | 103 | ディスプレイ |
このままだと、顧客名が重複していたり、商品情報が散らばっていて、データの整合性を保ちにくくなります。
そこで正規化を行い、意味のある単位に分割することで、扱いやすい構造に改善します。
第1正規形(1NF):繰り返しの排除
条件: 「繰り返しの項目がない」「すべての列が単一の値」
NGな例:
注文ID | 顧客名 | 商品名 |
---|---|---|
101 | 田中 | ノートPC, マウス |
→ 商品名に複数の値が入っているのでNG。
OKな例(第1正規形):
注文ID | 顧客名 | 商品名 |
---|---|---|
101 | 田中 | ノートPC |
101 | 田中 | マウス |
第2正規形(2NF):主キーの一部に依存する列の分離
条件: 「1NFを満たしている」+「主キーの一部にだけ依存する列がない」
NGな例:
注文ID | 商品ID | 商品名 | 価格 |
---|---|---|---|
101 | A1 | ノートPC | 100000 |
101 | A2 | マウス | 3000 |
→ 「商品名」「価格」は商品IDだけに依存しているのに、注文IDも主キーに含まれている。
OKな例(第2正規形):
注文テーブル
注文ID | 商品ID |
---|---|
101 | A1 |
101 | A2 |
商品テーブル
商品ID | 商品名 | 価格 |
---|---|---|
A1 | ノートPC | 100000 |
A2 | マウス | 3000 |
第3正規形(3NF):非キー項目間の依存の排除
条件: 「2NFを満たしている」+「主キー以外の項目同士に依存関係がない」
NGな例:
顧客ID | 顧客名 | 郵便番号 | 都道府県 |
---|---|---|---|
1 | 田中 | 100-0001 | 東京都 |
→ 「郵便番号」→「都道府県」という主キー以外の列同士に依存関係がある。
OKな例(第3正規形):
顧客テーブル
顧客ID | 顧客名 | 郵便番号 |
---|---|---|
1 | 田中 | 100-0001 |
郵便番号マスタ
郵便番号 | 都道府県 |
---|---|
100-0001 | 東京都 |
まとめ
正規形 | ポイント |
---|---|
第1正規形 | 繰り返しの排除 |
第2正規形 | 主キーの一部に依存する列の分離 |
第3正規形 | 非キー項目間の依存を排除 |
正規化は、システムが大きくなるほど効力を発揮します。
ただし、正規化はやりすぎるとJOINが増えパフォーマンスが落ちることもあるので、目的に応じた設計が大切です。