數據庫系統概論的范式轉換問題


一、一個關系模式的碼的求解方法

求候選碼的簡單方法方法:
(1)如果有屬性不在函數依賴集中出現,那么它必須包含在候選碼中;
(2)如果有屬性不在函數依賴集中任何函數依賴的右邊出現,那么它必須包含在候選碼中;
(3)如果有屬性只在函數依賴集的左邊出現,則該屬性一定包含在候選碼中。
(4)如果有屬性或屬性組能唯一標識元組,則它就是候選碼;

之后對於根據上述方法剔除和加入的key進行組合判斷,即將已經選出來的key和其余剩下的屬性進行一一組合,然后判斷即可

例題:

(1)R<U,F>,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求候選碼?
  因G只在右邊出現,所以G一定不屬於候選碼;

  而B,D只在左邊出現,所以B,D一定屬於候選碼;

  BD的閉包還是BD,則對BD進行組合,除了G以外,BD可以跟A,C,E進行組合

  先看ABD  ABD本身自包ABD,而AB-->C,CD-->E,A-->G,所以ABD的閉包為ABDCEG=U 

  再看BDC  CD-->E,E-->A,A-->G,BDC本身自包,所以BDC的閉包為BDCEAG=U

  最后看BDE  E-->A,A-->G,AB-->C,BDE本身自包,所以BDE的閉包為BDEAGC=U

  因為(ABD)、(BCD)、(BDE)的閉包都是ABCDEG所以本問題的候選碼有3個分別是ABC、BCD和BDE

二、轉換為2nf的方法

這個一般畫圖就能解決,只要把非主屬性對key的部分依賴的部分隔離為一個新的關系就好了。

三、轉換為3nf的方法(這里直接寫保持依賴and無損分解的轉換方法)

 

1.求解最小依賴集(對每一個依賴關系逐一去掉,判斷去掉這個依賴是否對整個依賴集有影響),直接上題

 例1:關系模式R<U,F>,其中U={C,T,H,R,S,G},
F={CS→G,C→T,TH→R,HR→C,HS→R},將其分解成3NF並保持函數依賴。
解:根據算法進行求解     
(一)計算F的最小函數依賴集
      ① 利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴。由於F的所有函數依賴的右邊都是單個屬性,故不用分解。
      ② 去掉F中多余的函數依賴
      A.設CS→G為冗余的函數依賴,則去掉CS→G,得:
      F1={C→T,TH→R,HR→C,HS→R}
      計算(CS)F1+:
      設X(0)=CS
      計算X(1):掃描F1中各個函數依賴,找到左部為CS或CS子集的函數依賴,找到一個C→T函數依賴。故有X(1)=X(0)∪T=CST。
      計算X(2):掃描F1中的各個函數依賴,找到左部為CST或CST子集的函數依賴,沒有找到任何函數依賴。故有X(2)=X(1)。算法終止。
      (CS)F1+= CST不包含G,故CS→G不是冗余的函數依賴,不能從F1中去掉。
      B.設C→T為冗余的函數依賴,則去掉C→T,得:
      F2={CS→G,TH→R,HR→C,HS→R}
      計算(C)F2+:
      設X(0)=C
      計算X(1):掃描F2中的各個函數依賴,沒有找到左部為C的函數依賴。故有X(1)=X(0)。算法終止。故C→T不是冗余的函數依賴,不能從F2中去掉。
      C.設TH→R為冗余的函數依賴,則去掉TH→R,得:
      F3={CS→G,C→T,HR→C,HS→R}
      計算(TH)F3+:
      設X(0)=TH
      計算X(1):掃描F3中的各個函數依賴,沒有找到左部為TH或TH子集的函數依賴。故有X(1)=X(0)。算法終止。故TH→R不是冗余的函數依賴,不能從F3中去掉。
      D.設HR→C為冗余的函數依賴,則去掉HR→C,得:
      F4={CS→G,C→T,TH→R,HS→R}
      計算(HR)F4+:
      設X(0)=HR
      計算X(1):掃描F4中的各個函數依賴,沒有找到左部為HR或HR子集的函數依賴。故有X(1)=X(0)。算法終止。故HR→C不是冗余的函數依賴,不能從F4中去掉。
      E.設HS→R為冗余的函數依賴,則去掉HS→R,得:
      F5={CS→G,C→T,TH→R,HR→C}
      計算(HS)F5+:
      設X(0)=HS
      計算X(1):掃描F5中的各個函數依賴,沒有找到左部為HS或HS子集的函數依賴。故有X(1)=X(0)。算法終止。故HS→R不是冗余的函數依賴,不能從F5中去掉。即:F5={CS→G,C→T,TH→R,HR→C,HS→R}
      ③ 去掉F5中各函數依賴左邊多余的屬性(只檢查左部不是單個屬性的函數依賴),沒有發現左邊有多余屬性的函數依賴。
