https://blog.csdn.net/wyh7280/article/details/83350722 範式通俗理解:1NF、2NF、3NF和BNCF原創hongiii 最後發佈於2018-10-24 21:03:43 閱讀數 14993 收藏展開範式通俗理解:1NF、2NF、3NF和BNCF ...
https://blog.csdn.net/wyh7280/article/details/83350722
範式通俗理解:1NF、2NF、3NF和BNCF
原創hongiii 最後發佈於2018-10-24 21:03:43 閱讀數 14993 收藏
展開
範式通俗理解:1NF、2NF、3NF和BNCF
準備知識
超鍵、候選鍵、主鍵
函數依賴
部分依賴
傳遞依賴
範式
1NF
2NF
3NF
BCNF
參考
準備知識
超鍵、候選鍵、主鍵
超鍵
超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵
候選鍵
候選鍵(candidate key):不含有多餘屬性的超鍵稱為候選鍵。也就是關係中的一個屬性組,其值能唯一標識一個元組。若從屬性組中去掉任何一個屬性,它就不具有這一性質了,這樣的屬性組稱作候選鍵。
主屬性:任何一個候選鍵中的屬性稱作主屬性。(請記住這個概念)
主鍵
主鍵(primary key):用戶從一個關係的多個候選鍵中,選定一個作為主鍵。
結合具體的例子進行解釋,現有學生表如下:
學生(學號,姓名,性別,身份證號)
學號 姓名 性別 身份證號
1 小王 男 344
2 小吳 女 354
3 小麗 女 364
4 小張 男 374
超鍵
由超鍵的定義可知,在學生表中含有學號或者身份證號的任意組合都可以唯一標識一個學生,那麼它們就是此表的超鍵。如:(學號)、(身份證號)、(學號,姓名)、(身份證號,性別)等。
候選鍵
候選鍵屬於超鍵,它是最小的超鍵,就是說如果再去掉候選鍵中的任何一個屬性它就不再是超鍵了。對於(學號、姓名)來說,去掉姓名後仍是一個超鍵,那麼它就不是候選鍵。其中,學生表中的候選鍵為:(學號)、(身份證號),主屬性就是學號、身份證號。
主鍵
主鍵就是候選鍵裡面的一個,用戶可以選擇,那麼在這裡我們選擇(學號)作為學生表的主鍵。
鍵 = 碼,英文key。
函數依賴
這裡先給出數學描述,再進行通俗解釋。
數學描述
通俗理解
函數依賴的英文定義是:
The value of one or a group attributes can decide the value of other
attributes.
很容易理解,也就是一個或者一組屬性的值可以決定其他屬性的值。候選鍵都可以做到。
部分依賴
數學描述
通俗理解
部分依賴是什麼情況呢?
舉個例子,現有一關於學生的關係模式Student(學生編號 , 學生姓名, 班級編號, 院系, 課程編號 , 成績)
學生編號 學生姓名 班級編號 院系 課程編號 成績
S01 楊明 D01 思齊 C01 90
S02 李婉 D01 思齊 C01 87
S01 楊明 D01 思齊 C02 92
S03 劉海 D02 述聖 C01 95
S04 安然 D02 述聖 C02 78
S05 樂天 D03 省身 C01 82
(學生編號#、課程編號#)作為主鍵,可以唯一標識每條元組,但是對於學生姓名、學生所屬的班級編號、院系,這三個屬性可以直接通過學生編號來確定,在這裡課程編號#顯得很多餘。於是稱,學生姓名、班級編號、院系對(學生編號#、課程編號#)部分函數依賴。
即,非主屬性對鍵有部分函數依賴。
主屬性:任何一個候選鍵中的屬性稱作主屬性。
鍵在這裡理解成候選鍵
傳遞依賴
數學描述
通俗理解
繼續以Student表為例,
學生編號 學生姓名 班級編號 院系 課程編號 成績
S01 楊明 D01 思齊 C01 90
S02 李婉 D01 思齊 C01 87
S01 楊明 D01 思齊 C02 92
S03 劉海 D02 述聖 C01 95
S04 安然 D02 述聖 C02 78
S05 樂天 D03 省身 C01 82
學生編號可以唯一確定他所在的院系,但是註意到這中間存在傳遞過程,即學生編號唯一確定該學生所對應的班級編號,班級編號對應唯一的院系。我們稱,院系對學生編號傳遞函數依賴。
即,非主屬性對鍵有部分函數依賴。
主屬性:任何一個候選鍵中的屬性稱作主屬性。
範式
關係資料庫中的模式設計要滿足一定的規範,引入了範式這一概念。
不管做哪種範式的設計,最終要的思想是“one fact in one place”,也就是“一事一地”。
1NF
定義:關係中每一分量不可再分。即不能以集合、序列等作為屬性。(也就是不能表中套表,要保證數據的原子性。)
舉例
學生編號 課程編號
S01 {C1,C2,C3}
S02 {C1,C4}
它就不滿足1NF,因為{C1,C2,C3}和{C1,C4}是集合。
修改為符合1NF:
學生編號 課程編號
S01 C1
S01 C2
S01 C3
S02 C1
S02 C4
2NF
定義:在1NF基礎上,消除非主屬性對鍵的部分依賴,則稱它符合2NF。
根據上面對部分依賴的分析,對於Student表:
學生編號 學生姓名 班級編號 院系 課程編號 成績
S01 楊明 D01 思齊 C01 90
S02 李婉 D01 思齊 C01 87
S01 楊明 D01 思齊 C02 92
S03 劉海 D02 述聖 C01 95
S04 安然 D02 述聖 C02 78
S05 樂天 D03 省身 C01 82
對於學生姓名、學生所屬的班級編號、院系,這三個屬性可以直接通過學生編號來確定,在這裡課程編號#顯得很多餘。也就是,學生姓名、班級編號、院系對(學生編號#、課程編號#)部分函數依賴。把Student表進行拆分,可以消除部分依賴。
其中,學生表Student如下:
學生編號 學生姓名 班級編號 院系
S01 楊明 D01 思齊
S02 李婉 D01 思齊
S01 楊明 D01 思齊
S03 劉海 D02 述聖
S04 安然 D02 述聖
S05 樂天 D03 省身
學生-課程表如下:
學生編號 課程編號 成績
S01 C01 90
S02 C01 87
S01 C02 92
S03 C01 95
S04 C02 78
S05 C01 82
符合2NF。
3NF
定義:在2NF基礎上,消除非主屬性對鍵的傳遞依賴,則稱它符合3NF。
根據上面對傳遞依賴的分析,對於Student表,學生編號可以唯一確定他所在的院系,但是註意到這中間存在傳遞過程,即學生編號唯一確定該學生所對應的班級編號,班級編號對應唯一的院系。我們稱,院系對學生編號傳遞函數依賴。
把Student表繼續進行拆分,可以消除傳遞依賴。
其中,學生表Student如下:
學生編號 學生姓名 班級編號
S01 楊明 D01
S02 李婉 D01
S01 楊明 D01
S03 劉海 D02
S04 安然 D02
S05 樂天 D03
班級-院系表如下:
班級編號 院系
D01 思齊
D02 述聖
D03 省身
符合2NF。
BCNF
我當時在看BCNF的時候,這塊是最懵的地方,網上找的例子五花八門……解釋和過程感覺沒有比較詳細的,最後反正得到了一個結果orz。我本來想把這個範式按照類似的定義來寫的……但是到BNCF發現不能直接寫成“在3NF基礎上,消除主屬性對鍵的部分依賴、傳遞依賴,則稱它符合BCNF。”
因為這樣不太好解釋,故而調整了方案。我認為,理解更重要。
先給個文縐縐的定義
換言之,對於關係模式R,如果每一個函數依賴的決定因素都包含鍵,則R屬於BCNF範式。
現在舉例,現有關係模式:通訊(城市名,街道名,郵政編碼)
函數依賴關係集為:
F={(城市名,街道名)-> 郵政編碼,郵政編碼 -> 城市名}
也就是一個城市名和一個街道名,對應一個郵政編碼;一個郵政編碼對應一個城市名。
此時,候選鍵(城市名,街道名)非主屬性郵政編碼完全依賴於候選鍵,且無傳遞依賴,屬於3NF。
那麼它是否屬於BCNF呢?我們按照下麵的定義來看一下,
換言之,對於關係模式R,如果每一個函數依賴的決定因素都包含鍵,則R屬於BCNF範式。
對於決定因素(城市名,街道名),它包含鍵(城市名,街道名),其實它本身就是鍵了,沒問題;
對於決定因素郵政編碼,它不包含鍵(城市名,街道名)
所以它不屬於BCNF。在關係模式R中,如果每一個決定因素都包含碼,則R屬於BCNF。
————————————————
版權聲明:本文為CSDN博主「hongiii」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wyh7280/article/details/83350722