【RDB】データベースの正規形

【RDB】データベースの正規形

データベースの正規形はDB設計の根幹となる知識です。

正規形は第一正規形〜第五正規形+ボイスコッド正規形があり、ここでは通常使用される第三正規形までを解説します。

正規化

正規化はデータの整合性を保ち、効率よく扱うためにデータの集合体を整理・整形することです。

データの重複を排除したり、格納するデータの種類を容易に変更できるように正規化することで、データの追加や取得、更新、削除等の操作における不整合の発生を防ぎます。

第一正規形〜第五正規形+ボイスコッド正規形とその正規化がありますが、一般的には第三正規形までが使われます。

非正規形

非正規形は正規化していないデータの集合体です。

例えば次のようなデータで、表データとしては直感的に分かりやすいですが、データベースで扱うには不十分な状態です。

購入詳細情報
購入ID 購入日 購入者 購入者(電話番号) 商品ID 商品 価格 購入個数
P0001 2024年03月24日 田中 太郎 A9A-1234-5678 I0001 りんご ¥150 5
I0002 みかん ¥80 10
I0003 メロン ¥2,500 1
P0002 2024年08月25日 佐藤 一葉 B9B-1234-5678 I0002 みかん ¥80 5
I0003 メロン ¥2,500 2

第一正規形

第一正規形は“データを単純な表形式に整形した状態”です。

単純な表形式とはセル結合のような複数列や複数行を対象とする表現がなく、各属性に1つの値を格納した状態です。

購入詳細情報
[PK] 購入ID 購入日 購入者 購入者(電話番号) [PK] 商品ID 商品 価格 購入個数
P0001 2024年03月24日 田中 太郎 A9A-1234-5678 I0001 りんご ¥150 5
P0001 2024年03月24日 田中 太郎 A9A-1234-5678 I0002 みかん ¥80 10
P0001 2024年03月24日 田中 太郎 A9A-1234-5678 I0003 メロン ¥2,500 1
P0002 2024年08月25日 佐藤 一葉 B9B-1234-5678 I0002 みかん ¥80 5
P0002 2024年08月25日 佐藤 一葉 B9B-1234-5678 I0003 メロン ¥2,500 2

この正規形にすることで、データベースで扱えるデータ形式になります。

しかし、まだ非効率なデータのため、実用的ではありません。

第二正規形

第二正規形は“部分関数従属性を排除した状態”です。

第一正規形では主キーは{ 購入ID , 商品ID }となっており、次の部分関数従属性があります。

  • 購入ID → 購入日
  • 購入ID → 購入者
  • 購入ID → 購入者(電話番号)
  • 商品ID → 商品
  • 商品ID → 価格

これらの部分関数従属性を排除し、重複データを整理すると次の3つに分割できます。

購入詳細情報
[PK] 購入ID [PK] 商品ID 購入個数
P0001 I0001 5
P0001 I0002 10
P0001 I0003 1
P0002 I0002 5
P0002 I0003 2
購入情報
[PK] 購入ID 購入日 購入者 購入者(電話番号)
P0001 2024年03月24日 田中 太郎 A9A-1234-5678
P0002 2024年08月25日 佐藤 一葉 B9B-1234-5678
商品情報
[PK] 商品ID 商品 価格
I0001 りんご ¥150
I0002 みかん ¥80
I0003 メロン ¥2,500

この状態が第二正規形になります。

第三正規形

第三正規形は“推移的関数従属性を排除した状態”です。

上記の購入情報は次のように推移的関数従属が存在します。

  • 購入ID → 購入者
  • 購入者 → 購入者(電話番号)

この推移的関数従属性を排除し、必要に応じて属性を追加します。

購入詳細情報
[PK] 購入ID [PK] 商品ID 購入個数
P0001 I0001 5
P0001 I0002 10
P0001 I0003 1
P0002 I0002 5
P0002 I0003 2
購入情報
[PK] 購入ID 購入日 購入者ID
P0001 2024年03月24日 U0001
P0002 2024年08月25日 U0002
購入者情報
[PK] 購入者ID 購入者 電話番号
U0001 田中 太郎 A9A-1234-5678
U0002 佐藤 一葉 B9B-1234-5678
商品情報
[PK] 商品ID 商品 価格
I0001 りんご ¥150
I0002 みかん ¥80
I0003 メロン ¥2,500

この各関係スキーマが完全関数従属になっており、推移的関数従属が排除された状態が第三正規形になります。