SQL攻略 - Web上でSQLを実行しながらマスターするサイト
English ver [4 From first normal form to second normal form] is here.
ホーム >> 正規化攻略 - 第一正規形から第二正規形へ

第一正規形から第二正規形へ

部分関数従属を排除して、第二正規形にしよう。

第一正規形のテーブル

伝票番号日付顧客コード顧客名住所市役所コード電話番号
01292004/08/10001A商事横浜012045****
01572004/08/13103B不動産川崎033044****
02482004/08/22056C工業藤沢056047****

伝票番号商品コード単位数量単価
0129Z101cm200
1000
0129N029gallon50
3000
0157K403kg402000
0248N029gallon3001000
0248T110dl1209400
0248Q200l870750

第一正規形にすることによって、一度に販売する数の制限はなくなりましたが、このままでは無駄な領域が発生します。例えば、A商事が3日続けて購入した場合、顧客コード、顧客名、住所が同じデータなのに、一つのテーブルに重複してあることになります。ヒット商品が出て、大量に同じ商品が購入された場合も同じです。このような状態はいくらディスクが大容量化を果たしたといっても、無駄なのでなくしたいですね。さらに、更新処理を行う場合、複数箇所のデータを更新しなくてはいけないので、無駄が多いです。

そこで、第一正規形から第二正規形へもう一歩進んでみましょう。

顧客コードは、顧客ごとに違うので、顧客コードから顧客名、住所がわかりますよね。つまり関数従属しているわけです。関数従属の中でも、主キー以外の項目に関数従属しているものを部分関数従属といいます。

第一正規形の表の、この部分関数従属を排除してやると、第二正規形になります。部分関数従属の排除は、テーブルを分割してやる事です。同じように、商品コードに部分関数従属している単位と単価も分割してやると以下のようなテーブル構成になります。

第二正規形のテーブル 受注テーブル

伝票番号日付顧客コード
01292004/08/10001
01572004/08/13103
02482004/08/22056

顧客テーブル
顧客コード顧客名住所市役所コード電話番号
001A商事横浜012045****
103B不動産川崎033044****
2004/08/22C工業藤沢056047****

数量テーブル
伝票番号商品コード数量
0129Z101200
0129N02950
0157K40340
0248N029300
0248T110120
0248Q200870

商品テーブル
商品コード単位単価
Z101cm1000
N029gallon3000
K403kg2000
T110dl9400
Q200l750

これでディスクが、節約できました。更新する箇所も局所的にできます。(例えばN029の単価を更新する場合、1レコードの更新ですみます。)各テーブルのキー項目は関数従属させていたほうの項目です。