范式通俗理解:1NF、2NF、3NF和BNCF
范式通俗理解: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。
參考
[1] 超鍵、候選鍵、主鍵、外鍵介紹
[2] 數據庫設計與管理
總結
以上是生活随笔為你收集整理的范式通俗理解:1NF、2NF、3NF和BNCF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 压缩包详解及伪加密
- 下一篇: 图形学-二维图形的裁剪1.Cohen 2