😽

正規化の基本(第1〜第3正規形)

2024/12/17に公開

正規化の基本(第1〜第3正規形)

正規化(Normalization)とは、データの冗長性(重複)を排除し、データ整合性を保つためのデータベース設計手法です。正規化を行うことで、無駄なデータの重複を減らし、更新や管理を効率化できます。

ここでは、第1正規形(1NF)第2正規形(2NF)第3正規形(3NF) について解説します。具体例を交えながら進めるので理解が深まるはずです。


第1正規形(1NF): 重複データを排除する

ルール

  • 1つのテーブルの各カラムには単一の値のみを格納すること。
  • 同じカラムに複数の値や繰り返しグループ(重複データ)が存在しないこと。

例: 非正規形のテーブル

以下は、商品情報とその仕入先が含まれたテーブルです。

商品ID 商品名 仕入先名 仕入先電話番号
1 ノートPC A商店, B商店 03-1111-1111, 03-2222-2222
2 スマートフォン C商店 03-3333-3333

問題点

  • **「仕入先名」「仕入先電話番号」**に複数の値が格納されています。
    → これは非正規形であり、データの取得や更新が難しくなります。

第1正規形(1NF)の適用

1つのカラムに1つの値のみを持たせるようにデータを分割します。

商品ID 商品名 仕入先名 仕入先電話番号
1 ノートPC A商店 03-1111-1111
1 ノートPC B商店 03-2222-2222
2 スマートフォン C商店 03-3333-3333

ポイント:

  • データを1つの値に分割し、繰り返しグループを排除しました。
  • 各カラムが「1つの値」を持つ形になりました。

第2正規形(2NF): 主キーに完全依存する

ルール

  • 第1正規形を満たすこと。
  • 主キーに対してすべてのカラムが完全依存していること。
  • 部分関数従属(主キーの一部に依存するカラム)が存在しないこと。

例: 第1正規形のテーブル

第1正規形にしたテーブルを再度確認します。

商品ID 商品名 仕入先名 仕入先電話番号
1 ノートPC A商店 03-1111-1111
1 ノートPC B商店 03-2222-2222
2 スマートフォン C商店 03-3333-3333

問題点

  • 「商品名」は「商品ID」に依存しますが、
    「仕入先名」と「仕入先電話番号」は「商品ID」単独ではなく「商品IDと仕入先名」の組み合わせに依存しています。
    → これが「部分関数従属」です。

第2正規形(2NF)の適用

テーブルを2つに分割し、「商品ID」と「仕入先名」の依存関係を整理します。

商品テーブル

商品ID 商品名
1 ノートPC
2 スマートフォン

仕入先テーブル

商品ID 仕入先名 仕入先電話番号
1 A商店 03-1111-1111
1 B商店 03-2222-2222
2 C商店 03-3333-3333

ポイント:

  • 主キー「商品ID」に完全に依存するカラムを1つのテーブルにまとめました。
  • 間接的に依存するデータを別テーブルに分割しました。

第3正規形(3NF): 主キー以外のカラムに依存しない

ルール

  • 第2正規形を満たすこと。
  • 主キー以外のカラム同士で依存関係が存在しないこと。

例: 第2正規形のテーブル

第2正規形で作成した「仕入先テーブル」を再度確認します。

商品ID 仕入先名 仕入先電話番号
1 A商店 03-1111-1111
1 B商店 03-2222-2222
2 C商店 03-3333-3333

問題点

  • 「仕入先電話番号」は「仕入先名」に依存しています。
    主キー以外のカラム間に依存関係がある状態です。

第3正規形(3NF)の適用

「仕入先情報」を別のテーブルに分けて整理します。

商品テーブル

商品ID 商品名
1 ノートPC
2 スマートフォン

商品仕入先テーブル

商品ID 仕入先ID
1 1
1 2
2 3

仕入先テーブル

仕入先ID 仕入先名 仕入先電話番号
1 A商店 03-1111-1111
2 B商店 03-2222-2222
3 C商店 03-3333-3333

ポイント:

  • 「仕入先電話番号」が「仕入先名」に依存するため、「仕入先テーブル」として分離しました。
  • 主キー以外のカラム間に依存関係がなくなりました。

まとめ

正規化は以下のステップで行います。

  1. 第1正規形: カラムに1つの値のみを格納し、重複データを排除する。
  2. 第2正規形: 主キーに対してすべてのカラムが完全依存するようにする。
  3. 第3正規形: 主キー以外のカラム間の依存関係をなくす。

これによって、データの冗長性を排除し、データベースの保守性と効率性が向上します。

Discussion