第一正規形 (1NF) から第三正規形 (3NF) までの変更例をステップごとに具体的に説明します。
1. 非正規形の表
まず、非正規形 (未正規化) の表は、繰り返しのグループや複数の値が1つのセルに入っていることが特徴です。
非正規形の例:
ID | 名前 | 電話番号 | 趣味 |
---|---|---|---|
1 | 佐藤太郎 | 090-1111-2222, 080-3333-4444 | サッカー, 料理 |
2 | 鈴木一郎 | 090-5555-6666 | 音楽 |
- 「電話番号」や「趣味」列には複数の値が含まれているため、非正規形です。
2. 第一正規形 (1NF)
第一正規形 (1NF) では、各列に1つの値しか持たないようにし、繰り返しのグループを解消します。複数の値がある場合は、行を分割します。
1NFの例:
ID | 名前 | 電話番号 | 趣味 |
---|---|---|---|
1 | 佐藤太郎 | 090-1111-2222 | サッカー |
1 | 佐藤太郎 | 080-3333-4444 | 料理 |
2 | 鈴木一郎 | 090-5555-6666 | 音楽 |
- 各セルが単一の値になっています。
3. 第二正規形 (2NF)
第二正規形 (2NF) では、1NFを満たしつつ、部分関数従属を取り除きます。つまり、複合キーの一部に依存する列を分離します。ここで、複合キー(ID と 電話番号)の一部である「ID」が「名前」に関して完全関数従属しており、「電話番号」には関係ないため、表を分割します。
2NFの例:
1. 「個人情報」テーブル
ID | 名前 |
---|---|
1 | 佐藤太郎 |
2 | 鈴木一郎 |
2. 「連絡先」テーブル
ID | 電話番号 |
---|---|
1 | 090-1111-2222 |
1 | 080-3333-4444 |
2 | 090-5555-6666 |
3. 「趣味」テーブル
ID | 趣味 |
---|---|
1 | サッカー |
1 | 料理 |
2 | 音楽 |
- 「名前」は「ID」に完全依存しているため、「個人情報」テーブルに分離されました。
- 「電話番号」と「趣味」は「ID」に依存していますが、相互に依存しないので別々のテーブルに分けました。
4. 第三正規形 (3NF)
第三正規形 (3NF) では、2NFを満たしつつ、推移的関数従属を取り除きます。推移的従属とは、ある列が主キーに依存している他の列に依存している場合です。今回の例では、「名前」は直接「ID」に依存しており、推移的従属がないため、2NFのままで3NFも満たしています。
ただし、例として住所を追加して推移的従属を説明します。
2NFから3NFへの変更例:
もし「住所」が名前に依存している場合、次のような表になります:
2NF (推移的従属あり)
ID | 名前 | 住所 |
---|---|---|
1 | 佐藤太郎 | 東京都 |
2 | 鈴木一郎 | 大阪府 |
この場合、「住所」は「ID」ではなく「名前」に依存しているため、推移的従属が発生しています。これを解消するために、住所を別のテーブルに分けます。
3NF (推移的従属を解消)
ID | 名前 |
---|---|
1 | 佐藤太郎 |
2 | 鈴木一郎 |
名前 | 住所 |
---|---|
佐藤太郎 | 東京都 |
鈴木一郎 | 大阪府 |
最終的なまとめ
- 非正規形 → 複数の値が1つのセルに入っている。
- 第一正規形 (1NF) → 各セルに単一の値しか入れない。
- 第二正規形 (2NF) → 部分関数従属を解消して、複合キーの一部に依存している列を分離。
- 第三正規形 (3NF) → 推移的従属を解消し、列が直接主キーにのみ依存するように分割。
この流れで正規化を進めることで、データの冗長性を減らし、更新時の異常が起こりにくい設計ができます。