資料庫系統原理中最容易混淆和難記的想必就是規範化理論了,涉及到的概念是一個接著一個,互相還有關聯,還有3天就要考試了,在這裡寫個總結留著複習。
主要涉及的概念有碼(鍵)、超碼(超鍵)、候選碼(候選鍵)、主碼(主鍵)、全碼(全鍵)、 主屬性、非主屬性、函式依賴、完全函式依賴、部分函式依賴、傳遞函式依賴,最終由以上概念推出第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯正規化(BCNF)
碼、超碼、候選碼、主碼、全碼
碼:能唯一標識記錄的屬性(或屬性組)
超碼:能移去某個屬性,移除後還是碼,稱為超碼
候選碼:不能移去任何一個屬性的碼,移除不是碼,稱為候選碼
主碼:從候選碼中選出來用來唯一標識關係的屬性(或屬性組)
全碼:表中所有屬性作為主碼
碼之間的包含關係如下圖:
主屬性與非主屬性
主屬性:在一個關係中包含任一候選碼的屬性,稱為主屬性
非主屬性:在一個關係中不包含任一候選碼的屬性,稱為非主屬性
函式依賴
函式依賴(FD)是指關係中屬性間的對應關係,其定義如下:
定義:設 R 為任一給定關係,如果對於 R 中屬性 X 的每一個值,R 中的屬性 Y 只有唯一值與之對應,則稱 X 函式決定 Y 或稱 Y 函式依賴於 X,記作 X→Y。其中 X 稱為 Y 的決定因素。
同一表中兩個屬性(或屬性組)X能唯一確定Y,就稱X決定Y,它們兩者間有函式依賴關係。
完全函式依賴
定義:設 R 為任一給定關係,X、Y 為其屬性集,若 X→Y,且對 X 中的任何真子集 X' 都有 X' ↛ Y,則稱 Y 完全函式依賴於 X。
同一表中的 X、Y 兩個屬性集中,如果 X 的每個屬性(或屬性組)都不能唯一確定Y的所有屬性,就是完全函式依賴。
部分函式依賴
定義:設 R 為任一給定關係,X、Y為其屬性集,若 X→Y,且 X 中存在一個真子集 X' 滿足 X'→Y,則稱 Y 部分函式依賴於 X。
同一表中的 X、Y 兩個屬性集中,如果 X 的某個屬性(或屬性組)能唯一確定 Y 的所有屬性,就是部分函式依賴。
注意:如果將某個換成全部就成了完全函式依賴。
傳遞函式依賴
定義:設 R 為任一給定關係,X、Y、Z 為其不同屬性子集,若 X→Y,Y ↛ X,Y→Z,則有 X → Z,稱為 Z 傳遞函式依賴於 X。
同一表中三個不同屬性組 X、Y、Z,如果 X 能確定唯一的 Y,Y 不能確定唯一的 X,同時 Y 能確定唯一的 Z,就會出現 X 能唯一確定 Z 的情況,就是傳遞函式依賴。
正規化
所謂正規化就是規範的方法,出現關聯式資料庫的正規化是消除因資料冗餘而導致的更新異常、插入異常、刪除異常。
資料冗餘:指同一資料被反覆儲存的情況
更新異常:資料冗餘造成的儲存空間浪費和潛在的資料不一致性及修改麻煩的問題
插入異常:插入資料庫資料失敗的問題
刪除異常:不應該刪去的內容被刪除的情況
資料庫正規化常用的有四種,第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯正規化(又稱增強版3NF,BCNF)
將低一級的正規化的關係模式通過模式分解轉換成高一級的正規化的過程稱為規範化。
以下正規化舉例中,可以將候選碼看作主鍵便於理解(畢竟主碼是特殊的候選碼)
1NF
第一正規化定義:設 R 為任一給定關係,如果 R 中每個列與行的交點行的取值都是不可再分的基本元素,則 R∈1NF。
1NF 是最簡單的正規化,意思是關係模式組織的二維表結構中,所有屬性不可再分,不允許出現表中有表的情況。
所有關係模式中的二維表都滿足 1NF。
1NF 仍存在資料冗餘、更新異常、插入異常等問題。
2NF
第二正規化定義:設 R 為任一給定關係,若 R∈1NF,且其所有非主屬性都完全依賴於候選碼,則 R∈2NF。
2NF 消除了非主屬性的部分函式依賴,所有不是候選碼的屬性都能通過候選碼唯一確定。
舉例:假設有 R={A,B,C,D},F={AC→B,C→D},如果集合 R 的屬性函式依賴關係是 F,則 R不滿足第二正規化。首先我們不難看出 R 的候選碼為 AC,在 AC→D 上有 C→D 存在部分依賴關係,所以 R 不滿足第二正規化。
2NF 仍存在插入、刪除操作異常與修改麻煩問題。
3NF
第三正規化定義:設 R 為任一給定關係,若 R 為 2NF,且其每一個非主屬性都不傳遞函式依賴於候選,則 R ∈3NF。
3NF 在 2NF 基礎上消除了非主屬性的傳遞函式依賴。
舉例:假設有 R={A, B, C, D},F={A→B, A→C, C→D},可以看到 A 為 R 的候選碼,在 F 中有A→C,C→D,而且 D 不屬於主屬性,這就存在了非主屬性 D 傳遞依賴於 R 的候選碼 A。所以 R 不屬於第三正規化。
3NF 能解決大多數插入、刪除操作異常的問題,資料冗餘也得到有效控制。
BCNF
巴斯正規化定義:設 R 為任一給定關係,X、Y 為其屬性集,F 為其函式依賴集,若 R 為 3NF,且其 F 中所有函式依賴 X→Y(Y∉X)中的 X 必包含候選碼,則 R∈BCNF。
簡單來講,在 3NF基礎上,若 F 中每一個函式依賴的決定因素都包含候選碼,就一定是 BCNF。
舉例:假設有 R={A, B, C, D},F={AB→C, AB→D, D→A},不難發現 AB 為 R 的候選鍵,函式依賴關係中沒有非主屬性的部分依賴和傳遞依賴,所以 R 是屬於第三正規化的。但是不屬於 BCNF,由於 D→A 的決定因素 D 不包含在 R 的候選碼中。
BCNF 解決了插入及刪除操作異常問題。
總結
基礎概念就不再總結了,把各正規化做了哪些事情簡單總結下:
- 1NF 確保屬性不可再分,不會出現表中有表的情況。
- 2NF 消除非主屬性的部分函式依賴,減少了資料冗餘。
- 3NF 清除非主屬性的傳遞函式依賴,解決大多數插入、刪除操作異常的問題,資料冗餘也有效控制住了。
- BCNF 確保決定因素必須包含主鍵,解決了所有插入、刪除操作異常的問題。
由低正規化向高正規化轉換方法總結(拆表):
1NF→2NF:
找到候選關鍵字,看其餘的屬性是否完全依賴候選關鍵字
-
是的,與候選關鍵字一同抄下來形成一個表格
-
不是的,抄下來,形成第二個表格,並且將候選關鍵字裡能夠唯一決定表格2的屬性組抄在第一列
2NF→3NF:
-
找到表格中的傳遞函式依賴關係的三個屬性組,設為 X、Y、Z
-
將這三個屬性組拆成兩個表格,第一個表格為X、Y,第二個表格為Y、Z
3NF→BCNF:
-
列出表格中所有函式依賴關係
-
每個函式依賴關係拆出一個表格
行文過程中難免出現錯誤,如有錯誤歡迎大家評論告知。
本文同步釋出於部落格園(東北小狐狸 https://www.cnblogs.com/hellxz/)與CSDN(東北小狐狸-Hellxz https://blog.csdn.net/u012586326)禁止轉載。