
正規化(Normalization)とは、データベースの設計において、データの冗長性を減らし、整合性を保つための手法です。データの重複をなくし、データの更新や削除が容易になるように、テーブルを適切に分割するのが主な目的です。
身近な例:学生の成績管理
学校の成績を管理するシステムを考えてみましょう。
初めに、非正規(正規化していない)データを見てみます。
❌ 正規化されていないデータ
学生ID | 名前 | 科目1 | 成績1 | 科目2 | 成績2 | 科目3 | 成績3 |
---|---|---|---|---|---|---|---|
101 | 田中 | 数学 | 80 | 英語 | 85 | 理科 | 90 |
102 | 佐藤 | 数学 | 75 | 英語 | 80 | 理科 | 78 |
問題点
- データの冗長性(重複)
- 同じ「数学」「英語」などの科目情報が何度も登場する。
- 新しい科目を追加しにくい
- 例えば「歴史」という科目を追加したい場合、新しい列を追加しなければならない。
- 検索や更新が難しい
- ある学生の特定の科目の成績だけを更新するのが面倒。
第一正規形(1NF):繰り返しを排除
「科目1」「科目2」などの繰り返しフィールドを排除し、1つのデータ(レコード)には1つの値だけを持つようにします。
✅ 第一正規形(1NF)
学生ID | 名前 | 科目 | 成績 |
---|---|---|---|
101 | 田中 | 数学 | 80 |
101 | 田中 | 英語 | 85 |
101 | 田中 | 理科 | 90 |
102 | 佐藤 | 数学 | 75 |
102 | 佐藤 | 英語 | 80 |
102 | 佐藤 | 理科 | 78 |
🔹 改善点
- 新しい科目を追加するのが簡単(行を追加するだけ)。
- 科目ごとに成績を検索・更新しやすい。
第二正規形(2NF):部分関数従属を排除
1NFではまだ**「名前」列が冗長**です。学生IDが分かれば、名前も分かるため、「学生情報」と「成績情報」を分けます。
✅ 第二正規形(2NF)
学生情報テーブル
学生ID | 名前 |
---|---|
101 | 田中 |
102 | 佐藤 |
成績情報テーブル
学生ID | 科目 | 成績 |
---|---|---|
101 | 数学 | 80 |
101 | 英語 | 85 |
101 | 理科 | 90 |
102 | 数学 | 75 |
102 | 英語 | 80 |
102 | 理科 | 78 |
🔹 改善点
- 名前のデータが不要な重複を持たない。
- 学生が新たな科目を履修しても、成績情報テーブルに追加するだけ。
第三正規形(3NF):推移的関数従属を排除
もし「科目テーブル」も別に分けると、さらに効率的になります。
✅ 第三正規形(3NF)
学生情報テーブル
学生ID | 名前 |
---|---|
101 | 田中 |
102 | 佐藤 |
科目情報テーブル
科目ID | 科目名 |
---|---|
1 | 数学 |
2 | 英語 |
3 | 理科 |
成績情報テーブル
学生ID | 科目ID | 成績 |
---|---|---|
101 | 1 | 80 |
101 | 2 | 85 |
101 | 3 | 90 |
102 | 1 | 75 |
102 | 2 | 80 |
102 | 3 | 78 |
🔹 改善点
- 科目情報も統一できるため、例えば「数学」の名前を「算数」に変更したい場合、1か所修正すれば全てのデータが変更される。
まとめ
段階 | 内容 | 例 |
---|---|---|
1NF | 繰り返しを排除 | 1レコード1値にする |
2NF | 部分関数従属を排除 | 学生情報と成績情報を分ける |
3NF | 推移的関数従属を排除 | 科目情報を分ける |
正規化を進めるとデータの冗長性が減り、更新や検索がしやすくなります。
※●NF:● Normal Form