はじめに

データベース設計をしていると、必ず耳にするのが「正規化」という言葉です。
でも、「正規化って何?」「なぜ必要なの?」と疑問に思ったことはありませんか?

この記事では、正規化の基本から、第1正規形〜第3正規形までを、初心者向けにわかりやすく解説します!

正規化とは?

正規化とは、データベースのテーブル設計において、データの重複や不整合を防ぎ、保守性や効率性を高めるためのルール・手法のことです。

正規化を行うことで:

  • データの重複を減らせる
  • 更新・削除時の矛盾を防げる
  • 保守・拡張がしやすくなる

といったメリットがあります。

正規化が必要な理由

例として、以下のような顧客・注文データのテーブルを考えてみましょう。

顧客ID顧客名注文ID商品名
1田中101ノートPC
1田中102マウス
2鈴木103ディスプレイ

このままだと、顧客名が重複していたり、商品情報が散らばっていて、データの整合性を保ちにくくなります。
そこで正規化を行い、意味のある単位に分割することで、扱いやすい構造に改善します。

第1正規形(1NF):繰り返しの排除

条件: 「繰り返しの項目がない」「すべての列が単一の値」

NGな例:

注文ID顧客名商品名
101田中ノートPC, マウス

→ 商品名に複数の値が入っているのでNG。

OKな例(第1正規形):

注文ID顧客名商品名
101田中ノートPC
101田中マウス

第2正規形(2NF):主キーの一部に依存する列の分離

条件: 「1NFを満たしている」+「主キーの一部にだけ依存する列がない

NGな例:

注文ID商品ID商品名価格
101A1ノートPC100000
101A2マウス3000

→ 「商品名」「価格」は商品IDだけに依存しているのに、注文IDも主キーに含まれている。

OKな例(第2正規形):

注文テーブル

注文ID商品ID
101A1
101A2

商品テーブル

商品ID商品名価格
A1ノートPC100000
A2マウス3000

第3正規形(3NF):非キー項目間の依存の排除

条件: 「2NFを満たしている」+「主キー以外の項目同士に依存関係がない

NGな例:

顧客ID顧客名郵便番号都道府県
1田中100-0001東京都

→ 「郵便番号」→「都道府県」という主キー以外の列同士に依存関係がある。

OKな例(第3正規形):

顧客テーブル

顧客ID顧客名郵便番号
1田中100-0001

郵便番号マスタ

郵便番号都道府県
100-0001東京都

まとめ

正規形ポイント
第1正規形繰り返しの排除
第2正規形主キーの一部に依存する列の分離
第3正規形非キー項目間の依存を排除

正規化は、システムが大きくなるほど効力を発揮します。
ただし、正規化はやりすぎるとJOINが増えパフォーマンスが落ちることもあるので、目的に応じた設計が大切です。