データベース設計において、データの冗長性を排除し、一貫性を保つことは非常に重要です。そのための重要な手法の一つが「正規化(Normalization)」です。
正規化とは、データの整合性を確保し、更新時の異常(Update Anomaly)を防ぐために、データを適切な形に分割して管理する手法です。
本記事では、SQL Server におけるデータベース設計を前提とし、第一正規形(1NF)から第五正規形(5NF) までの各段階について詳しく解説します。また、最後に演習問題とその解答例も紹介します。
正規化の目的
データベースの正規化を行う主な目的は以下の通りです。
- データの冗長性を排除
- 同じデータが複数の場所に保存されることを防ぎ、ストレージの効率を向上させる。
- データの整合性を維持
- 更新、削除、挿入時の矛盾を防ぐ。
- データの一貫性を確保
- 異なるテーブル間で不整合が生じないようにする。
- クエリのパフォーマンスを向上
- 適切なインデックスや結合の利用により、検索速度を向上させる。
正規化の各段階
第一正規形(1NF:First Normal Form)
定義
- 各カラムの値は原子性(Atomicity) を持つ(つまり、値は分割できない単一の値である)。
- 各レコードはユニークであり、主キー(Primary Key) が定義されている。
非正規化の例
ID | 氏名 | 電話番号 |
---|---|---|
1 | 田中太郎 | 090-1234-5678, 080-9876-5432 |
2 | 鈴木一郎 | 070-1111-2222 |
1NFに正規化
ID | 氏名 | 電話番号 |
---|---|---|
1 | 田中太郎 | 090-1234-5678 |
1 | 田中太郎 | 080-9876-5432 |
2 | 鈴木一郎 | 070-1111-2222 |
👉 複数の電話番号を分割し、各カラムの値を単一化。
第二正規形(2NF:Second Normal Form)
定義
- 1NFを満たしていること。
- 主キーに部分関数従属(Partial Dependency)がないこと(主キーの一部にのみ依存するカラムを分離する)。
非正規化の例(1NFの状態)
ID | 氏名 | 商品ID | 商品名 | 価格 |
---|---|---|---|---|
1 | 田中太郎 | P001 | ノートPC | 100,000 |
1 | 田中太郎 | P002 | マウス | 3,000 |
2 | 鈴木一郎 | P001 | ノートPC | 100,000 |
2NFに正規化
顧客情報テーブル
ID | 氏名 |
---|---|
1 | 田中太郎 |
2 | 鈴木一郎 |
商品情報テーブル
商品ID | 商品名 | 価格 |
---|---|---|
P001 | ノートPC | 100,000 |
P002 | マウス | 3,000 |
購入履歴テーブル
ID | 商品ID |
---|---|
1 | P001 |
1 | P002 |
2 | P001 |
👉 顧客情報と商品情報を分離し、主キーの一部にのみ依存する属性を排除。
第三正規形(3NF:Third Normal Form)
定義
- 2NFを満たしていること。
- 推移的関数従属(Transitive Dependency)がないこと(主キー以外のカラムが、別の非キー属性に依存していない)。
非正規化の例(2NFの状態)
商品ID | 商品名 | 価格 | メーカーID | メーカー名 |
---|---|---|---|---|
P001 | ノートPC | 100,000 | M001 | A社 |
P002 | マウス | 3,000 | M002 | B社 |
3NFに正規化
商品情報テーブル
商品ID | 商品名 | 価格 | メーカーID |
---|---|---|---|
P001 | ノートPC | 100,000 | M001 |
P002 | マウス | 3,000 | M002 |
メーカー情報テーブル
メーカーID | メーカー名 |
---|---|
M001 | A社 |
M002 | B社 |
👉 メーカー名を別テーブルに分離し、冗長性を排除。
ボイス・コッド正規形(BCNF: Boyce-Codd Normal Form)
定義
- 3NFを満たしていること。
- 主キー以外の候補キー(Candidate Key)が、主キーに依存していない。
第四正規形(4NF:Fourth Normal Form)
定義
- BCNFを満たしていること。
- 多値従属(Multivalued Dependency)を排除すること。
第五正規形(5NF:Fifth Normal Form)
定義
- 4NFを満たしていること。
- データを適切に分割し、結合依存(Join Dependency)を排除すること。
演習問題と解答例
問題
以下の非正規化テーブルを3NFまで正規化してください。
注文ID | 顧客名 | 商品ID | 商品名 | メーカー名 |
---|---|---|---|---|
O001 | 田中 | P001 | ノートPC | A社 |
O001 | 田中 | P002 | マウス | B社 |
O002 | 鈴木 | P003 | キーボード | B社 |
解答
顧客テーブル
顧客ID | 顧客名 |
---|---|
C001 | 田中 |
C002 | 鈴木 |
商品テーブル
商品ID | 商品名 | メーカーID |
---|---|---|
P001 | ノートPC | M001 |
P002 | マウス | M002 |
P003 | キーボード | M002 |
メーカー情報テーブル
メーカーID | メーカー名 |
---|---|
M001 | A社 |
M002 | B社 |
注文履歴テーブル
注文ID | 顧客ID | 商品ID |
---|---|---|
O001 | C001 | P001 |
O001 | C001 | P002 |
O002 | C002 | P003 |
👉 3NFに正規化完了!