碼屬性和非碼屬性
在講函式依賴和正規化前,我們需要了解碼屬性和非碼屬性
碼屬性就是構成候選碼的屬性,非碼屬性就是不構成候選碼的屬性,主屬性是指構成主碼的屬性
候選碼是能夠確定關係R的最小屬性集合,可以有多個,即多種匹配方法,超碼就是一個候選碼隨便加上另一個屬性,主碼就是候選碼中選一個來當,所以主屬性也是碼屬性
函式依賴
基本介紹
函式依賴不是指關係模式R的某個或某些關係例項滿足的約束條件,而是指R的所有關係例項均要滿足的約束條件。
這句話看起來比較抽象,簡單來說,就是我在設計表的時候,給這個表加了個函式依賴,那麼這個表的所有例項都必須遵守這個函式依賴
那函式依賴是什麼呢?其實很簡單,他就是用來表示表中各個屬性之間的依賴關係的
比如說,我有一個表模式 R=(A, B, C)
,函式依賴可以是這樣子 A -> C
,這就表示屬性A可以決定C,換句話說就是,當A的值確定後,C的值也必須確定
是不是很像數學上的函式,事實上它就是這麼一回事,用函式的形式表示屬性間的依賴關係,就是函式依賴了
還需要注意的是,AB -> C
這個的意思是屬性A和屬性B結合,可以確定C,這是一種簡寫的方式
所以我們還能夠知道,如果說對於函式依賴 A -> C
,A的值絕對不能重複,因為一重複,你就沒法確定C值了,也就不符合函式依賴的定義了
還要注意的是以下兩種特殊情況
- 函式依賴可以確定關係R,如
K -> R
,這個意思就是K
就是碼屬性的集合了 - 函式依賴為空集,即沒有函式依賴,表示所有屬性結合起來確定關係R,即所有屬性都是碼屬性
我們再來看看,用函式依賴表示超碼是怎麼樣的吧
再看看補碼,這裡就是在超碼的基礎上,加了個限制,那就是任何K的子集,都不能確定關係R,換句話說,就是補碼是最小的超碼
型別
平凡函式依賴
比如說,AB -> A
AB -> B
A -> A
這三個就是平凡依賴,這是自然成立的,不需要推導,這是因為當你選中一個元組,裡面包含,屬性A和屬性B時,自然就確定了屬性A和屬性B,沒啥好說的
完全函式依賴和部分函式依賴
在關係R中,X屬於R,Y屬於R,並且X->Y,若對於X的任意一個真子集X1,都不滿足X1->Y,則稱Y完全函式依賴於X,反之,則稱Y部分函式依賴於X
完全函式依賴記作,f 表示 full
部分函式依賴記作,p 表示 part
兩個的區別就是,能不能找到一個真子集讓Y依賴於這個真子集
傳遞函式依賴
在關係R中,X->Y, Y->Z,且Y不屬於X,也不依賴於X,則稱Z傳遞函式依賴於X,若Y依賴於X,即X<-->Y,則稱Z直接函式依賴於X
閉包
函式依賴集的閉包
這三個是基本規則,自反性、增廣性(擴容)、傳遞性
由這三個可以推出以下的幾個規則
求閉包的演算法
翻譯一下,就是先初始化,F+ =F
,然後對閉包中的每個函式依賴進行自反和增廣(簡稱擴容),然後對擴容的閉包進行傳遞,就是組合稱新的函式依賴,然後就一直重複這個過程,知道閉包不在改變
屬性集的閉包
屬性集的閉包是依賴於某個函式依賴集的,並不能單獨成立
閉包的求法
演算法挺簡單的,就是把能推匯出來的屬性加到result集合中就行了
可以用屬性集的閉包判斷候選碼,如果這個屬性集的閉包覆蓋了所有屬性,那它就一定是超碼,如果這個屬性集的任何真子集的閉包沒法覆蓋所有屬性,那它進一步成為候選碼
正規化
1NF
第1正規化就是要求關係的所有屬性都是原子的即可,簡單來說,每個屬性包含的資訊要儘量精簡,就是分到不能再分的意思
2NF
第2正規化要求非碼屬性完全函式依賴於候選碼,消除了非碼屬性的部分函式依賴,可能還存在傳遞函式依賴
3NF
第3正規化要求每一個非碼屬性既不部分函式依賴也不傳遞函式依賴於候選碼,消除了非碼屬性的部分函式依賴和傳遞函式依賴
如果關係R中的每個屬性都是碼屬性,那麼關係R是3NF
BCNF
BC正規化要求對於每個函式依賴X->Y,如果Y不是X的子集,那麼X必須含有候選碼。換句話說,如果滿足條件,那麼X是超碼
如果函式集為空集,即R中的每個屬性都是碼屬性,那麼關係R是BCNF
沒有非平凡函式依賴,表示資料高度獨立,即屬性之間沒有複雜的依賴關係,相當於函式依賴為空集
依賴保持
簡單來說,就是分解之後的表的函式依賴集的並集要和原來的表的函式依賴集相等