Grow up

生活とプログラミング

DB設計の正規化について

はじめに

今回はDB設計の基礎となる「正規化」の内容を勉強したのでまとめます。
正規化の段階を決める「関数従属性」を理解する事がポイントです。

正規化

同じデータを集約してデータ操作を効率化することです。
正規化の段階には、第1~第5正規形やボイスコッド正規形があります。
※今回の内容は一般的に使用される第1~第3正規形まで

関数従属性

列間の関係を意味します。

以下のテーブルでは「商品名」(キー)によって「単価」が一意に決定できるので「単価」は「商品名」に関数従属するといいます。

f:id:knkomko:20180930023154p:plain:w130

関数従属性には3種類あります。

1. 完全関数従属
 キーとなる列のすべての値を決めることによって、他の列の値が一意に決まる
.
2. 部分関数従属
 キーとなる列の一部の値を決めることによって、他の列の値が一意に決まる
.
3. 推移関数従属
 テーブル内にA、B、Cという列があり、Aの値によってBの値が一意に決まり、
 Bの値によってCの値が一意に決まるとき、かつ、Cの値によってAの値が一意に決まらない

.

非正規形

1行や1列の中に複数の項目が存在する場合は非正規形と呼びます。

お客様番号2000に対して販売IDが複数存在しています。
f:id:knkomko:20180930023022p:plain:w400


第1正規形

1行や1列の中に存在する複数の項目を、それぞれ別レコードとして独立します。

お客様番号2000を販売IDごと別レコードとして独立させました。
f:id:knkomko:20180930023139p:plain:w400


第2正規形

部分関数従属の項目を別テーブルにします。

2. 部分関数従属
 キーとなる列の一部の値を決めることによって、他の列の値が一意に決まる


各項目の従属関係 ※赤下線は主キーであることを表します
f:id:knkomko:20180930030754p:plain:w400


テーブルを分割させた結果は次のようになります。

販売テーブル
f:id:knkomko:20180930023148p:plain:w330
商品テーブル
f:id:knkomko:20180930023154p:plain:w130

このように主キーに完全関数従属したものを、第2正規形と呼びます。

1. 完全関数従属
 キーとなる列のすべての値を決めることによって、他の列の値が一意に決まる

.

第3正規形

推移的関数従属の項目を別テーブルにします。

3.推移的関数従属
 テーブル内にA、B、Cという列があり、Aの値によってBの値が一意に決まり、
 Bの値によってCの値が一意に決まるとき、かつ、Cの値によってAの値が一意に決まらない


各項目の従属関係では「販売ID」によって「商品名」が一意に決まり、「商品名」によって「お客様番号」が決まり、かつ、「お客様番号」によって「販売ID」は一意に決まりません。
このことから「お客様番号」は「販売ID」に推移的関数従属であると言えます。


各項目の従属関係 ※赤下線は主キーであることを表します
f:id:knkomko:20180930030754p:plain:w400


テーブルを分割させた結果は次のようになります。

販売テーブル
f:id:knkomko:20180930023207p:plain:w200
商品テーブル
f:id:knkomko:20180930023154p:plain:w130
顧客テーブル
f:id:knkomko:20180930023225p:plain:w130

このように非キー属性が主キーに完全関数従属することを満たし、推移的関数従属を除去したものを第3正規形と呼びます。