數據庫範式

爲了創建冗餘較小、結構合理的數據庫,設計數據庫時必須遵循必定的規則。在關係型數據庫中這種規則就稱爲範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型數據庫,必須知足必定的範式。數據庫

 

在實際開發中最爲常見的設計範式有三個:數據庫設計

1.第一範式(確保每列保持原子性)性能

第一範式是最基本的範式。若是數據庫表中的全部字段值都是不可分解的原子值,就說明該數據庫表知足了第一範式。設計

第一範式的合理遵循須要根據系統的實際需求來定。好比某些數據庫系統中須要用到「地址」這個屬性,原本直接將「地址」屬性設計成一個數據庫表的字段就行。可是若是系統常常會訪問「地址」屬性中的「城市」部分,那麼就非要將「地址」這個屬性從新拆分爲省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操做的時候將很是方便。這樣設計纔算知足了數據庫的第一範式,以下表所示。3d

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就很是方便,也提升了數據庫的性能。orm

 

2.第二範式(確保表中的每列都和主鍵相關)blog

第二範式在第一範式的基礎之上更進一層。第二範式須要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不能夠把多種數據保存在同一張數據庫表中。開發

好比要設計一個訂單信息表,由於訂單中可能會有多種商品,因此要將訂單編號和商品編號做爲數據庫表的聯合主鍵,以下表所示。it

 訂單信息表class

這樣就產生一個問題:這個表中是以訂單編號和商品編號做爲聯合主鍵。這樣在該表中商品名稱、單位、商品價格等信息不與該表的主鍵相關,而僅僅是與商品編號相關。因此在這裏違反了第二範式的設計原則。

而若是把這個訂單信息表進行拆分,把商品信息分離到另外一個表中,把訂單項目表也分離到另外一個表中,就很是完美了。以下所示。

這樣設計,在很大程度上減少了數據庫的冗餘。若是要獲取訂單的商品信息,使用商品編號到商品信息表中查詢便可。

                 

3.第三範式(確保每列都和主鍵列直接相關,而不是間接相關)

第三範式須要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

好比在設計一個訂單數據表的時候,能夠將客戶編號做爲一個外鍵和訂單表創建相應的關係。而不能夠在訂單表中添加關於客戶其它信息(好比姓名、所屬公司等)的字段。以下面這兩個表所示的設計就是一個知足第三範式的數據庫表。

這樣在查詢訂單信息的時候,就可使用客戶編號來引用客戶信息表中的記錄,也沒必要在訂單信息表中屢次輸入客戶信息的內容,減少了數據冗餘。

 

巴斯-科德範式(BCNF)

Boyce-Codd Normal Form(巴斯-科德範式)
在1NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴)
巴斯-科德範式(BCNF)是第三範式(3NF)的一個子集,即知足巴斯-科德範式(BCNF)必須知足第三範式(3NF)。一般狀況下,巴斯-科德範式被認爲沒有新的設計規範加入,只是對第二範式與第三範式中設計規範要求更強,於是被認爲是修正第三範式,也就是說,它事實上是對第三範式的修正,使數據庫冗餘度更小。這也是BCNF不被稱爲第四範式的緣由。某些書上,根據範式要求的遞增性將其稱之爲第四範式是不規範,也是更讓人不容易理解的地方。而真正的第四範式,則是在設計規範中添加了對多值及依賴的要求。
對於BCNF,在主碼的任何一個真子集都不能決定於主屬性。關係中U主碼,若U中的任何一個真子集X都不能決定於主屬性Y,則該設計規範屬性BCNF。例如:在關係R中,U爲主碼,A屬性是主碼中的一個屬性,若存在A->Y,Y爲主屬性,則該關係不屬於BCNF。
通常關係型數據庫設計中,達到BCNF就能夠了!
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息