正規化について
第1正規化 (1NF)
ポイント
- 繰り返しの属性を排除する
- テーブルは同じカラムを複数持てない
例1) 繰り返しの列を分割して行にする方法
🔹 第1正規化前のテーブル
学生ID | 氏名 | 電話番号1 | 電話番号2 |
---|---|---|---|
1 | 佐藤太郎 | 090-1234-5678 | 080-1111-2222 |
2 | 鈴木花子 | 070-3333-4444 | NULL |
🔸 第1正規化後のテーブル
学生ID | 氏名 | 電話番号 |
---|---|---|
1 | 佐藤太郎 | 090-1234-5678 |
1 | 佐藤太郎 | 080-1111-2222 |
2 | 鈴木花子 | 070-3333-4444 |
例2) 別のテーブルに分ける方法
🔹 第1正規化前のテーブル
学生ID | 氏名 |
---|---|
1 | 佐藤太郎 |
2 | 鈴木花子 |
🔸 第1正規化後のテーブル
学生テーブル
学生ID | 氏名 |
---|---|
1 | 佐藤太郎 |
2 | 鈴木花子 |
電話番号テーブル
電話番号ID | 学生ID | 電話番号 |
---|---|---|
1 | 1 | 090-1234-5678 |
2 | 1 | 080-1111-2222 |
3 | 2 | 070-3333-4444 |
💡 学生IDを外部キーにする
第2正規化 (2NF)
ポイント
- 部分的な主キーへの従属を無くす
例
🔹 第2正規化前のテーブル
学生ID | 講座ID | 学生名 | 講座名 | 成績 |
---|---|---|---|---|
1 | A01 | 佐藤太郎 | 数学基礎 | 80 |
1 | B02 | 佐藤太郎 | 英語リーディング | 90 |
2 | A01 | 鈴木花子 | 数学基礎 | 85 |
- 主キーは 学生ID + 講座ID の複合キー
- 「学生名」は学生IDにのみ依存、「講座名」は講座IDにのみ依存
- 👉 これは部分関数従属であり、第2正規化で排除する
🔸 第2正規化後のテーブル
学生テーブル
学生ID | 学生名 |
---|---|
1 | 佐藤太郎 |
2 | 鈴木花子 |
講座テーブル
講座ID | 講座名 |
---|---|
A01 | 数学基礎 |
B02 | 英語リーディング |
成績テーブル
学生ID | 講座ID | 成績 |
---|---|---|
1 | A01 | 80 |
1 | B02 | 90 |
2 | A01 | 85 |
第3正規化 (3NF)
ポイント
- 非キー → 非キーの従属を解消する(推移的関数従属の排除)
例
🔹 第3正規化前のテーブル
社員ID | 社員名 | 部署ID | 部署名 |
---|---|---|---|
1 | 佐藤太郎 | D01 | 営業部 |
2 | 鈴木花子 | D02 | 開発部 |
3 | 高橋一郎 | D01 | 営業部 |
- 主キーは社員ID
- 「部署名」は「部署ID」に依存(非キー → 非キーの従属)
🔸 第3正規化後のテーブル
社員テーブル
社員ID | 社員名 | 部署ID |
---|---|---|
1 | 佐藤太郎 | D01 |
2 | 鈴木花子 | D02 |
3 | 高橋一郎 | D01 |
部署テーブル
部署ID | 部署名 |
---|---|
D01 | 営業部 |
D02 | 開発部 |