範式的理解,能夠說是在數據庫表設計時遵循的規範,這些規範有不一樣的級別。不一樣級別就對應不一樣的範式。數據庫
數據庫表的每一個屬性都是原子項,內容不可分割。也就是說每一個列的內容保持原子性,不可再劃分,即屬性不可分割。設計
不符合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 |
這裏每列的內容都是不可分割的,內容都保持了原子性,遵照了關係型數據庫的第一範式。數據
第二範式(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 | 安琪拉 |
知足第三範式(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:非主鍵列是直接依賴於主鍵,仍是直接依賴於非主鍵列。