范式通俗理解: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM