【DB設計】第3正規形について調べてみた

DBの正規化とは

DBの正規化とはDB上のデータを重複なく保存するためにDBの構造やデータの持ち方を整えていくことです。

大切なことは、ゴールがDBのデータの重複をなくすということです。

正規化を行うことで、データ更新時のパフォーマンス向上やバグ削減を行えたり、DB上でのデータの矛盾を減らしたりすることができます。

ではここから、第3正規形についてご紹介してきます。

(なおここからDBはRDBを用いる前提で用語などを使用してきます)

 

第3正規形

※第1正規形、第2正規形に関してはこちらをご参照ください。

【DB設計】第1正規形について調べてみた

【DB設計】第2正規形について調べてみた

 

考え方

第3正規形では推移的関数従属を解消することをゴールとします。

 

推移的関数従属

推移的関数従属とは、あるレコードが非主キーの値に従属している状態になります。

関数従属性は主キーにレコードが従属している状態でしたが、それの主キーではない値にレコードが従属している状態が推移的関数従属になります。

第3正規形では、テーブルに推移的関数従属がない状態にします。

言い換えると、テーブル内の全てのレコードが主キーに従属している状態になるように修正します。

では、ここから具体例を用いてご紹介します。

 

具体例

以下は、商品に関するテーブルです。

商品ID(PK) 名前 価格 カテゴリーID カテゴリー名
1 にんじん 100 1 食品
2 コップ 500 2 雑貨

カテゴリーIDとカテゴリー名に注目してください。

カテゴリー名は、カテゴリーIDが決定すればカテゴリー名も決定する関係性にあります。

つまり、カテゴリー名はカテゴリーIDに従属している形になります。

このテーブルの主キーは商品IDになるので、カテゴリー名は推移的関数従属の関係になります。

この状態の悪い部分は、商品が存在するカテゴリーしかDB上に現れない点です。

仮にキッチン用具というカテゴリーが存在したとしてもキッチン用具に紐づいた商品がない場合、DB上ではキッチン用具というカテゴリーはないものとして扱われます。

では、これを修正していきます。

 

修正

結論、カテゴリーを別テーブルに分けて外部キーで連携する形にします。

商品テーブル

商品ID(PK) 名前 価格 カテゴリーID(FK)
1 にんじん 100 1
2 コップ 500 2

カテゴリーテーブル

カテゴリーID(PK) カテゴリー名
1 食品
2 雑貨
3 キッチン用具

これで、推移的関数従属が解決し、キッチン用具もDBのデータとして現れました。

 

以上!!!!!!!!!!