データベース正規化をわかりやすく解説!第一正規形から第三正規形まで

データベース設計において、正規化は欠かせない重要なプロセスです。適切に正規化を行うことで、データの冗長性を減らし、整合性を保つことができます。この記事では、正規化の基本から、第一正規形 (1NF)、第二正規形 (2NF)、第三正規形 (3NF) の具体的な内容までをわかりやすく解説します。


正規化とは?

正規化とは、データベースのテーブルを効率的に設計し、データの無駄や矛盾を防ぐための手法です。データの構造を適切に整理することで、以下のメリットがあります:

  • データの冗長性を削減:同じデータが複数箇所に保存されるのを防ぐ。
  • データの整合性を向上:更新や削除時に発生する矛盾を回避。
  • データ操作の効率化:テーブル間の関係性が明確になるため、検索や更新が容易になる。

正規化には複数の段階があり、それぞれを「正規形」と呼びます。一般的には、第一正規形から第三正規形までを満たすことで、十分なデータベース設計が行えるとされています。


第一正規形 (1NF): データを「原子化」する

第一正規形では、テーブルのすべての列において「値が原子単位であること」が求められます。
簡単に言うと、1つのセルに複数の値を含めてはいけないというルールです。

例:原子化されていないテーブル

ID名前趣味
1太郎サッカー, 野球
2花子映画鑑賞

この状態では「趣味」の列に複数の値が入っているため、第一正規形を満たしていません。

第一正規形に変換した例

ID名前趣味
1太郎サッカー
1太郎野球
2花子映画鑑賞

このように、1つのセルに1つの値しか入らないようにする必要があります。


第二正規形 (2NF): 部分関数従属を排除する

第二正規形では、「すべての非キー属性が主キー全体に完全に依存していること」が求められます。部分的にしか依存していない場合、別のテーブルに分割します。

例:部分関数従属があるテーブル

学生IDコースID学生名コース名
1A太郎数学
2B花子英語

この場合、以下の問題が発生します:

  • 「学生名」は学生IDにのみ依存しており、コースIDとは関係ありません。
  • 「コース名」はコースIDにのみ依存しており、学生IDとは関係ありません。

第二正規形に変換した例

  1. 学生テーブル学生ID学生名1太郎2花子
  2. コーステーブルコースIDコース名A数学B英語
  3. 登録テーブル学生IDコースID1A2B

これにより、データの冗長性が削減されました。


第三正規形 (3NF): 推移的関数従属を排除する

第三正規形では、「非キー属性が他の非キー属性に依存しないこと」が求められます。つまり、非キー属性は主キーに直接依存する必要があります。

例:推移的関数従属があるテーブル

社員ID部署ID部署名
1D1営業
2D2開発

この場合、以下の問題があります:

  • 「部署名」は「部署ID」に依存していますが、「社員ID」とは直接関係がありません。

第三正規形に変換した例

  1. 社員テーブル社員ID部署ID1D12D2
  2. 部署テーブル部署ID部署名D1営業D2開発

このように分割することで、「社員ID」と「部署名」の間に間接的な関係がなくなり、データの整合性が向上します。


正規化のまとめ

正規形条件
第一正規形 (1NF)各列の値が原子化され、1セルに1値のみ含む。
第二正規形 (2NF)部分関数従属を排除し、主キー全体に完全依存。
第三正規形 (3NF)推移的関数従属を排除し、非キー属性が主キーに直接依存。

正規化はどこまでやればいいの?

正規化は冗長性や整合性の問題を解決しますが、実際の設計では「過度な正規化」が問題になることもあります。特に、大量のデータを扱うシステムでは、正規化しすぎるとパフォーマンスが低下する場合があります。そのため、システムの要件に応じて、正規化と非正規化をバランスよく適用することが重要です。


これで正規化の基本的な流れとその意義が理解できたと思います。データベース設計の際にぜひ役立ててみてください!

上部へスクロール