■SQL攻略 - 実行すれば理解できる!

HOME>>正規化攻略マップ>>第二正規形から第三正規形へ

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

第二正規形から第三正規形へ
推移的関数従属を排除して、第三正規形にしよう。

第二正規形のテーブル 受注テーブル
伝票番号日付顧客コード
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

カンの良い人は気づいたかもしれませんが、市役所の電話番号は、市役所コードに関数従属していますよね。

市役所の電話番号は、顧客テーブルにおいて候補キーではないので、第二正規形にする過程では表が分割されなかったのですが、顧客コードが決まれば、市役所コードが決まり、市役所コードが決まれば、電話番号が決定する。このような状態を推移関数従属といいます。補足すると、三段論法で言うAはBである、BはCである、ゆえにAはCであるといったとき、CはAに推移関数従属しているのです。

第二正規形の推移関数従属を排除すると、第三正規形になるので、このBはCであるの部分を別表に分割します。すると以下のようなテーブル構成になります。

第三正規形のテーブル
受注テーブル
伝票番号日付顧客コード
01292004/08/10001
01572004/08/13103
02482004/08/22056

顧客テーブル
顧客コード顧客名住所市役所コード
001A商事横浜012
103B不動産川崎033
2004/08/22C工業藤沢056

電話番号テーブル
市役所コード電話番号
012045****
033044****
056047****

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

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

これで、第三正規形の完成です。多くのシステムではここまで、正規化すれば実用レベルです。例えば市役所の電話番号が変わった場合、第二正規形では複数の電話番号を更新する必要がありますが、第三正規形まで行うと、電話テーブルの一つのレコードを更新するだけですみます。顧客の社名が変わる場合でも一箇所ですみます。商品が増えた場合も1レコードの追加です。この様な状態を一事実一箇所(1 fact in 1 place)といい、データの操作が最小の労力で行えます。効率が良いですね。

正規化の過程をざっと復習すると以下のような感じです。

・非正規形から第一正規形
繰り返しグループを排除ために、繰り返しグループとキーとなる項目で分割する。

・第一正規形から第二正規形
主キー以外のキー項目に関数従属しているものを分割する

・第二正規形から第三正規形
推移的に関数従属しているものを分割する。

以上の3ステップですね。

要注意:中には推移的関数従属が無い場合もあります。そのときは第二正規形にした時点で、第三正規形まで完了します。

さていよいよ次は過去問を解いてみましょう。

<<第一正規形から第二正規形へ 過去問を解きましょう>>
http://sql.main.jp by san