データベース設計における正規化は、データの冗長性を減らし、データの整合性を保つために行うプロセスです。正規化にはいくつかの段階があり、主に第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)がよく使われます。以下では、それぞれの正規化の定義と例を解説します。
第一正規化(1NF)
定義
第一正規化(1NF)は、以下の要件を満たすようにテーブルを整えることです:
1. 各列の値は一つ:各列には分割できない単一の値のみが含まれること。
2. 各行が一意である:テーブル内の各行が一意であり、重複がないこと。
3. 列の順序が無関係:列の順序がデータの意味に影響を与えないこと。
例
以下のような、複数の値が1つのセルに入っているテーブルは第一正規化されていません。
顧客ID | 名前 | 注文商品 |
---|---|---|
1 | 田中太郎 | パソコン, スマホ |
2 | 鈴木一郎 | テレビ |
3 | 佐藤花子 | スマホ, タブレット |
第一正規化後は、各セルに1つの値のみが入るようにします。
顧客ID | 名前 | 注文商品 |
---|---|---|
1 | 田中太郎 | パソコン |
1 | 田中太郎 | スマホ |
2 | 鈴木一郎 | テレビ |
3 | 佐藤花子 | スマホ |
3 | 佐藤花子 | タブレット |
第二正規化(2NF)
定義
第二正規化(2NF)は、以下の要件を満たすようにテーブルを整えることです:
1. 第一正規化を満たしていること。
2. 部分関数従属を排除すること:すべての非キー属性が主キー全体に対して完全に依存していること。主キーの一部にだけ依存するような属性が存在してはいけません。
例
以下のテーブルでは、注文IDと商品名の組み合わせが主キーですが、顧客名は部分的に従属しています。
注文ID | 商品名 | 顧客名 |
---|---|---|
1 | パソコン | 田中太郎 |
1 | スマホ | 田中太郎 |
2 | テレビ | 鈴木一郎 |
3 | スマホ | 佐藤花子 |
3 | タブレット | 佐藤花子 |
第二正規化するために、顧客情報を別のテーブルに分けます。
注文テーブル:
注文ID | 商品名 |
---|---|
1 | パソコン |
1 | スマホ |
2 | テレビ |
3 | スマホ |
3 | タブレット |
顧客テーブル:
顧客ID | 顧客名 |
---|---|
1 | 田中太郎 |
2 | 鈴木一郎 |
3 | 佐藤花子 |
第三正規化(3NF)
定義
第三正規化(3NF)は、以下の要件を満たすようにテーブルを整えることです:
1. 第二正規化を満たしていること。
2. 推移的関数従属を排除すること:非キー属性が他の非キー属性に依存しないこと。すべての非キー属性が主キーに直接依存していること。
例
以下のテーブルでは、部門IDが部門名に依存していますが、部門名が他の属性に依存しています。
社員ID | 社員名 | 部門ID | 部門名 |
---|---|---|---|
1 | 田中太郎 | 101 | 営業部 |
2 | 鈴木一郎 | 102 | 技術部 |
3 | 佐藤花子 | 101 | 営業部 |
第三正規化するために、部門情報を別のテーブルに分けます。
社員テーブル:
社員ID | 社員名 | 部門ID |
---|---|---|
1 | 田中太郎 | 101 |
2 | 鈴木一郎 | 102 |
3 | 佐藤花子 | 101 |
部門テーブル:
部門ID | 部門名 |
---|---|
101 | 営業部 |
102 | 技術部 |
まとめ
- 第一正規化(1NF):各列が単一の値を持ち、データが重複しないようにする。
- 第二正規化(2NF):部分関数従属を排除し、全ての非キー属性が主キーに完全に依存するようにする。
- 第三正規化(3NF):推移的関数従属を排除し、非キー属性が他の非キー属性に依存しないようにする。
正規化を行うことで、データの冗長性を減らし、データベースの保守性やパフォーマンスが向上します。ただし、実際の設計では、必要に応じて冗長性を許容する場合もあるため、デザインの要件に応じて適切なレベルの正規化を行うことが重要です。