2019-07-16數據庫
關鍵字:1NF, 2NF, 3NF, BCNF, 4NF, 5NF、三範式運維
數據庫在設計過程當中很重要的一個步驟就是根據咱們所瞭解到的業務信息來進行「數據庫建模」。設計
數據庫模型的好壞直接關係到咱們後面的開發工做的難易程度,更重要的是會影響到系統上線後的運維工做的可操做性。blog
數據庫在建模過程當中對庫表範式的選型也很重要,咱們必須在建模時期就敲定好,由於後續若是要改變範式那但是很困難的。開發
數據庫的範式說白了就是咱們要如何來根據業務設計數據表。基礎
數據庫範式的目的是爲了減小數據冗餘,解除數據之間的業務耦合,提高靈活性。im
數據庫範式目前共有六種數據
一、第一範式(1NF)關係型數據庫
二、第二範式(2NF)圖表
三、第三範式(3NF)
四、巴斯•科德範式(BCNF)
五、第四範式(4NF)
六、第五範式(5NF)
數據庫範式越高,對於設計範式的目的的知足程度就越好,但一樣的維護起來也就越困難,畢竟凡事都具備雙面性~
通常而言,設定到第三範式就能夠了,它各方面的表現最爲中庸均衡。越往上就越少見,甚至有些範式只存在於傳說中。好比 第六範式。
下面咱們就針對這幾個範式逐個來了解一下它們的要求,並給出一個小例子以加深理解。
第一範式的核心就是「原子性」!它一般要知足以下幾點要求
一、二維數據表
二、每一列的數據都是相同含義的
三、每一個元素不可出現多值的狀況
四、不得出現相同含義的字段
五、肯定主鍵
首先咱們得來了解了解什麼纔是「原子性」。
原子性就是所描述的事物的單位已經達到最小程度,已經不可再細分了。多說無益,直接來看看下面的數據表。
像上面這張表,班級部分就不是原子性的。由於它還能夠再進一步拆分紅年級和班級。上面這張數據表的符合原子性的形式應該以下圖表所示
其次是瞭解第一範式下的其它幾點要求。先看第 1 點,數據庫中的數據源可能有多種多樣,但對於數據庫建模而言,無論你什麼來源的數據,無論你是結構化的仍是半結構化的亦或是非結構化的,都得轉成統一格式的二維數據表。並且這裏所說的數據庫範式都是基於關係型數據庫而言的。
第 2 點,同一列中的全部數據所表示的含義必須是同一種類型的。舉個小例子,下面所示的數據表就不知足於這一條
上圖所示數據表的成績列就是設計不合理的示例。一個合格的數據表是絕對不能出現這種狀況的。而對於這種狀況的解決辦法也簡單,將不一樣類型的值拆成多個列就是了。以下圖所示
至於第 3 點與第 4 點,應該將它們一塊兒看待。直接看圖
對於這種某一項的值有多個的狀況,一種可能的作法就是將多個值以逗號分隔符隔開。但不少人都能意識到這樣作很不妥。因而又可能會有如下升級版本
但這樣作也仍是不妥。同一種字段在一張表中出現了兩次,重複定義了。符合範式的作法應當是將這張表拆分紅兩張表,以下圖所示
第 5 點就很簡單了。對於咱們的關係型數據庫表,都得肯定好主鍵,或複合主鍵或單主鍵。
在瞭解了第一範式之後,剩下的範式就稍微沒這麼多「內容」了。前面說過,每一級範式都是基於它的上一級範式添加了一層限制的。
第二範式就是在第一範式的基礎之上添加了一個「關係依賴」的限制。
其實第二範式主要用於限制擁有複合主鍵的數據表。第二範式要求全部非主鍵字段必需要依賴於全部的主鍵,而不能出現某些普通字段僅依賴於部分主鍵的狀況。
咱們直接來看一個例子,假設有以下圖所示數據表
在這張表中擁有複合主鍵:學號、課程號。
咱們能夠發現,成績是既依賴於課程號主鍵又依賴於學生學號主鍵的,但授課老師僅僅依賴於課程號主鍵,而與學號沒有關係。
所以,這張表不知足於第二範式。符合於第二範式的表形式應該以下圖表所示
第三範式天然是在第二範式的基礎之上又加了一種限制關係。
第三範式要求任何非主鍵字段不得依賴於其它非主鍵字段,非主鍵字段只能依賴於主鍵字段。
第三範式的目的是要消除「傳遞依賴」關係的。通俗地解釋一下傳遞依賴,假設有一個主鍵A,以及普通鍵B和普通鍵C。現有普通鍵B依賴於主鍵A,而普通鍵C不依賴於主鍵A。可是,普通鍵C會依賴於普通鍵B。那這就會致使普通鍵C間接依賴於主鍵A。這種間接依賴關係就是所謂的「傳遞依賴」關係。
咱們仍是來看一下具體的例子,仍是拿上面學生信息數據庫的例子來看。假設有一張表,其結構以下圖所示
在上面的例子中系編號是主鍵。咱們能夠明顯看出,學號是會依賴於主鍵系編號的,但姓名不會依賴於系編號只會依賴於學號。由此一來姓名就會間接地依賴於系編號,這是不符合第三範式要求的。要修改的符合第三範式要求,只須要將它們拆分紅兩張表便可,以下圖所示
BCNF在第三範式的基礎之上進一步限定了屬性之間的關係。它要求任何字段都不能依賴於非主健字段。由於這裏已經知足了第三範式了,因此這個範式的要求其實能夠簡化爲:主鍵字段不得依賴於非主鍵字段。
當知足第三範式的數據表有如下兩種基本條件時就有可能會不知足巴斯科德範式
一、有聯合主鍵
二、有重複的候選健
從BCNF開始的範式,就專門研究主鍵字段,並且還得是聯合主鍵的狀況。
第四範式的目的是要消除多值依賴。什麼是多值依賴呢?
假設有三個字段做聯合主鍵,它們分別爲 A, B, C。AB, AC都存在關係,B和C不要緊。
這樣一來就會致使B和C存在間接依賴關係。第四範式要作的就是消除這種間接依賴的關係。解決的辦法天然也是拆拆拆。
第五範式研究的仍然是具備聯合主鍵的表。
假設某張表有三個聯合主鍵,分別爲 A, B, C。若AB有關係,AC有關係,BC也有關係。那麼這樣的表就是知足第四範式的,可是它卻不知足第五範式。由於這種主鍵兩兩之間都有關係的表它存在「鏈接依賴」。
解決的辦法仍然是拆分紅多個表。每兩個主鍵拆成成一張表。
----
再次強調,在平常工做中,數據庫表的範式設計成知足到第三範式就能夠了,偶爾可能會出現意外知足了BCNF的狀況。再往上的範式就不建議了,由於範式越高雖然數據庫越靈活,可是反過來它使用起來也越困難。凡事都有它的兩面性。第三範式就是一個折中的選擇。