摘要1:https://www.cnblogs.com/xietianjiao/p/10972285.html
摘要2:https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
摘要3:https://www.zhihu.com/question/24696366
摘要4:https://www.jianshu.com/p/14ed5d9f77f3
資料庫設計三大範式
目前關系資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。
注意:符合高一級範式的設計,必定符合低一級範式,例如符合2NF的關系模式,必定符合1NF。
而通常我們用的最多的就是第一範式(1NF)、第二範式(2NF)、第三範式(3NF),也就是本文要講的“三大範式”。
第一範式(1NF):要求資料庫表的每一列都是不可分割的原子資料項。
舉例說明:

在上面的表中,“家庭資訊”和“學校資訊”列均不滿足原子性的要求,故不滿足第一範式,調整如下:
可見,調整後的每一列都是不可再分的,是以滿足第一範式(1NF);
第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴于候選碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
第二範式需要確定資料庫表中的每一列都和主鍵相關,而不能隻與主鍵的某一部分相關(主要針對聯合主鍵而言)。
舉例說明:
在上圖所示的情況中,同一個訂單中可能包含不同的産品,是以主鍵必須是“訂單号”和“産品号”聯合組成,
但可以發現,産品數量、産品折扣、産品價格與“訂單号”和“産品号”都相關,但是訂單金額和訂單時間僅與“訂單号”相關,與“産品号”無關,
這樣就不滿足第二範式的要求,調整如下,需分成兩個表:
第三範式(3NF):在2NF基礎上,任何非主屬性不依賴于其它非主屬性(在2NF基礎上消除傳遞依賴)
第三範式需要確定資料表中的每一列資料都和主鍵直接相關,而不能間接相關。
舉例說明:
上表中,所有屬性都完全依賴于學号,是以滿足第二範式,但是“班主任性别”和“班主任年齡”直接依賴的是“班主任姓名”,
而不是主鍵“學号”,是以需做如下調整:
這樣以來,就滿足了第三範式的要求。
ps:如果把上表中的班主任姓名改成班主任教工号可能更确切,更符合實際情況,不過隻要能了解就行。
BCNF範式
要了解 BCNF 範式,那麼先看這樣一個問題:
若:
- 某公司有若幹個倉庫;
- 每個倉庫隻能有一名管理者,一名管理者隻能在一個倉庫中工作;
- 一個倉庫中可以存放多種物品,一種物品也可以存放在不同的倉庫中。每種物品在每個倉庫中都有對應的數量。
那麼關系模式 倉庫(倉庫名,管理者,物品名,數量) 屬于哪一級範式?
答:已知函數依賴集:倉庫名 → 管理者,管理者 → 倉庫名,(倉庫名,物品名)→ 數量
碼:(管理者,物品名),(倉庫名,物品名)
主屬性:倉庫名、管理者、物品名
非主屬性:數量
∵ 不存在非主屬性對碼的部分函數依賴和傳遞函數依賴。∴ 此關系模式屬于3NF。
基于此關系模式的關系(具體的資料)可能如圖所示:
好,既然此關系模式已經屬于了 3NF,那麼這個關系模式是否存在問題呢?我們來看以下幾種操作:
- 先新增加一個倉庫,但尚未存放任何物品,是否可以為該倉庫指派管理者?——不可以,因為物品名也是主屬性,根據實體完整性的要求,主屬性不能為空。
- 某倉庫被清空後,需要删除所有與這個倉庫相關的物品存放記錄,會帶來什麼問題?——倉庫本身與管理者的資訊也被随之删除了。
- 如果某倉庫更換了管理者,會帶來什麼問題?——這個倉庫有幾條物品存放記錄,就要修改多少次管理者資訊。
從這裡我們可以得出結論,在某些特殊情況下,即使關系模式符合 3NF 的要求,仍然存在着插入異常,修改異常與删除異常的問題,仍然不是 ”好“ 的設計。
造成此問題的原因:存在着主屬性對于碼的部分函數依賴與傳遞函數依賴。(在此例中就是存在主屬性【倉庫名】對于碼【(管理者,物品名)】的部分函數依賴。
解決辦法就是要在 3NF 的基礎上消除主屬性對于碼的部分與傳遞函數依賴。
倉庫(倉庫名,管理者)
庫存(倉庫名,物品名,數量)
這樣,之前的插入異常,修改異常與删除異常的問題就被解決了。
以上就是關于 BCNF 的解釋。
第四範式 4NF
定義: 限制關系模式的屬性之間不允許有非平凡且非函數依賴的多值依賴。
了解: 顯然一個關系模式是4NF,則必為BCNF。也就是說,當一個表中的非主屬性互相獨立時(3NF),這些非主屬性不應該有多值,若有多值就違反了4NF。
第五範式 5NF
第五範式有以下要求:
(1)必須滿足第四範式;
(2)表必須可以分解為較小的表,除非那些表在邏輯上擁有與原始表相同的主鍵。
第五範式是在第四範式的基礎上做的進一步規範化。第四範式處理的是互相獨立的多值情況,而第五範式則處理互相依賴的多值情況。
資料庫設計逆範式
就是有的時候拆分的太細緻了, 讓連表産生了很多的查詢時間, 如果有一個字段經常被兩個地方使用到, 我們就會把這個字段放在第二個表字段裡面
逆範式化可以減少關聯查詢時,join表的次數。參考樣例:逆範式
ID | 姓名 | 年齡 | 教室 |
1 | 張三峰 | 325 | 202 |
學科 | 教室 | 開始時間 | 結束時間 |
全棧 | 202 | 2017.4.18 | 2017.11.2 |
修改的内容的時候, 就會有多張表同時修改, 是以不要遺忘了任何一張表的内容。