淺談資料庫設計之三大正規化
阿新 • • 發佈:2022-04-20
正規化?
即規範!
*正規化是“符合某一種級別的關係模式的集合,表示一個關係內部各屬性之間的聯絡的合理化程度”。 *很晦澀吧?實際上你可以把它粗略地理解為一張資料表的表結構所符合的某種設計標準的級別。
資料庫正規化也分為1NF,2NF,3NF,BCNF,4NF,5N
一般在我們設計關係型資料庫的時候,最多考慮到BCNF
就夠。
符合高一級正規化的設計,必定符合低一級正規化,例如符合
2NF
的關係模式,必定符合1NF
。
1NF
-第一正規化
資料表的每一列都要保持它的原子特性,也就是列不能再被分割。
比如這樣:
進貨它還可以被分出進貨的數量,進貨的單價等等屬性。所以這樣是不符合第一正規化的。
2NF
-第二正規化
第二正規化(
2NF
)是在第一正規化(1NF
)的基礎上建立起來的,即滿足第二正規化(2NF
)必須先滿足第一正規化(1NF
)。
- 即滿足第一正規化前提,當存在多個主鍵的時候,才會發生不符合第二正規化的情況!!!。
- 比如有兩個主鍵,不能存在這樣的屬性,它只依賴於其中一個主鍵,這就是不符合第二正規化。
- 通俗理解是任意一個欄位都只依賴表中的同一個欄位。
依賴
在資料表中,屬性(屬性組)X確定的情況下,能完全退出來屬性Y完全依賴於X。
完全依賴
完全依賴是針對於屬性組來說,當一組屬性X能推出來Y的時候就說Y完全依賴於X。
部分依賴
一組屬性X中的其中一個或幾個屬效能推出Y就說Y部分依賴於X。
3NF
-第三正規化
首先,要滿足第三正規化(3NF
)必須先滿足第二正規化(2NF
)。
也就是說,要求一個數據庫表中不包含已在其它表中已包含的非主鍵欄位。
三正規化一定需要?
我們的三正規化是一般規範。就是說,只是一般都會遵守這個規範。
但是!!!不是一定需要遵守,比如有時候,資料不冗餘也不是好事。所以,我們要根據需要來定義,建立在需求之上。
沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,提高讀效能,就必須降低正規化標準,適當保留冗餘資料。
其他正規化
BCNF
-BC正規化
關係模式R<U,F>中,若每一個決定因素都包含碼,則R<U,F>屬於BCFN
。
即:
- 所有非主屬性對每一個碼都是完全函式依賴;
- 所有主屬性對每一個不包含它的碼也是完全函式依賴;
- 沒有任何屬性完全函式依賴於非碼的任何一組屬性。
4NF
-第四正規化
限制關係模式的屬性之間不允許有非平凡且非函式依賴的多值依賴。
5NF
-第五正規化
- 必須滿足第四正規化。
- 表必須可以分解為較小的表,除非那些表在邏輯上擁有與原始表相同的主鍵。
一般在我們設計關係型資料庫的時候,最多考慮到
BCNF
就夠。!!!