【DB設計】第3正規形について調べてみた
DBの正規化とは
DBの正規化とはDB上のデータを重複なく保存するためにDBの構造やデータの持ち方を整えていくことです。
大切なことは、ゴールがDBのデータの重複をなくすということです。
正規化を行うことで、データ更新時のパフォーマンス向上やバグ削減を行えたり、DB上でのデータの矛盾を減らしたりすることができます。
ではここから、第3正規形についてご紹介してきます。
(なおここからDBはRDBを用いる前提で用語などを使用してきます)
第3正規形
※第1正規形、第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のデータとして現れました。
以上!!!!!!!!!!