數據庫BC範式(BCNF)判斷和分解

書中的概念:

關係模式R〈U,F〉∈1NF。若X→Y且Y不包含X時X必含有碼,則R〈U,F〉∈BCNF。
也就是說,關係模式R〈U,F〉中,若每一個決定因素都包含碼,則R〈U,F〉∈BCNF。

關係模式的定義可以得到如下結論,若R屬於BCNF,則R有:

1.所有非主屬性對每一個碼都是完全函數依賴

2.所有的主屬性對每一個不包含它的碼,也是完全函數依賴。

3.沒有任何屬性完全函數依賴於非碼的任何一組屬性。

 

我的理解:

非碼屬性不要完全決定碼屬性,主屬性也不要部分/傳遞依賴碼屬性,

換句話來說,就是X→Y時,X一定含有碼(候選碼中的任意一個)

如:

例1:

在關係模式STJ(S,T,J)中,S表示學生,T表示教師,J表示課程。

每一教師只教一門課。每門課由一名教師教,某一學生選定某門課,就確定了一個固定的教師。某個學生選修某個教師的課就確定了所選課的名稱 : (S,J)→T,(S,T)→J,T→J

顯然,在STJ中,(S,J),(S,T)都是候選碼,S,T,J都是主屬性,所以沒有非主屬性對碼的傳遞依賴和部分依賴,所以屬於3NF。

但是T→J的決定因素既不包含候選碼(S,J),也不包含候選碼(S,T),所以不是BCNF。

也可以用以上三條結論認證。

(1)當(S,J)爲碼時,主屬性T依舊被碼屬性J依賴(T→J),違背了以上第3條。

(2)當(S,T)爲碼時,主屬性J依舊被碼屬性T部分函數依賴(T→J),違背了以上第2條。

綜上所述,關係模式STJ不是BCNF。

 

如何將它們改成BCNF呢?

書上有分解法的算法,可以將模式轉換爲BCNF。書上的很抽象,但是運用起來很簡單。簡單來說就是把不合法的屬性拆出來組成新的模式。

T→J的決定因素既不包含候選碼(S,J),也不包含候選碼(S,T),所以將其分解,T+J是U的真子集,故分解:S1:{TJ},將被確定的J移除:S2:U-{J}={S,T}

所以原模式被分爲ST(S,T)和TJ(T,J)

 

同樣的算法,例2:

那麼關係模式 dep(D,M,G,N)中D表示倉庫名,M表示管理員,G表示貨物名,N表示貨物的數量 

已知函數依賴集:D → M,M → D,(D,G)→ N

將其分爲BC範式:

主屬性:D,M,G

候選碼:(D,G),(M,G)

D → M,M → D,D和M都不包含候選碼(D,G),也不包含候選碼(M,G)

此時分解:D → M:S1:{D,M},S2:U-M{D,G,N}   

                 這時,有S1{D → M},候選碼D,S2{(D,G)→ N}候選碼(D,G),滿足BCNF,分解完成。

或者分解:M → D:S1:{M,D},S2:U-D{G,M,N}

                 這時,有S1{M → D},候選碼M,S2{(D,M)→ N}候選碼(D,M),滿足BCNF,分解完成。

所以要想使模式滿足BC範式,本例有兩種分解方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章