故最小函數依賴集為:F={CS→G,C→T,TH→R,HR→C,HS→R}

2.對於最小依賴集里的依賴,若存在兩側均未出現的屬性,則將這些屬性划分為一個集合

3.如果要求連接成無損,則直接再添加一個候選碼

 

 

已知R(ABCDE), F={A ->D,E->D,D->B,BC->D,DC->A}求保持函數依賴的3NF分解,和具有無損連接性及保持函數依賴的3NF分解
第一步: 保函依賴分解題,先求最小依賴集。先求出R的最小依賴集,可得F={A ->D,E->D,D->B,BC->D,DC->A}
第二步: 依賴兩側未出現,分成子集放一邊,剩余依賴變子集。首先可以發現沒有不出現在兩側的元素,然后我們將各依賴分別划分為子集得{AD} {ED} {DB} {BCD} {DCA},即為所求保持函數依賴的3NF分解
第三步: 若要連接成無損,再添候選做子集。找到R的一個候選碼,所謂候選碼即能決定整個關系的,我們通過找未出現在依賴右邊的和兩側均為出現的元素即可求得,可以發現C E未出現在右邊,因此候選碼為{CE}。故所求具有無損連接性及保持函數依賴的3NF分解為{AD} {ED} {DB} {BCD} {DCA} {CE}

 三、轉BCNF

 將關系模式R<U,F>分解為一個BCNF的基本步驟是

1).求出候選關鍵字,檢查R中關系模式是否符合BCNF,若都符合輸出即可
2).查看每個關系模式左部是否含有候選關鍵字,若R中有關系模式S不符合BCNF,則必有X->A屬於F+,且X不是S的候選關鍵字。因為XA不包含S的全部屬性,把S分為{S1,S2},其中S1=XA,S2=(S-A)X,分別計算其最小函數依賴集,並將{S1,S2}代替S代入第一步中。
 
四、綜合例題
例2.關系模式R<U,F>,有U={A,B,C,D,E,F,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},
(1)將關系模式分解為3NF且保持函數依賴
(2)將關系模式分解為BCNF
 
 
將關系模式分解為3NF且保持函數依賴:
假設B->G冗余,則(B)+=BD,沒有G故不冗余。
假設CE->B冗余,則(CE)+=CEGDA,沒有B故不冗余。
假設C->A冗余,則(C)+=CD,故不冗余。
一次可以得到最小函數依賴集Fm={B->G,CE->B,C->A,B->D,C->D}。
之后將左部相同的組合並成一個組有:(BDG),(CEB),(CAD).
所以將關系模式分解為3NF且保持函數依賴的結果為:(BDG),(CEB),(CAD).
 
將關系模式分解為BCNF:
首先求出關系模式的候選關鍵字(CE)
因為Fm={B->G,CE->B,C->A,B->D,C->D}。
開始找左部不包含CE的關系模式,第一個為B->G,
將其分為R1={(BG),{B->G}}與R2={(ABCDE),{CE->B,C->A,B->D,C->D}}。注意G不能出現在R2中,要根據與G相關的關系模式進行替代。
求R1與R2的最小函數依賴集,步驟均是按照上述算法嚴格進行的。
R1,R2最小函數依賴集是其本身。
然后再進行分解,R1符合BCNF,繼續分解R2:
B->D,左部不含碼,於是分解為R2={(BD),{B->D}},R3={(ABCE),{CE->B,C->A}}。
R2,R3的最小函數依賴集均是其本身。
於是BCNF分解的最后結果為{(BG),(BD),(AC)(BCE)}。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM