データベース設計において、正規化は欠かせない重要なプロセスです。適切に正規化を行うことで、データの冗長性を減らし、整合性を保つことができます。この記事では、正規化の基本から、第一正規形 (1NF)、第二正規形 (2NF)、第三正規形 (3NF) の具体的な内容までをわかりやすく解説します。
目次
正規化とは?
正規化とは、データベースのテーブルを効率的に設計し、データの無駄や矛盾を防ぐための手法です。データの構造を適切に整理することで、以下のメリットがあります:
- データの冗長性を削減:同じデータが複数箇所に保存されるのを防ぐ。
- データの整合性を向上:更新や削除時に発生する矛盾を回避。
- データ操作の効率化:テーブル間の関係性が明確になるため、検索や更新が容易になる。
正規化には複数の段階があり、それぞれを「正規形」と呼びます。一般的には、第一正規形から第三正規形までを満たすことで、十分なデータベース設計が行えるとされています。
第一正規形 (1NF): データを「原子化」する
第一正規形では、テーブルのすべての列において「値が原子単位であること」が求められます。
簡単に言うと、1つのセルに複数の値を含めてはいけないというルールです。
例:原子化されていないテーブル
ID | 名前 | 趣味 |
---|---|---|
1 | 太郎 | サッカー, 野球 |
2 | 花子 | 映画鑑賞 |
この状態では「趣味」の列に複数の値が入っているため、第一正規形を満たしていません。
第一正規形に変換した例
ID | 名前 | 趣味 |
---|---|---|
1 | 太郎 | サッカー |
1 | 太郎 | 野球 |
2 | 花子 | 映画鑑賞 |
このように、1つのセルに1つの値しか入らないようにする必要があります。
第二正規形 (2NF): 部分関数従属を排除する
第二正規形では、「すべての非キー属性が主キー全体に完全に依存していること」が求められます。部分的にしか依存していない場合、別のテーブルに分割します。
例:部分関数従属があるテーブル
学生ID | コースID | 学生名 | コース名 |
---|---|---|---|
1 | A | 太郎 | 数学 |
2 | B | 花子 | 英語 |
この場合、以下の問題が発生します:
- 「学生名」は学生IDにのみ依存しており、コースIDとは関係ありません。
- 「コース名」はコースIDにのみ依存しており、学生IDとは関係ありません。
第二正規形に変換した例
- 学生テーブル学生ID学生名1太郎2花子
- コーステーブルコースIDコース名A数学B英語
- 登録テーブル学生IDコースID1A2B
これにより、データの冗長性が削減されました。
第三正規形 (3NF): 推移的関数従属を排除する
第三正規形では、「非キー属性が他の非キー属性に依存しないこと」が求められます。つまり、非キー属性は主キーに直接依存する必要があります。
例:推移的関数従属があるテーブル
社員ID | 部署ID | 部署名 |
---|---|---|
1 | D1 | 営業 |
2 | D2 | 開発 |
この場合、以下の問題があります:
- 「部署名」は「部署ID」に依存していますが、「社員ID」とは直接関係がありません。
第三正規形に変換した例
- 社員テーブル社員ID部署ID1D12D2
- 部署テーブル部署ID部署名D1営業D2開発
このように分割することで、「社員ID」と「部署名」の間に間接的な関係がなくなり、データの整合性が向上します。
正規化のまとめ
正規形 | 条件 |
---|---|
第一正規形 (1NF) | 各列の値が原子化され、1セルに1値のみ含む。 |
第二正規形 (2NF) | 部分関数従属を排除し、主キー全体に完全依存。 |
第三正規形 (3NF) | 推移的関数従属を排除し、非キー属性が主キーに直接依存。 |
正規化はどこまでやればいいの?
正規化は冗長性や整合性の問題を解決しますが、実際の設計では「過度な正規化」が問題になることもあります。特に、大量のデータを扱うシステムでは、正規化しすぎるとパフォーマンスが低下する場合があります。そのため、システムの要件に応じて、正規化と非正規化をバランスよく適用することが重要です。
これで正規化の基本的な流れとその意義が理解できたと思います。データベース設計の際にぜひ役立ててみてください!