數據庫BC範式(BCNF)

書中的概念:

關係模式R〈U,F〉∈1NF。若X→Y且YX時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。

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

或者說,(S,T)→J,T→J的決定因素(S,T),T都不包含碼(S,J),所以不是BCNF依賴。

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

或者說,(S,J)→J,T→J的決定因素(S,J),T都不包含碼(S,T),所以不是BCNF依賴。

如上所屬,關係模式STJ不是BCNF。

如何將它們改成BCNF呢?

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

對於(1),決定因素(S,T),T都不包含碼(S,J),選一個出來分解:

①(S,T):(S,T)→J,ST+J等於U,所以不是U的真子集,捨去。

②  T:T→J,T+J是U的真子集,故分解:S1:{TJ},將被確定的J移除:S2:U-{J}={S,T}

對於(2),決定因素(S,J),T都不包含碼(S,T),選一個出來分解:

 

①(S,J):(S,J)→T,SJ+T等於U,所以不是U的真子集,捨去。

②  T:T→J,T+J是U的真子集,故分解:S1:{TJ},將被確定的J移除:S2:U-{J}={S,T}

所以無論取哪個候選碼爲主碼,要得到BC範式,都需要將原模式分爲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,G)爲主碼,則D → M,M → D,D和M都不包含主碼(D,G)

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

                  M → D:S1:{M,D},S2:U-D{G,M,N}

如果選:(M,G),爲主碼,則D → M,M → D,D和M都不包含主碼(M,G),由於N是非主屬性,所以(D,G)→ N不討論

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

                  M → D:S1:{M,D},S2:U-D{G,M,N}

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

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