リレーショナルデータベースの正規化
正規化とは、データベース設計においてデータの冗長性を減らし、データの整合性を向上させるプロセスです。主に第1正規形(1NF)、第2正規形(2NF)、第3正規形(3NF)の3段階があります。
非正規形(正規化前のデータ)
正規化前のデータには、繰り返しグループや冗長なデータが含まれています。
| 注文ID |
顧客ID |
顧客名 |
顧客住所 |
商品1ID |
商品1名 |
商品1価格 |
商品1数量 |
商品2ID |
商品2名 |
商品2価格 |
商品2数量 |
| 1001 |
C101 |
田中太郎 |
東京都新宿区 |
P001 |
ノートPC |
80000 |
1 |
P002 |
マウス |
3000 |
2 |
| 1002 |
C102 |
鈴木花子 |
大阪府大阪市 |
P003 |
キーボード |
5000 |
1 |
P001 |
ノートPC |
80000 |
1 |
| 1003 |
C101 |
田中太郎 |
東京都新宿区 |
P002 |
マウス |
3000 |
1 |
null |
null |
null |
null |
問題点:
- 繰り返しグループがある(商品1、商品2...)
- データの冗長性(田中太郎の情報が重複)
- null値の多用
- データ更新時の整合性問題(例: 田中太郎の住所変更時に複数箇所の更新が必要)
↓
第1正規形 (1NF)
第1正規形は、繰り返しグループを排除し、各セルが原子的(分割できない)値のみを持つようにします。
| 注文ID |
顧客ID |
顧客名 |
顧客住所 |
商品ID |
商品名 |
価格 |
数量 |
| 1001 |
C101 |
田中太郎 |
東京都新宿区 |
P001 |
ノートPC |
80000 |
1 |
| 1001 |
C101 |
田中太郎 |
東京都新宿区 |
P002 |
マウス |
3000 |
2 |
| 1002 |
C102 |
鈴木花子 |
大阪府大阪市 |
P003 |
キーボード |
5000 |
1 |
| 1002 |
C102 |
鈴木花子 |
大阪府大阪市 |
P001 |
ノートPC |
80000 |
1 |
| 1003 |
C101 |
田中太郎 |
東京都新宿区 |
P002 |
マウス |
3000 |
1 |
改善点:
- 繰り返しグループの排除
- 各セルは単一の値のみを持つ
残っている問題点:
- まだデータの冗長性が存在(顧客情報、商品情報の重複)
↓
第2正規形 (2NF)
第2正規形は、第1正規形を満たし、かつ部分関数従属性を排除します。非キー属性がプライマリキー全体に完全関数従属している状態です。
注文ヘッダーテーブル
| 注文ID |
顧客ID |
| 1001 |
C101 |
| 1002 |
C102 |
| 1003 |
C101 |
注文詳細テーブル
| 注文ID |
商品ID |
数量 |
| 1001 |
P001 |
1 |
| 1001 |
P002 |
2 |
| 1002 |
P003 |
1 |
| 1002 |
P001 |
1 |
| 1003 |
P002 |
1 |
顧客テーブル
| 顧客ID |
顧客名 |
顧客住所 |
| C101 |
田中太郎 |
東京都新宿区 |
| C102 |
鈴木花子 |
大阪府大阪市 |
商品テーブル
| 商品ID |
商品名 |
価格 |
| P001 |
ノートPC |
80000 |
| P002 |
マウス |
3000 |
| P003 |
キーボード |
5000 |
改善点:
- 主キーに部分的に依存する属性を分離
- 顧客情報(顧客ID、顧客名、顧客住所)は顧客IDにのみ依存するため分離
- 商品情報(商品ID、商品名、価格)は商品IDにのみ依存するため分離
残っている問題点:
- 非キー属性間の従属関係がまだ存在(住所情報は顧客IDに直接関連しない)
↓
第3正規形 (3NF)
第3正規形は、第2正規形を満たし、かつ推移的関数従属性を排除します。非キー属性は、キーに直接依存し、他の非キー属性に依存しない状態です。
注文ヘッダーテーブル
| 注文ID |
顧客ID |
| 1001 |
C101 |
| 1002 |
C102 |
| 1003 |
C101 |
注文詳細テーブル
| 注文ID |
商品ID |
数量 |
| 1001 |
P001 |
1 |
| 1001 |
P002 |
2 |
| 1002 |
P003 |
1 |
| 1002 |
P001 |
1 |
| 1003 |
P002 |
1 |
顧客テーブル
| 顧客ID |
顧客名 |
住所ID |
| C101 |
田中太郎 |
A001 |
| C102 |
鈴木花子 |
A002 |
住所テーブル
| 住所ID |
住所詳細 |
| A001 |
東京都新宿区 |
| A002 |
大阪府大阪市 |
商品テーブル
| 商品ID |
商品名 |
価格 |
| P001 |
ノートPC |
80000 |
| P002 |
マウス |
3000 |
| P003 |
キーボード |
5000 |
改善点:
- 推移的関数従属性の排除
- 「住所詳細」は「住所ID」に依存し、「住所ID」は「顧客ID」に依存するため、住所情報を分離
正規化の主なメリット:
- データの冗長性の削減
- データの整合性の向上(例: 住所変更時に1箇所の更新で済む)
- データベース構造の柔軟性の向上
- 効率的なデータ操作と保守