1. 程式人生 > >【資料庫】(用例項解釋)關係正規化

【資料庫】(用例項解釋)關係正規化

關係正規化

函式依賴其實就如數學上的函式,Y=X+1,自變數X一定的情況下,因變數Y也確定了,那麼就可以說Y的取值就依賴於X的取值。

  • 函式依賴:(其實就是一一對應,知道A的值可以確定B的值,A→B,則稱B依賴於A)
    兩個例項化的屬性集X,Y,如果屬性集X中的兩個元組取值相同,必有對應的另外一個屬性集Y中元組取值相同,則稱Y函式依賴於X函式。
    注意:如果屬性集X中不存在兩個取值相同的元組集合,則Y必定依賴於函式X,且函式X的屬性集為超鍵。

  • 部分函式依賴:設X,Y是關係R的兩個屬性集合,存在X→Y,若X’是X的真子集,存在X’→Y,則稱Y部分函式依賴於X。
    例如:通過(A, B)→C,如果 A或B→C ,那麼說C部分依賴於(A, B)。

  • 完全函式依賴:設X,Y是關係R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每一個X’都有X’!→Y,則稱Y完全函式依賴於X。
    例如:通過(A, B)→C,但是 A或B單獨得不出C ,那麼說C完全依賴於(A, B)。

  • 傳遞函式依賴:設X,Y,Z是關係R中互不相同的屬性集合,存在X→Y(Y !→X),Y→Z,則稱Z傳遞函式依賴於X。
    例如:通過A→B,通過B→C,但是C得不到B,B得不到A,那麼說C傳遞依賴於A。

BTW:很多人不理解為什麼要反著說,不說X確定Y,而說Y依賴X。
其實很簡單,創造者習慣於把主鍵(X)定下來當一個固定量,用非主鍵(Y)來跟主鍵部分比較,看看是否依賴。


規範化的過程可概括如下:

  • 取原始的1NF關係投影,消去非主屬性對鍵的部門函式依賴,從而產生一組2NF關係。
  • 取2NF關係的投影,消去非主屬性對鍵的傳遞函式依賴,產生一組3NF關係。
  • 取這些3NF的投影,消去決定因素不是鍵的函式依賴。產生一組BCNF關係。
  • 取這些BCNF關係的投影,消去其中不是函式依賴的非平凡多值依賴,產生一組4NF關係。

  • 主屬性:是在一個關係中構成某一個候選碼的屬性的其中一個屬性。

正規化:

  • 第一正規化:即 表中的每一個屬性都是不可再分的。
  • 第二正規化:符合1NF,且所有的非主屬性都完全依賴於主鍵。(任何非主屬性都不能部分依賴任一侯選碼(即 必須完全依賴))
  • 第三正規化:符合2NF,並要求任何非主屬性不依賴於其他非主屬性。(任何非主屬性都不能傳遞依賴任一侯選碼)
  • BC正規化(BCNF):符合3NF,並且主屬性內部不能有部分或傳遞依賴。(任何屬性都不能傳遞依賴任一侯選碼)
  • 第四正規化:消除多值依賴
  • 第五正規化:消除傳遞依賴

第一正規化(1NF)

第一正規化:屬性(列)不可分割。

第一正規化:所謂第一正規化,就是資料表的列不可再分。
不過能不能再分並沒有絕對的答案,看需求,也就是看你的設計目標而定。

例子:就比如說名字吧,我可以再分成英文名和中文名;電話我也可以分成行動電話和座機。

簡單來說,第一正規化是關係資料庫的基礎,但欄位是否真的不可拆分,根據你的設計目標而定。

例如:

學號 姓名 選課
1 張三 語文、數學、英語
2 李四 語文、數學

上面這個表明顯是可以再分的,所以它是違反第一正規化的。


修改:

學號 姓名 選課
1 張三 語文
1 張三 數學
1 張三 英語
2 李四 語文
2 李四 數學

第二正規化(2NF)

第二正規化:在1NF的基礎上,任何非主屬性都不能部分依賴任一侯選碼(即 必須完全依賴) (消除部分依賴)

  • 要求:在第一正規化的基礎上,且每一個非主屬性完全函式依賴於候選碼。
  • 特點:
    • 滿足第一正規化。
    • 表中的每一個非主屬性,必須完全依賴於本表主鍵。
    • 只有當一個表中,主碼由兩個或以上的屬性組成的時候,才會出現不符合第二正規化的情況。

例如:

學號 課程 學分 成績
1 數學 6 100
1 英語 4 90
2 數學 6 90
3 英語 4 100

上表主鍵為(學號,課程)
(學號,課程)→(成績,學分),學號和課程可以唯一確定成績和學分
但是對於學分來說,只需要知道課程就能確定學分了,所以學分部分依賴於(學號,課程),不滿足第二正規化。

修改:把它拆成兩個表

學號 課程 成績
1 數學 100
1 英語 90
2 數學 90
3 英語 100
課程 學分
數學 6
英語 4

第三正規化(3NF)

第三正規化:在2NF的基礎上,任何非主屬性都不能傳遞依賴任一侯選碼,即 非主屬性不依賴於其他非主屬性。(消除傳遞依賴)

例如:

學號 姓名 班級 班主任
1 張三 A 張3
2 李四 A 張3
3 王五 B 王5
4 趙六 B 王5

上表中,主鍵為(學號)。
很明顯所有非主屬性都依賴於主鍵,不存在部分依賴,滿足第二正規化。
但是,表中存在一個傳遞依賴,(學號)→(班級)→(班主任),即 非主屬性(班級)依賴於其他非主屬性(班主任)。
不滿足第三正規化。

修改:

學號 姓名 班級
1 張三 A
2 李四 A
3 王五 B
4 趙六 B
班級 班主任
A 張3
B 王5

BC正規化(BCNF)

BC正規化:在3NF基礎上,任何欄位都不能傳遞依賴任一侯選碼。

更高階正規化

還有第四正規化、第五正規化。
太麻煩了,基本不需要,所以這裡就不介紹了