第一正規形のテーブル
伝票番号 | 日付 | 顧客コード | 顧客名 | 住所 | 市役所コード | 電話番号 |
---|---|---|---|---|---|---|
0129 | 2004/08/10 | 001 | A商事 | 横浜 | 012 | 045**** |
0157 | 2004/08/13 | 103 | B不動産 | 川崎 | 033 | 044**** |
0248 | 2004/08/22 | 056 | C工業 | 藤沢 | 056 | 047**** |
伝票番号 | 商品コード | 単位 | 数量 | 単価 |
---|---|---|---|---|
0129 | Z101 | cm | 200 | 1000 |
0129 | N029 | gallon | 50 | 3000 |
0157 | K403 | kg | 40 | 2000 |
0248 | N029 | gallon | 300 | 1000 |
0248 | T110 | dl | 120 | 9400 |
0248 | Q200 | l | 870 | 750 |
第一正規形にすることによって、一度に販売する数の制限はなくなりましたが、このままでは無駄な領域が発生します。例えば、A商事が3日続けて購入した場合、顧客コード、顧客名、住所が同じデータなのに、一つのテーブルに重複してあることになります。ヒット商品が出て、大量に同じ商品が購入された場合も同じです。このような状態はいくらディスクが大容量化を果たしたといっても、無駄なのでなくしたいですね。さらに、更新処理を行う場合、複数箇所のデータを更新しなくてはいけないので、無駄が多いです。
そこで、第一正規形から第二正規形へもう一歩進んでみましょう。
顧客コードは、顧客ごとに違うので、顧客コードから顧客名、住所がわかりますよね。つまり関数従属しているわけです。関数従属の中でも、主キー以外の項目に関数従属しているものを部分関数従属といいます。
第一正規形の表の、この部分関数従属を排除してやると、第二正規形になります。部分関数従属の排除は、テーブルを分割してやる事です。同じように、商品コードに部分関数従属している単位と単価も分割してやると以下のようなテーブル構成になります。
第二正規形のテーブル
受注テーブル
伝票番号 | 日付 | 顧客コード |
---|---|---|
0129 | 2004/08/10 | 001 |
0157 | 2004/08/13 | 103 |
0248 | 2004/08/22 | 056 |
顧客コード | 顧客名 | 住所 | 市役所コード | 電話番号 |
---|---|---|---|---|
001 | A商事 | 横浜 | 012 | 045**** |
103 | B不動産 | 川崎 | 033 | 044**** |
2004/08/22 | C工業 | 藤沢 | 056 | 047**** |
伝票番号 | 商品コード | 数量 |
---|---|---|
0129 | Z101 | 200 |
0129 | N029 | 50 |
0157 | K403 | 40 |
0248 | N029 | 300 |
0248 | T110 | 120 |
0248 | Q200 | 870 |
商品コード | 単位 | 単価 |
---|---|---|
Z101 | cm | 1000 |
N029 | gallon | 3000 |
K403 | kg | 2000 |
T110 | dl | 9400 |
Q200 | l | 750 |
これでディスクが、節約できました。更新する箇所も局所的にできます。(例えばN029の単価を更新する場合、1レコードの更新ですみます。)各テーブルのキー項目は関数従属させていたほうの項目です。