DB設計の正規化について
はじめに
今回はDB設計の基礎となる「正規化」の内容を勉強したのでまとめます。
正規化の段階を決める「関数従属性」を理解する事がポイントです。
正規化
同じデータを集約してデータ操作を効率化することです。
正規化の段階には、第1~第5正規形やボイスコッド正規形があります。
※今回の内容は一般的に使用される第1~第3正規形まで
関数従属性
列間の関係を意味します。
以下のテーブルでは「商品名」(キー)によって「単価」が一意に決定できるので「単価」は「商品名」に関数従属するといいます。
関数従属性には3種類あります。
1. 完全関数従属
キーとなる列のすべての値を決めることによって、他の列の値が一意に決まる
.
2. 部分関数従属
キーとなる列の一部の値を決めることによって、他の列の値が一意に決まる
.
3. 推移関数従属
テーブル内にA、B、Cという列があり、Aの値によってBの値が一意に決まり、
Bの値によってCの値が一意に決まるとき、かつ、Cの値によってAの値が一意に決まらない
.
非正規形
1行や1列の中に複数の項目が存在する場合は非正規形と呼びます。
お客様番号2000に対して販売IDが複数存在しています。
第1正規形
1行や1列の中に存在する複数の項目を、それぞれ別レコードとして独立します。
お客様番号2000を販売IDごと別レコードとして独立させました。
第2正規形
部分関数従属の項目を別テーブルにします。
2. 部分関数従属
キーとなる列の一部の値を決めることによって、他の列の値が一意に決まる
各項目の従属関係 ※赤下線は主キーであることを表します
テーブルを分割させた結果は次のようになります。
販売テーブル
商品テーブル
このように主キーに完全関数従属したものを、第2正規形と呼びます。
1. 完全関数従属
キーとなる列のすべての値を決めることによって、他の列の値が一意に決まる
.
第3正規形
推移的関数従属の項目を別テーブルにします。
3.推移的関数従属
テーブル内にA、B、Cという列があり、Aの値によってBの値が一意に決まり、
Bの値によってCの値が一意に決まるとき、かつ、Cの値によってAの値が一意に決まらない
各項目の従属関係では「販売ID」によって「商品名」が一意に決まり、「商品名」によって「お客様番号」が決まり、かつ、「お客様番号」によって「販売ID」は一意に決まりません。
このことから「お客様番号」は「販売ID」に推移的関数従属であると言えます。
各項目の従属関係 ※赤下線は主キーであることを表します
テーブルを分割させた結果は次のようになります。
販売テーブル
商品テーブル
顧客テーブル
このように非キー属性が主キーに完全関数従属することを満たし、推移的関数従属を除去したものを第3正規形と呼びます。