【資料庫】(用例項解釋)關係正規化
關係正規化
函式依賴其實就如數學上的函式,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基礎上,任何欄位都不能傳遞依賴任一侯選碼。
更高階正規化
還有第四正規化、第五正規化。
太麻煩了,基本不需要,所以這裡就不介紹了