MySQL数据库:范式
按照“數據庫規范化”對表進行設計,其目的就是減少數據庫中的數據冗余,以增加數據的一致性。
常見的范式有1NF、2NF、3NF、BCNF。下面對這幾種常見的范式進行簡要分析。
?
1、1NF(第一范式):
第一范式,就是數據表的列不可再分,數據庫表中的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。
看下面數據表,對于選課列明顯是可以再分的,所以它是違反第一范式的。
| 10001 | 張三 | 數學,語文,英語 |
| 10002 | 李四 | 語文,英語 |
| 10003 | 王五 | 語文,英語,歷史 |
?
2、2NF(第二范式):
第二范式必須先滿足第一范式。另外包含兩部分的內容:一是表必須有一個主鍵;二是表中非主鍵列必須完全依賴于主鍵,而不能只依賴于主鍵的一部分。
| 學號 | 課程 | 成績 | 課程學分 |
| 10001 | 數學 | 100 | 6 |
| 10001 | 語文 | 90 | 2 |
| 10001 | 英語 | 85 | 3 |
| 10002 | 數學 | 90 | 6 |
| 10003 | 數學 | 99 | 6 |
| 10004 | 語文 | 89 | 2 |
表中主鍵為 (學號,課程),我們可以表示為 (學號,課程) -> (成績,課程學分), 表示所有非主鍵列?(成績,課程學分)都依賴于主鍵?(學號,課程)。 但是,表中還存在另外一個依賴:(課程)->(課程學分)。這樣非主鍵列 ‘課程學分‘ 依賴于部分主鍵列 ’課程‘, 所以上表是不滿足第二范式的。
我們把它拆成如下2張表:
學生選課表:
| 學號 | 課程 | 成績 |
| 10001 | 數學 | 100 |
| 10001 | 語文 | 90 |
| 10001 | 英語 | 85 |
| 10002 | 數學 | 90 |
| 10003 | 數學 | 99 |
| 10004 | 語文 | 89 |
課程信息表:
| 數學 | 6 |
| 語文 | 3 |
| 英語 | 2 |
那么上面2個表,學生選課表主鍵為(學號,課程),課程信息表主鍵為(課程),表中所有非主鍵列都完全依賴主鍵。不僅符合第二范式,還符合第三范式。?
?
3、3NF(第三范式):
定義:首先是滿足?2NF,另外非主鍵列必須直接依賴于主鍵,表中的列不存在對非主鍵列的傳遞依賴。即不能存在:非主鍵列 A 依賴于非主鍵列 B,非主鍵列 B 依賴于主鍵的情況。
再看這樣一個學生信息表:
| 10001 | 張三 | 男 | 一班 | 小王 |
| 10002 | 李四 | 男 | 一班 | 小王 |
| 10003 | 王五 | 男 | 二班 | 小李 |
| 10004 | 張小三 | 男 | 二班 | 小李 |
上表中,主鍵為:(學號),所有字段 (姓名,性別,班級,班主任)都依賴與主鍵(學號),不存在對主鍵的部分依賴。所以是滿足第二范式。但是,表中存在一個傳遞依賴,(學號)->(班級)->(班主任)。也就是說,(班主任)這個非主鍵列依賴與另外一個非主鍵列 (班級)。所以不符號第三范式。
把這個表拆分成如下2個表:
學生信息表:
| 10001 | 張三 | 男 | 一班 |
| 10002 | 李四 | 男 | 一班 |
| 10003 | 王五 | 男 | 二班 |
| 10004 | 張小三 | 男 | 二班 |
班級信息表:
| 一班 | 小王 |
| 二班 | 小李 |
這樣,對主鍵的傳遞依賴就消失了。上面的2個表都符合第3范式。
?
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,區分它們的關鍵點在于,2NF:非主鍵列是否完全依賴于主鍵,還是依賴于主鍵的一部分;3NF:非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列。
?
4、BCNF(BC范式):
定義:在第三范式的基礎上,消除主屬性對于碼部分的傳遞依賴。
假設倉庫管理關系表(倉庫號,存儲物品號,管理員號,數量),滿足一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品,則存在如下關系:
(倉庫號,存儲物品號)——>(管理員號,數量)
(管理員號,存儲物品號)——>(倉庫號,數量)
所以,(倉庫號,存儲物品號)和(管理員號,存儲物品號)都是倉庫管理關系表的候選碼,表中唯一非關鍵字段為數量,它是符合第三范式的。但是,由于存在如下決定關系:
(倉庫號)——>(管理員號)
(管理員號)——>(倉庫號)
即存在關鍵字段決定關鍵字段的情況,因此其不符合BCNF。把倉庫管理關系表分解為兩個關系表? 倉庫管理表(倉庫號,管理員號) 和 倉庫表(倉庫號,存儲物品號,數量),這樣這個數據庫表是符合BCNF的,并消除了刪除異常、插入異常和更新異常。
?
5、4NF(第四范式):
設R是一個關系模型,D是R上的多值依賴集合。如果D中存在多值依賴X->Y時,X必是R的超鍵,那么稱R是第四范式的模式。
例如,職工表(職工編號,職工孩子姓名,職工選修課程),在這個表中,同一個職工可能會有多個職工孩子姓名,同樣,同一個職工也可能會有多個職工選修課程,即這里存在著多值事實,不符合第四范式。如果要符合第四范式,只需要將上表分為兩個表,使它們只有一個多值事實,例如職工表一(職工編號,職工孩子姓名),職工表二(職工編號,職工選修課程),兩個表都只有一個多值事實,所以符合第四范式。
?
原博客鏈接:https://blog.csdn.net/xidianliuy/article/details/51566576?
總結
以上是生活随笔為你收集整理的MySQL数据库:范式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArrayList与LinkedList
- 下一篇: Spring的Bean实例化、属性注入、