正規化とは何か?
データベース正規化(Normalization)は、データの重複を最小化し、データの整合性を高めるためにテーブル構造を体系的に改善するプロセスです。1970年代にエドガー・コッドが提案したこの理論は、現在でもリレーショナルデータベース設計の根幹となっています。
正規化を行わないと、3つの**異常(Anomaly)**現象が発生します:
- 挿入異常: データ挿入時に意図しないデータが一緒に挿入される問題
- 削除異常: データ削除時に意図せず他のデータも削除される問題
- 更新異常: データ更新時に一部のみ更新されデータ不整合が生じる問題
第1正規形(1NF):原子性の保証
1NF条件: 全カラムの値は原子値(Atomic Value)でなければなりません。一つのカラムに複数の値を入れてはいけません。
1NF違反の例:
| 注文ID | 顧客名 | 商品リスト |
|---|---|---|
| 1 | 田中太郎 | ノートPC, マウス |
| 2 | 鈴木花子 | キーボード |
1NF適用後:
| 注文ID | 顧客名 | 商品 |
|---|---|---|
| 1 | 田中太郎 | ノートPC |
| 1 | 田中太郎 | マウス |
| 2 | 鈴木花子 | キーボード |
第2正規形(2NF):部分関数従属の排除
2NF条件: 1NFを満たし、すべての非主キー属性が主キーに完全関数従属していること。
2NF違反の例:
| 注文ID | 商品ID | 顧客名 | 商品名 | 数量 |
|---|---|---|---|---|
| 1 | A | 田中太郎 | ノートPC | 1 |
ここで主キーは(注文ID, 商品ID)ですが、「顧客名」は注文IDのみに依存し、「商品名」は商品IDのみに依存します。これが部分関数従属です。
2NF適用後:
注文テーブル、商品テーブル、注文明細テーブルに分割します。
第3正規形(3NF):推移的関数従属の排除
3NF条件: 2NFを満たし、すべての非主キー属性が主キーに推移的に従属しないこと。
A → B → C形式の依存関係がないことが条件です。
3NF違反の例:
| 学生ID | 学生名 | 学科コード | 学科名 |
|---|---|---|---|
| 1 | 山田一郎 | CS | コンピュータ工学 |
「学科名」は「学科コード」に従属し、「学科コード」は「学生ID」に従属するため、「学科名」は推移的に従属します。
3NF適用後:
学生テーブルと学科テーブルに分割します。
正規化のメリットとデメリット
メリット
- データ重複の最小化、データ整合性の向上、異常現象の解消
デメリット
- JOINの増加、クエリの複雑化、パフォーマンスへの潜在的影響
まとめ
データベースを設計する際は、まず3NFを目標に正規化を進めましょう。ErdmatesのAI最適化機能を使えば、現在のERDの正規化違反を自動的に検出し、改善提案を受けられます。