2005年03月12日

[ テクニカルエンジニア(データベース)/H17受験記 ]

TECHSCOREのボイスコッド正規形

ボイスコッド正規形に分解してみる

元ネタ
OKWeb > ボイスコッド正規形
TECHSCORE > SQL > 正規化 > ボイスコッド正規形

かなり不適切な分解をしているのは指摘しなくて良いと思うが念のため。
受注番号,商品番号)
受注番号,商品番号
 12345 , 001
 12345 , 002
 12346 , 001
 12347 , 001
※12345が重複していてユニークじゃない。

ここから本題。じゃぁ,どう分解すればよいのか。

与えられている条件は

・1つの受注データで複数の商品を取り扱う。
・1つの受注データには、1種類の商品しか取り扱わない。
・納入業者は 1種類の商品しか取り扱わない。
・同じ商品を納入する業者が存在する。

1番目と2番目の内容に矛盾を感じる悪い表現。。。

お馴染みの表記に纏めると
{受注番号,商品番号}→納入業者
納入業者--→商品番号
商品番号-×→納入業者  ・・・ (成立しないってことっす)

あと,
{受注番号,納入業者}→商品番号
も成立します。

ボイスコッド正規形の条件をおさらいすると
 候補キーに完全関数従属。非キー属性はもちろん,候補キーを構成する属性も関数従属しなければならない。

 この関係は候補キーを構成する属性間に関数従属(納入業者→商品番号)があるため,こいつを分割しないといけません。

分割すると。。。

納入業者,商品番号)
 業者A , 001
 業者B , 002
 業者D , 001

受注番号,納入業者
 12345 , 業者A
 12345 , 業者B
 12346 , 業者A
 12347 , 業者D

一見,適切に分解されているように見えるが
{受注番号,商品番号}→納入業者の関係が失われています。

これが,いわゆる「関数従属性を保存しないBCNFへの損失なしの分解」というヤツです。
このため,分解した関係はそれぞれ単独で更新できません。

「関係が失われるので無理に分解しなくても良かった」と,いうオチでした。。。

関連情報
 新版 データベース技術 P61 参照
 関係名,属性名が違うだけで全く同じ関数従属性をBCNFに分解した例が載っています。

Posted by g@kko at 2005/03/12 01:36 | 個別記事表示 | コメントを見る (3) |
この記事をLicWikiに埋め込む:
コメント
2 :g@kko:05/03/12 09:15:35 [RES]

午後I の基礎理論にボイスコッド出ないかなぁ。。。


3 :makoneko:05/03/14 13:36:09 [RES]

TACの模試には
ボイスコッド正規形が出題されました。

確かにこのあたりは狙われそうですね。


4 :g@kko:05/03/14 22:23:36 [RES]

>>3
 makoneko さん。コメントありがとうございます。

 TAC模試にBCNFですか。。。φ(.. )

 私がBCNFを警戒している理由は。。。多値従属・メタデータを使い回すにはまだ早いし,
 結合従属性は,作問が難しい気がするし,BCNFだったら,今まで午前にも出ているし。。。アリかなと。