MySQL資料庫三大正規化和反正規化
阿新 • • 發佈:2018-12-06
第一正規化(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表的次數。