天天看點

MySQL 關系型資料庫設計範式(NF)

摘要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):要求資料庫表的每一列都是不可分割的原子資料項。

舉例說明:

MySQL 關系型資料庫設計範式(NF)

在上面的表中,“家庭資訊”和“學校資訊”列均不滿足原子性的要求,故不滿足第一範式,調整如下:

MySQL 關系型資料庫設計範式(NF)

可見,調整後的每一列都是不可再分的,是以滿足第一範式(1NF);

第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴于候選碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)

第二範式需要確定資料庫表中的每一列都和主鍵相關,而不能隻與主鍵的某一部分相關(主要針對聯合主鍵而言)。

舉例說明:

MySQL 關系型資料庫設計範式(NF)

在上圖所示的情況中,同一個訂單中可能包含不同的産品,是以主鍵必須是“訂單号”和“産品号”聯合組成,

但可以發現,産品數量、産品折扣、産品價格與“訂單号”和“産品号”都相關,但是訂單金額和訂單時間僅與“訂單号”相關,與“産品号”無關,

這樣就不滿足第二範式的要求,調整如下,需分成兩個表:

MySQL 關系型資料庫設計範式(NF)
MySQL 關系型資料庫設計範式(NF)

第三範式(3NF):在2NF基礎上,任何非主屬性不依賴于其它非主屬性(在2NF基礎上消除傳遞依賴)

第三範式需要確定資料表中的每一列資料都和主鍵直接相關,而不能間接相關。

舉例說明:

MySQL 關系型資料庫設計範式(NF)

上表中,所有屬性都完全依賴于學号,是以滿足第二範式,但是“班主任性别”和“班主任年齡”直接依賴的是“班主任姓名”,

而不是主鍵“學号”,是以需做如下調整:

MySQL 關系型資料庫設計範式(NF)
MySQL 關系型資料庫設計範式(NF)

這樣以來,就滿足了第三範式的要求。

ps:如果把上表中的班主任姓名改成班主任教工号可能更确切,更符合實際情況,不過隻要能了解就行。

BCNF範式

要了解 BCNF 範式,那麼先看這樣一個問題:

若:

  1. 某公司有若幹個倉庫;
  2. 每個倉庫隻能有一名管理者,一名管理者隻能在一個倉庫中工作;
  3. 一個倉庫中可以存放多種物品,一種物品也可以存放在不同的倉庫中。每種物品在每個倉庫中都有對應的數量。

那麼關系模式 倉庫(倉庫名,管理者,物品名,數量) 屬于哪一級範式?

答:已知函數依賴集:倉庫名 → 管理者,管理者 → 倉庫名,(倉庫名,物品名)→ 數量

碼:(管理者,物品名),(倉庫名,物品名)

主屬性:倉庫名、管理者、物品名

非主屬性:數量

∵ 不存在非主屬性對碼的部分函數依賴和傳遞函數依賴。∴ 此關系模式屬于3NF。

基于此關系模式的關系(具體的資料)可能如圖所示:

MySQL 關系型資料庫設計範式(NF)

好,既然此關系模式已經屬于了 3NF,那麼這個關系模式是否存在問題呢?我們來看以下幾種操作:

  1. 先新增加一個倉庫,但尚未存放任何物品,是否可以為該倉庫指派管理者?——不可以,因為物品名也是主屬性,根據實體完整性的要求,主屬性不能為空。
  2. 某倉庫被清空後,需要删除所有與這個倉庫相關的物品存放記錄,會帶來什麼問題?——倉庫本身與管理者的資訊也被随之删除了。
  3. 如果某倉庫更換了管理者,會帶來什麼問題?——這個倉庫有幾條物品存放記錄,就要修改多少次管理者資訊。

從這裡我們可以得出結論,在某些特殊情況下,即使關系模式符合 3NF 的要求,仍然存在着插入異常,修改異常與删除異常的問題,仍然不是 ”好“ 的設計。

造成此問題的原因:存在着主屬性對于碼的部分函數依賴與傳遞函數依賴。(在此例中就是存在主屬性【倉庫名】對于碼【(管理者,物品名)】的部分函數依賴。

解決辦法就是要在 3NF 的基礎上消除主屬性對于碼的部分與傳遞函數依賴。

倉庫(倉庫名,管理者)

庫存(倉庫名,物品名,數量)

這樣,之前的插入異常,修改異常與删除異常的問題就被解決了。

以上就是關于 BCNF 的解釋。

第四範式 4NF

定義: 限制關系模式的屬性之間不允許有非平凡且非函數依賴的多值依賴。

了解: 顯然一個關系模式是4NF,則必為BCNF。也就是說,當一個表中的非主屬性互相獨立時(3NF),這些非主屬性不應該有多值,若有多值就違反了4NF。

第五範式 5NF

第五範式有以下要求:

(1)必須滿足第四範式;

(2)表必須可以分解為較小的表,除非那些表在邏輯上擁有與原始表相同的主鍵。

第五範式是在第四範式的基礎上做的進一步規範化。第四範式處理的是互相獨立的多值情況,而第五範式則處理互相依賴的多值情況。

資料庫設計逆範式

就是有的時候拆分的太細緻了, 讓連表産生了很多的查詢時間, 如果有一個字段經常被兩個地方使用到, 我們就會把這個字段放在第二個表字段裡面

逆範式化可以減少關聯查詢時,join表的次數。參考樣例:逆範式

ID 姓名 年齡 教室
1 張三峰 325 202
學科 教室 開始時間 結束時間
全棧 202 2017.4.18 2017.11.2

修改的内容的時候, 就會有多張表同時修改, 是以不要遺忘了任何一張表的内容。

繼續閱讀