1. 程式人生 > >MySQL資料庫三大正規化和反正規化

MySQL資料庫三大正規化和反正規化

第一正規化(1NF):

資料表中的每一列(欄位),必須是不可拆分的最小單元,也就是確保每一列的原子性。

Table: t_user_info

id info(address + mobile)
主鍵 四川省成都市高新南區天府大道北段1700號(13312341234)
id address mobile
主鍵 四川省成都市高新南區天府大道北段1700號 13312341234
id province city district address mobile
主鍵 四川省 成都市 高新南區 天府大道北段1700號 13312341234

第二正規化(2NF):

滿足1NF後要求表中的所有列,都必需依賴於主鍵,而不能有 任何一列與主鍵沒有關係(一個表只描述一件事情)。

例如:訂單表只能描述訂單相關的資訊,所以所有的欄位都必須與訂單ID相關。
產品表只能描述產品相關的資訊,所以所有的欄位都必須與產品ID相關。
因此在同一張表中不能同時出現訂單資訊與產品資訊。

Table:t_order (old)

oid order_sn goods_name goods_price
主鍵 cd201801010001 書籍 100

Table:t_order (new)

oid order_sn goods_id goods_num
主鍵 cd201801010001 書籍 1

Table:t_goods

goods_id goods_name goods_price
主鍵 書籍 100

第三正規化(3NF)

滿足2NF後,要求:表中的每一列都要與主鍵直接相關,而不是間接相關(表中的每一列只能依賴於主鍵)

例如:一個使用者可以對應多個角色,一個角色也可以對應多個使用者。則可以按如下方式建立資料表關係,使其滿足第三正規化。

Table:t_user 使用者表

uid username password
主鍵 name pass

Table: t_role 角色表

role_id name
主鍵 name

Table: t_user_role使用者-角色中間表

id user_id role_id
主鍵 1 1

像這樣,通過第三張表(中間表)來建立使用者表和角色表之間的關係,同時又符合正規化化的原則,就可以稱為第三正規化。

4. 反正規化化

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

Table: t_user_role使用者-角色中間表,id,user_id,role_id,role_name

id user_id role_id role_name
主鍵 1 1 超級管理員

例如:在上例中的user_role使用者-角色中間表增加欄位role_name。
反正規化化可以減少關聯查詢時,join表的次數。