詳細解析查看百度百科:數據庫範式數據庫
如何理解這幾個範式的含義?光看字面意思就很是的晦澀!函數
這幾種範式有什麼意義呢?能夠簡單理解爲是一種設計標準。url
通常咱們是如何設計表字段呢? 彷佛並無什麼硬性的要求,能夠把一個表搞成幾個表,反過來也行;spa
幾十個字段放一塊兒也行,拆分在不一樣的地方也行。可是,這種爲所欲爲的設計,項目是走不長遠的 設計
1NF理解起來比較容易,關係型數據庫通常都知足這個,是關係型數據庫最基本的要求了。blog
即每一列所表明的數據屬性是不可再分的,就像原子一眼,已是物質構成的最小單位。以下圖:get
圖1數學
商品類型列包涵了2種屬性:分類ID與名稱;hash
這在數據庫表中是不可能存在的,即取數據的時候「商品類型」這一列不可能即表明名稱又表明ID,符合1NF要求的表應該以下:it
圖2
這樣設計就比較清晰明瞭了;1NF比較好理解,通常都不會犯錯誤這種錯誤,但也不排除例外的。
好比難道就不能按照必定格式存儲嗎,好比這樣:分類ID|分類名稱、或這樣:{cls=分類ID,title=名稱}
固然能夠那樣作!你把「分類ID與類型名稱」hash取值再取模再平方均可以。但那樣就算是破壞了規則了,旁門左道說的就是如此。
好了,咱們的表也已經符合1NF了, 是否是這樣就萬事大吉了呢?咱們來試試看;
一、查看每一行數據,發現商品名稱、分類ID、類型名稱等信息重複屢次,數據冗餘太大了,待改進!
二、新增記錄,假設新設置了一個分類,前臺維護數據會發生什麼狀況呢?
根據圖2能夠得知,表中的碼(就是肯定惟一一行數據的一個或多個屬性(字段))是:商品ID+日期,根據這個碼,才能夠區分數據表中的每一條記錄
也就是說,這個碼是非空的!你如今新增一個分類,碼的信息都尚未,那就會直接致使插入異常,待改進!
三、修改記錄,如今「名稱1」的分類改變了,分類1要改爲分類2;
發現有多少條「名稱1」的記錄就得把對應的分類1改爲分類2,若是有上萬條記錄,估計鼠標都得換好幾個,待改進!
四、刪除記錄,如今商品「名稱1」下架了,得刪除與之相關的信息,發現連分類、銷售額等信息都被刪掉了,待改進!
問題這麼多,這徹底是胡亂設計致使的結果,怎麼辦才能避免這種結果呢,因而有了2NF
這句話有幾個名稱須要解析一下:
一、主屬性,能夠理解爲碼的子集;碼就是由一個或多個主屬性組成的;
二、非主屬性,那固然就是主屬性以外的全部字段咯。。
三、部分函數依賴,首先函數依賴能夠參考數學裏的方程式:y = f(x),即自變量x明確的狀況下,y是明確可知的。
那這裏說的部分函數依賴是什麼意思呢,根據圖2看下圖
圖3
參照上圖, y = f(x) 可理解爲:非主屬性 = f(碼),即碼肯定的狀況下,那些非主屬性確定能獲取到。
這個部分函數依賴,指的是部分非主屬性對碼的部分主屬性產生依賴,有哪些呢?
很明顯:右邊的非主屬性只對商品ID產生依賴,跟日期無關;
既然要求符合2NF,那就要消除這種部分依賴;那咱們就只能拆表了,以下:
圖4
數據表也改好了,咱們再看看會不會還有問題。如今各表的碼以下:
表1:碼(商品ID+日期),非主屬性「銷售額」已經徹底依賴於碼,不存在部分依賴了
表2:碼(商品ID),非主屬性也是徹底依賴於碼
一、查看表2,變成基礎數據了,每一個員工只有一條記錄;查看表1,發現名稱、分類等信息沒有了,冗餘少了不少,有改進!
二、新增記錄,仍是新增新分類,而表2的碼是「商品ID」,新增的分類顯然不關員工的「商品ID」啥事,仍是會插入異常,待改進!
三、修改記錄,仍是商品1改分類,由於拆表了,因此在表2把商品1對應的分類1改爲分類2就好了,只改了一行數據就搞定!有改進!
四、刪除記錄,刪除商品1相關信息,發現分類仍是被刪掉了,待改進!
看來拆表了仍是沒有徹底解決問題呀,爲何會這樣呢,非主屬性已經徹底依賴於碼了呀?因而3NF出場了
非主屬性:這個不用多說了,上面已經解析過。
傳遞函數依賴:這個能夠理解爲2個或多個函數依賴組成的,如:A=f(B) , B = f(C),則 A = T(C)
即由C可獲得B,由B可獲得A,那由C可獲得A,中間多了一層。
那圖4存在哪些傳遞依賴關係呢,以下:
在商品ID肯定的狀況下,可獲得分類ID,再由分類ID獲得分類名稱,這就是所謂的傳遞函數依賴
咱們再繼續拆表,以下:
圖5
好了,如今看看錶一、二、3;徹底都符合要求,便是原子性,又沒有部分函數依賴,也沒有傳遞函數依賴;
一、徹底沒有數據冗餘,數據很簡潔
二、新增記錄,新增分類,改動的只是分類基礎數據表,跟其餘表無關。有改進!
三、修改記錄,商品1改分類,只改動商品基礎數據表,跟其餘表無關。有改進!
四、刪除記錄,刪除商品1相關記錄, 刪除的也是商品基礎數據表,和銷售表與分類表無關。有改進!