前言
最近復習范式屬實是惡心到我了,書本看着看着就迷,晦澀難懂。看完了華中科技大學的數據庫PPT、《數據庫系統概論(第五版)》,在結合B站眾多牛逼的UP主的講解視頻,我終於理解了1F到BCNF的定義和判斷。接下來,我將用最小白的語句講一講范式是怎么回事。
定義
范式難就難在涉及幾個定義,這幾個定義極容易混淆。
1NF:不可分割。這個簡單,數據庫創建的表都是1NF,總不能像EXCEL上創建的那種花里胡哨的表一樣吧。
2NF:不存在非主屬性對候選碼的部分依賴。OK,這里涉及幾個知識點。
1. 什么是非主屬性,首先需要知道什么是主屬性,在此之前必須要說一下啥是候選碼。
候選碼:候選碼能推出所有的屬性(候選碼一定能推出自身的屬性),候選碼之間帶不帶逗號意義完全不同。例如,在U(A,B,C,D)中AB是候選碼,表示AB可以推出ABCD所有屬性,這里說的ABCD並不是一定要右邊完完整整的ABCD,而是他們推出的右邊的屬性的並集,比如AB->CD,或者AB->C、AB->D這都可以說AB推出ABCD。怎么求等會會說到。(候選碼不唯一,但主碼唯一)
主屬性:候選碼中的某些屬性為主屬性,注意“某些”,當然主屬性也可能沒有。上個例子說到AB為候選碼,則可能經過后面的判斷A、B都是主屬性。怎么判斷后面也會說。
(候選碼、主屬性、主碼辨析)
非主屬性:屬性中除了主屬性,剩下的都是非主屬性咯。
2. 什么是部分依賴。舉個栗子,AB->C、A->C,這中間A能單獨推出C,所以C依賴於A,但是C又依賴於AB,所以C部分依賴於AB。
3NF:不存在非主屬性到候選碼的傳遞依賴。
3.傳遞依賴顧名思義啦,A->B、B->C,所以C對A是傳遞依賴。當然如果A->B、B->A這可不算傳遞依賴哦,因為這里A、B都是候選碼\主屬性,都不存在非主屬性,那有傳遞依賴呀。
注意定義:X->Y (Y⊈X), Y↛ X, Y->Z (Z⊈Y),則稱Z對X傳遞函數依賴。
BCNF:已經完全消除了非主屬性對於候選碼的部份依賴和傳遞依賴,不存在主屬性對候選碼的部份依賴和傳遞依賴。判斷方式很簡單,就看所有關系式的左邊是否包含全部候選碼(候選碼AB就是看左邊是不是AB,而不是A、B)(可以這么回答:因為所有函數依賴的決定因素?、?、?包含所有候選碼,因此是BCNF),如果是就是BCNF,否則就是3NF。
4NF:在BCNF的基礎上,一個表中有A->B,A->C(即A->BC),但是BC之間沒關系,因此這里存在多值依賴,將此表拆分為兩個表,分別是(A,B)和(A,C)即可,成為了4NF。(相關概念很多,也有很多性質,建議結合書本理解)
(任何一個二目關系都是屬於4NF(R(X, Y)如果X->->Y,即X、Y之間存在平凡的多值依賴,R屬於4NF),因此也屬於BCNF、3NF......)
判斷步驟
1. 求出閉包。什么是求出閉包,簡單來說就是左邊元素的組合能推出右邊的所有元素,這個左邊元素的組合就是閉包。
2. 求出候選碼 =》求出主屬性 =》求出非主屬性。(關於閉包、候選碼練習,點擊)
3. 從1NF、2NF、3NF、BCNF依次判斷。
例題
例1. R( A, B, C),F= { AB->C}
1. 判斷閉包。AB->AB、AB->C,所有AB->ABC(這與AB->AB、AB->C是等價的)。
2. 所以AB是候選碼(注意不是A、B),所以A、B都是主屬性,C是非主屬性。
3. 判斷范式。肯定是1NF了;判斷是否有部分依賴,看是否有A->C或者B->C,沒有則表示是2NF;判斷是否有傳遞依賴,很明顯沒有,表示是3NF;判斷是否有主屬性對候選碼的部分依賴和傳遞依賴,依然沒有(因為左邊(AB)全為候選碼(AB)),因此是BCNF。
例2. R( A, B, C),F= { B->C, B->A, A->BC}
1. 因為B能推出C和A,因此B->AC,所以B是候選碼;因為A->BC,所以A也是候選碼。
2. A、B是主屬性,C為非主屬性。
3. 很明顯,左側都為一個屬性,所以不可能有部分依賴;觀察關系也沒有傳遞依賴,因此至少為3NF;因為A、B之間也不存在部分依賴和傳遞依賴(A->B、B->A這不算哦)(因為左邊(B、A)全為候選碼(A、B)),所以為BCNF。
例3. R( A, B, C),F= {B->C, AC->B}
1. 因為B->C表示B能推出C,所以AB+推出ABC;AC->B,所以AC+能推出ABC。
2. 因此AB、AC為候選碼,A、B、C為主屬性,不存在非主屬性。
3. 沒有非主屬性,不存在部分依賴、傳遞依賴,至少為3NF;因為左邊(B、AC)不全為候選碼(AB、AC)(因為主屬性C對候選碼AB為部分依賴(B->C)),所以不為BCNF。
例4. R( A, B, C),F= {A->C, A->B}
1. 因為A->C、A->B,所以A->BC,所以A為候選碼。
2. A為主屬性,B、C為非主屬性
3. 左邊都只有一個,不存在部分依賴;也不存在傳遞依賴;左邊(A)全為候選碼(A),所以為BCNF。
例5. R( A, B, C, D),F= {A->C, AD->B}
1. A->C,得到AD+->AC,因為AD->B,所以AD可以得到ABCD,因此AD為候選碼。
2. A、D為主屬性,B、C為非主屬性
3. 存在非主屬性C對主屬性A依賴,即A->C,但是對於候選碼AD而言,C部分依賴於AD,所以只有1NF。
例6. R( A, B, C, D),F= {A->C, BC->D}
1. A->C,BC->D可以得到ABC+(->AD)->BCDA,因為A->C,所以AB+->ABCD(A->C,可以得到AB->BC,因為BC->D,所以AB->BCD,所以AB+->ABCD)。
2. 候選碼為AB,主屬性為A、B,非主屬性為C、D
3. 非主屬性C依賴於主屬性A(A->C),所以對於候選碼AB而言,非主屬性C部分依賴於候選碼AB,所以為1NF。