數據庫中的無損連接分解和是否保持函數依賴的判定
版權聲明:歡迎轉載評論~哈哈哈哈請標明出處呀 https://blog.csdn.net/legendaryhaha/article/details/80649234
首先了解一下幾個概念:
1)把一個關系模式分解成若干個關系模式的過程,稱為關系模式的分解。
2)把低一級的關系模式分解為若干個高一級的關系模式的方法不是唯一的。
3)只有能夠保證分解后的關系模式與原關系模式等價,分解方法才有意義。
對於第一句話,為什么需要分解關系模式?因為原來的關系模式可能造成數據冗余或
給數據庫帶來潛在的不一致性。對於第二句話,根據不同語義,分解的原則也不盡相
同,所以方法肯定是不唯一的,譬如U={A,B,C},根據不同原則(隨便你自己定),
可能分成(A,B)(A,C)也可能分成(B,C)(A,C)。對於第三句話,則是本文所要
講的內容。
為了保證分解后的關系模式與原關系模式等價,我們要判定 1)分解后形成的行的關
系模式中是否為無損連接 2)是否保持函數依賴
一、無損連接的判定:
1)如果分解后的的關系模式是形如{U1,U2}這,里面只有兩個,那很好做,就判斷
或 是否成立,成立的話肯定是
無損連接。
2)如果是兩個以上{U1,U2,U3....}這種,那就比較麻煩了,比如,有屬性集,
ABCDEF,存在這樣的函數依賴集{A->BC , CD->E , B->D , BE->F , EF->A},然后有
這樣的分解{ABC , BD , BEF}。
例如:
設U1=ABC,U2=BD,U3=BEF,根據提供的函數依賴集,我們可得U1存在這樣的
函數依賴A->BC,U2上的函數依賴是 B->D, U3的函數依賴是BE->F。
1)於是可構造這樣的表格。
G A B C D E F
A->BC
B->D
BE->F d
2)各自判斷A,B,C,D,E,F是否有在G列的函數依賴中,如果有記為ai,i表示第幾列,否
則記為bji,表示第行第i列
如:
G A B C D E F
A->BC a1(A有在函數依賴中,此行為第一行)
B->D
BE->F b31(A沒有,此列為第一列)
這樣我們可得到圖:
G A B C D E F
A->BC a1 a2 a3 b14 b15 b16
B->D b21 a2 b23 a4 b25 b26
BE->F b31 a2 b33 b34 a5 a5
3)接下來是關鍵的,如果我們經過一系列變換得到有一行是這樣的排序
{a1,a2,a3,a4,a5,a6...},即不存在bji,那我們就認為,該分解是無損連接。
4)變換過程:為了方便,我們可以按A->BC, B->D,BE->F這個順序來(隨你喜
歡)。
第一遍,根據A->BC,我們知道主健是能唯一標識一個元組的,也就是說如果
A中存在着兩個屬性值是相同的,毫無疑問,他們推出的BC的值肯定也是相同的。從
表格中我們遍歷A列,沒有發現有相同的屬性組,那就跳過。
第二遍, 根據B->D,因為B列屬性值相同,那我們修改D列。修改時遵照這樣的一個
規則,如果D中有ai這樣的值,那么宣布修改為ai,如果沒有,修改成該列的第一行的
第一個值。從表格中我們可以發現D中有a4,那么修改后變成:
G A B C D E F
A->BC a1 a2 a3 a4 b15 b16
B->D b21 a2 b23 a4 b25 b26
BE->F b31 a2 b33 a4 a5 a5
第三遍,根據BE->F,找一組BE相同的值,發現不存在,即不存在類似
{a1,a2,a3,a4,a5,a6}這樣的序列,即該分解不是無損連接分解。
二、是否保持函數依賴?
這個的判斷方法就比較簡單了,還是這道題,有屬性集,ABCDEF,存在這樣
的函數依賴集{A->BC , CD->E , B->D , BE->F , EF->A},然后有這樣的分解
{ABC , BD , BEF}。
設U1=ABC,A->BC,U2=BD,B->D ,U3=BEF,BE->F ,即我們不能推出 CD->E
,EF->A,所以也不具有保持函數依賴的特性。
---------------------
作者:legendaryhaha
來源:CSDN
原文:https://blog.csdn.net/legendaryhaha/article/details/80649234
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!