關係型數據庫的範式理解-小記

關係型數據庫的範式理解-小記

範式的理解,能夠說是在數據庫表設計時遵循的規範,這些規範有不一樣的級別。不一樣級別就對應不一樣的範式。數據庫

1.第一範式(1NF)

數據庫表的每一個屬性都是原子項,內容不可分割。也就是說每一個列的內容保持原子性,不可再劃分,即屬性不可分割。設計

不符合1NF的表設計:遊戲

id 名字 聯繫方式
1 小喬 123@gmail.com,18878051234
2 大喬 456@gmail.com,18878051235
3 安琪拉 789@gmail.com,18878051236

上面的表格中聯繫方式字段「123@gmail.com,18878051234」就沒有保持原子性,還能夠分割爲兩種,因此不符合第一範式。修改後,符合1NF的樣子應該以下:table

符合1NF的表設計:class

id 名字 郵箱 電話
1 小喬 123@gmail.com 18878051234
2 大喬 456@gmail.com 18878051235
3 安琪拉 789@gmail.com 18878051236

這裏每列的內容都是不可分割的,內容都保持了原子性,遵照了關係型數據庫的第一範式。數據

2.第二範式(2NF)

第二範式(2NF)必須先知足第一範式(1NF)。第二範式要求記錄不重複,即要有主鍵(或組合主鍵),要求其餘字段都依賴於整個主鍵,而不是僅僅依賴主鍵的一部分。關係型數據庫

不符合2NF的表設計:比賽成績表tab

id 名字 比賽類型 成績-助攻數
1 小喬 五人匹配 5
2 大喬 人機 10
3 安琪拉 1VS1 7

上面的表能夠看到,成績是由id和比賽類型決定的,玩一局遊戲的助攻數,確定是要明確是誰在哪一場比賽的成績,「id-比賽類型」組成了這個表的主鍵。可是人物名字只須要id就能夠肯定了,並不須要整個組合主鍵「id-比賽類型」來決定,因此這個表不符合2NF。比賽

符合2NF的表設計:mail

(1)比賽成績表

id 比賽類型 成績-助攻數
1 五人匹配 5
2 人機 10
3 1VS1 7

(2)人物表

id 名字
1 小喬
2 大喬
3 安琪拉

3.第三範式(3NF)

知足第三範式(3NF)必須先知足第二範式(2NF)。

第三範式就是非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在非主鍵列A依賴於非主鍵列B,非主鍵列B依賴於主鍵的狀況。
通俗一點,就是在其餘表中的信息不能重複出現,若是出現則要求這個信息是其餘表的主鍵(在本表就是「外鍵」)。

不符合3NF的表設計:

id 名字 老公 老公姑媽 老公姑媽的外公
1 小喬 周瑜 周姑媽 周姑媽外公
2 大喬 孫策 孫姑媽 孫姑媽外公
3 孫尚香 劉備 劉姑媽 劉姑媽外公

顯然上面的表中有一個關係鏈,3NF裏面不容許存在傳遞的關係。好比第一行,名字小喬依賴於逐漸id,老公周瑜只依賴於id,這都是沒問題的,可是後面周姑媽就僅依賴於非主鍵列周瑜,不依賴主鍵id,這是不符合3NF的。

符合3NF的表設計:

(1)人物關係表1

id 名字 老公
1 小喬 周瑜
2 大喬 孫策
3 孫尚香 劉備

(2)人物關係表2

id 老公名字 老公姑媽
1 周瑜 周姑媽
2 孫策 孫姑媽
3 劉備 劉姑媽

(3)人物關係表3

id 姑媽名字 姑媽的外公
1 周姑媽 周姑媽外公
2 孫姑媽 孫姑媽外公
3 劉姑媽 劉姑媽外公

劃分以後每一個表的每行的內容都沒有傳遞關係,並且僅依賴於主鍵,不依賴非主鍵。


注意:第二範式(2NF)和第三範式(3NF)的概念很容易混淆,區分關鍵點

  • 2NF:非主鍵列徹底依賴於主鍵,不能依賴於主鍵的一部分。

  • 3NF:非主鍵列是直接依賴於主鍵,仍是直接依賴於非主鍵列。

相關文章
相關標籤/搜索