MySQL三正規化&逆正規化
阿新 • • 發佈:2018-12-10
一、三正規化
概念:為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則(注:在關係型資料庫中這種規則就稱為正規化) 1、確保每列/欄位保持原子性(1NF) 概念:指每個欄位不可以再拆分 案例:地區表
id(編號) address(地址) #可以拆分:省 市 區
1 北京北京朝陽區
2 上海上海浦東新區
3 江蘇泰州海陵區
2、有主鍵,非主鍵欄位依賴主鍵(2NF) 概念:指每個表有一個主鍵,一個表只描述一件事 案例:使用者表
id(編號) username(使用者名稱) password(密碼) address(收貨地址) #說明:應該新增收貨地址表
3、消除傳遞依賴,非主鍵欄位不能相互依賴(3NF) 概念:一個表不能包含其他表的非主鍵欄位(一個表只能包含其他包的主鍵欄位) 案例:
#文章表
文章編號 文章標題 文章內容 使用者ID #使用者姓名(不該有)
文章表主鍵 文章表 文章表 使用者表主鍵 #使用者表非主鍵
#使用者表
使用者ID 使用者姓名 使用者年齡 ...
二、逆正規化
概念:符合正規化設計是為了減少冗餘提高讀寫效率,但有時候我們需要反其道而為之,利用空間來換時間(資料冗餘策略),該設計被稱之為“逆正規化” 案例:
#文章表 編號 標題 內容 評論總數... #評論表 編號 所屬使用者 所屬文章 評論內容 ....
正常流: select count(*) from 評論表 where id=當前文章的編號
逆正規化: 給文章表加一個“評論總數字段”
後期評論時候給該欄位+1
設計表推薦如下欄位:編號、建立日期、更新日期、是否刪除