1. 程式人生 > 其它 >三、正規化與逆正規化

三、正規化與逆正規化

為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的正規化。

第一正規化1NF,原子性

第二正規化2NF,消除部分依賴

第三正規化3NF,消除傳遞依賴

1、正規化

(1)第一正規化:具有原子性,確保每列保持原子性。

第一正規化是最基本的正規化。如果資料庫表中的所有欄位值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。第一正規化的合理遵循需要根據系統的實際需求來定。比如某些資料庫系統中需要用到“地址”這個屬性本來直接將“地址”屬性設計成一個數據庫表的欄位就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行儲存,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了資料庫的第一正規化。
(2)第二正規化:主鍵列與非主鍵列遵循完全函式依賴關係,確保表中的每列都和主鍵相關。

第二正規化在第一正規化的基礎之上更進一層。第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。
(3)第三正規化:非主鍵列之間沒有傳遞函式依賴關係索引,確保每列都和主鍵列直接相關,而不是間接相關。

所謂傳遞函式依賴,指的是如果存在"A→B→C"的決定關係,則C傳遞函式依賴於A。因此,滿足第三正規化的資料庫表應該不存在如下依賴關係:

關鍵欄位→非關鍵欄位x→非關鍵欄位y

比如在設計一個訂單資料表的時候,可以將客戶編號作為一個外來鍵和訂單表建立相應的關係。而不可以在訂單表中新增關於客戶其它資訊(比如姓名、所屬公司等)的欄位。

先滿足第一正規化,再滿足第二正規化,才能滿足第三正規化。

2、逆正規化

逆正規化是指打破正規化,通過增加冗餘或重複的資料來提高資料庫的效能。

示例: 假如有一個商品表Goods:

欄位有Goods_id(商品表), goods_name(商品名稱), cat_id(所屬類別的id)。

還有一個分類表Category:

欄位有Cat_id(類別id), cat_name(類別名稱)。

現在要查詢類別id為3的商品的數量,例如分類列表查詢:

分類ID 分類名稱 商品數量