今天小編要和大家分享的是SQLServer中的最小函數依賴集,假設S 1和S 2是兩個函數依賴集,如果所有為S 1所蘊涵的函數依賴都為S 2所蘊涵,—即S 1+是S 2+的子集,則S 2是S 1的覆蓋,D B M S只要實現了S 2中的函數依賴,就自動實現S 1中的函數依賴。
如果S 2是S 1的覆蓋,同時S 1是S 2的覆蓋—則S 1和S 2等價,即S 1+=S 2+。很顯然,如果S 1和S 2等價,則D B M S只要實現S 1中的函數依賴,就自動實現S 2中的函數依賴,反之亦然。
當且僅當函數依賴集滿足以下條件時,該函數依賴集為最小函數依賴集:
1) 每個函數依賴的右邊(應變量)只含有一個屬性(即它是單元素集合)。
2) 每個函數依賴的左邊(自變量)是不可約的—刪除自變量的任何一個屬性都將改變閉包S+(即會使S轉變為一個不等價於原來的S的集合)。這種函數依賴被稱為左部不可約的函數依賴。
3) 刪除S中任何一個函數依賴都將改變它的閉包S+,即使S轉變為一個不等價於原來的S的集合。
關於第2點和第3點,在這里要指出的是,為了知道如果刪除某些元素是否會改變閉包,不必要清楚地知道閉包的內容。例如:觀察大家熟悉的零件關系變量P,有下列函數依賴:
P #→P N A M E
P #→C O L O R
P #→W E I G H T
P #→C I T Y
顯而易見,該函數依賴集是最小依賴集:每個函數依賴中右邊只含有一個屬性,同樣,左邊也是不可約的,且任何一個函數依賴都不能被刪除而不改變閉包(即不丟失信息)。相反,下面的函數依賴集不是最小依賴集。
1 ) P #→{ P N A M E,COLOR} :第一個函數依賴的右邊不是單屬性集
P #→W E I G H T
P #→C I T Y
2 ) { P #,P N A M E }→COLOR :第一個函數依賴左邊的P N A M E可以刪除而不改變閉包(即左邊是可約的)
P #→PNAME
P #→W E I G H T
P #→C I T Y
3 ) P #→P# : 第一個函數可以刪除而不改變閉包
P #→P N A M E
P #→C O L O R
P #→W E I G H T
P #→C I T Y
任何一個函數依賴集至少存在一個最小函數依賴集。假設函數依賴集為S,根據分解規則,可以假定每個函數依賴的右邊是單屬性的而不會失去它的一般性(如果右邊不是單屬性的,則可以利用分解規則把它分解成單屬性),接着考察每個函數依賴f左邊的每一個屬性A,如果把A從f的左邊刪除而並不改變閉包,則把A從f的左邊刪除,然后考察S中剩余的每一個函數依賴f,如果把f刪除而不改變閉包,則把f從S中刪除,最后所得的集合S是和原來的函數依賴集S等價的最小函數依賴集。
例:假設給定關系變量R、A、B、C、D是R的屬性集,R滿足函數依賴:
A→B C
B→C
A→B
A B→C
A C→D
現在計算該函數依賴的最小函數依賴集。
1) 把所有的函數依賴寫成右邊是單屬性的函數依賴:
A→B
A→C
B→C
A→B
A B→C
A C→D
很顯然,函數依賴A→B出現了兩次,可以刪除其中的一次。
2) 可以把C從函數依賴A C→D的左邊刪除,因為A→C,根據增廣律可以得出A→A C,給定A C→D,根據傳遞律可以得出A→D。所以C在函數依賴A C→D的左邊是冗余的。
3) 接着發現可以刪除函數依賴A B→C,因為A→C,根據增廣律可得A B→C B,又根據分解規則可以導出A B→C。
4) 函數依賴A→C由函數依賴A→B和B→C蘊涵,所以它可以刪除。最后剩下下列函數依賴:
A→B
B→C
A→D
該集合是不可約。
一個函數依賴集I是不可約的,且等價於某個函數依賴集S,則說I是S的最小等價依賴集。
這樣,如果要實現一個函數依賴集S,系統只要實現它的一個最小依賴集就足夠了(重復一次:要計算最小依賴集I不必計算閉包S+)。應該清楚的是給定函數依賴集的最小依賴集並不一定是唯一的。
轉載:http://edu.qudong.com/2010/0416/67217.shtml