😽
正規化の基本(第1〜第3正規形)
正規化の基本(第1〜第3正規形)
正規化(Normalization)とは、データの冗長性(重複)を排除し、データ整合性を保つためのデータベース設計手法です。正規化を行うことで、無駄なデータの重複を減らし、更新や管理を効率化できます。
ここでは、第1正規形(1NF)、第2正規形(2NF)、第3正規形(3NF) について解説します。具体例を交えながら進めるので理解が深まるはずです。
第1正規形(1NF): 重複データを排除する
ルール
- 1つのテーブルの各カラムには単一の値のみを格納すること。
- 同じカラムに複数の値や繰り返しグループ(重複データ)が存在しないこと。
例: 非正規形のテーブル
以下は、商品情報とその仕入先が含まれたテーブルです。
商品ID | 商品名 | 仕入先名 | 仕入先電話番号 |
---|---|---|---|
1 | ノートPC | A商店, B商店 | 03-1111-1111, 03-2222-2222 |
2 | スマートフォン | C商店 | 03-3333-3333 |
問題点
- **「仕入先名」と「仕入先電話番号」**に複数の値が格納されています。
→ これは非正規形であり、データの取得や更新が難しくなります。
第1正規形(1NF)の適用
1つのカラムに1つの値のみを持たせるようにデータを分割します。
商品ID | 商品名 | 仕入先名 | 仕入先電話番号 |
---|---|---|---|
1 | ノートPC | A商店 | 03-1111-1111 |
1 | ノートPC | B商店 | 03-2222-2222 |
2 | スマートフォン | C商店 | 03-3333-3333 |
ポイント:
- データを1つの値に分割し、繰り返しグループを排除しました。
- 各カラムが「1つの値」を持つ形になりました。
第2正規形(2NF): 主キーに完全依存する
ルール
- 第1正規形を満たすこと。
- 主キーに対してすべてのカラムが完全依存していること。
- 部分関数従属(主キーの一部に依存するカラム)が存在しないこと。
例: 第1正規形のテーブル
第1正規形にしたテーブルを再度確認します。
商品ID | 商品名 | 仕入先名 | 仕入先電話番号 |
---|---|---|---|
1 | ノートPC | A商店 | 03-1111-1111 |
1 | ノートPC | B商店 | 03-2222-2222 |
2 | スマートフォン | C商店 | 03-3333-3333 |
問題点
- 「商品名」は「商品ID」に依存しますが、
「仕入先名」と「仕入先電話番号」は「商品ID」単独ではなく「商品IDと仕入先名」の組み合わせに依存しています。
→ これが「部分関数従属」です。
第2正規形(2NF)の適用
テーブルを2つに分割し、「商品ID」と「仕入先名」の依存関係を整理します。
商品テーブル
商品ID | 商品名 |
---|---|
1 | ノートPC |
2 | スマートフォン |
仕入先テーブル
商品ID | 仕入先名 | 仕入先電話番号 |
---|---|---|
1 | A商店 | 03-1111-1111 |
1 | B商店 | 03-2222-2222 |
2 | C商店 | 03-3333-3333 |
ポイント:
- 主キー「商品ID」に完全に依存するカラムを1つのテーブルにまとめました。
- 間接的に依存するデータを別テーブルに分割しました。
第3正規形(3NF): 主キー以外のカラムに依存しない
ルール
- 第2正規形を満たすこと。
- 主キー以外のカラム同士で依存関係が存在しないこと。
例: 第2正規形のテーブル
第2正規形で作成した「仕入先テーブル」を再度確認します。
商品ID | 仕入先名 | 仕入先電話番号 |
---|---|---|
1 | A商店 | 03-1111-1111 |
1 | B商店 | 03-2222-2222 |
2 | C商店 | 03-3333-3333 |
問題点
- 「仕入先電話番号」は「仕入先名」に依存しています。
→ 主キー以外のカラム間に依存関係がある状態です。
第3正規形(3NF)の適用
「仕入先情報」を別のテーブルに分けて整理します。
商品テーブル
商品ID | 商品名 |
---|---|
1 | ノートPC |
2 | スマートフォン |
商品仕入先テーブル
商品ID | 仕入先ID |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
仕入先テーブル
仕入先ID | 仕入先名 | 仕入先電話番号 |
---|---|---|
1 | A商店 | 03-1111-1111 |
2 | B商店 | 03-2222-2222 |
3 | C商店 | 03-3333-3333 |
ポイント:
- 「仕入先電話番号」が「仕入先名」に依存するため、「仕入先テーブル」として分離しました。
- 主キー以外のカラム間に依存関係がなくなりました。
まとめ
正規化は以下のステップで行います。
- 第1正規形: カラムに1つの値のみを格納し、重複データを排除する。
- 第2正規形: 主キーに対してすべてのカラムが完全依存するようにする。
- 第3正規形: 主キー以外のカラム間の依存関係をなくす。
これによって、データの冗長性を排除し、データベースの保守性と効率性が向上します。
Discussion