fc2ブログ
 

Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


2006年04月24日

ボイスコッド正規形と第3正規形の違い

第2正規形から、推移関数従属を取り除くと第3正規形になります。
商品マスタなどの例を挙げると、

・商品コード→仕入先コード→仕入先名

この場合、仕入先コード→仕入先名 の部分が推移関数従属です。
「こんなの、仕入先マスタを別に作って名称はそっちで管理するのが当たり前じゃん!」
って言わないでください。
そう、我々は無意識のうちにやっているのです。

さて、ボイスコッド正規形ですが、

以下のような商品マスタ、仕入先マスタがあったとします。前提条件として、
一つの商品に対して複数の仕入先が存在し、仕入先ごとに担当者が決められている
ものとします。

商品マスタ(商品コード、仕入先コード、担当者コード)
仕入先マスタ(仕入先コード、仕入先名)

この場合の商品マスタの候補キーは商品コード+仕入先コード、あるいは商品コード+
担当者コードです。繰り返し部分がなく、推移関数従属が存在しないので第三正規形です。
しかし、この商品マスタにおいて、もしも、ある担当者が担当する仕入先から仕入れて
いる商品が1つだけだったとすると、その商品が削除された場合、担当者が仕入先を担当
しているというデータも削除されてしまいます。
また、実際に商品が仕入れられるまで既存の仕入先と担当者との関係を登録することが
できません。また、変更によっても同様のことが起こります。
このような更新不整合が生じるのは、仕入先コードを決定するものとして担当者コードが
候補キーとなっていないからです。そこで、仕入先コードと担当者コードの関係について
以下のように新規分割することによって、こうした更新不整合が起きなくなります。

商品仕入先マスタ(商品コード、仕入先コード)
仕入先担当者マスタ(仕入先コード、担当者コード)
仕入先マスタ(仕入先コード、仕入先名)

この分割によって得られた新しい表においては、他の属性がある属性(X)に完全関数従属
である場合で、かつ属性(X)が候補キーであるというボイスコッド正規形の条件を満たす
ものとなっています。

第三正規形には「かつ属性(X)が候補キーである」という条件がありません。

でも普通なら、

商品マスタ(商品コード、仕入先コード)
仕入先マスタ(仕入先コード、担当者コード、仕入先名)

ですよね。



この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/145-915cbc4d
この記事にトラックバックする(FC2ブログユーザー)