Mysql數據庫設計之三範式和反範式

數據庫範式

    先說明範式中涉及兩個索引概念:主鍵和複合主鍵。

  • 主鍵: 創建表時可以不設置主鍵 , 但是沒有設置主鍵的表 ,底層會認爲所有的鍵都是主鍵 ,所以在創建時使用了所有的字段創建索引 , 在查詢時索引的存在幾乎沒有意義 。
  • 複合主鍵: 兩個或兩個以上的字段作爲評價一條數據記錄的唯一性標誌 。

 

第一範式:

  • 確保每一列的原子性(列不可再分):保證數據表中每個字段都是不可再分的最小數據單元,則滿足第一範式(一般關係型數據庫都遵循第一範式原則)。例如:address地區表,包含字段id,address

原則上,該表address字段還可以再繼續拆分成下表,

但是最終還是得根據用戶需求來設計,所以兩表都可以說是遵循第一範式原則。

 

第二範式:

  • 在第一範式的基礎上,確保表中的非主鍵的每列完全依賴於主鍵:是指每個表必須有且僅有一個數據元素爲主鍵(Primary key),其他數據元素與主關鍵字一一對應。換而言之,如果數據表中只有一個主鍵,則都符合第二範式原則。
貨物類型 貨物ID 貨物名稱
瓷碗 1 白色瓷碗
瓷碗 2 青花瓷碗
瓷碗 3 雕花瓷碗
三合板 1 普通三合板

在該表中的主鍵依然是(貨物類型、貨物ID),非主鍵字段“貨物名稱”,完全依賴於這兩個主鍵,那麼我們就可以說,該表是符合數據庫第二範式的。

 

第三範式:

  • 在第二範式的基礎上更進一步,目標是確保表中的列都和主鍵直接相關,而不是間接相關:一個數據表中不包含 其他數據表中的非主鍵字段

不符合第三範式例子:

學生表ID 學生 所在院系 院系地址
1 張三 計算機系 行政樓1號
2 李四 數學系 行政樓2號
3 王五 計算機系 行政樓1號

符合第三範式例子:

學生表ID 學生 院系ID
1 張三 1
2 李四 2
3 王五 1
院系表ID 所在院系 院系地址
1 計算機系 行政樓1樓
2 數學系 行政樓2樓

反範式:

  • 通過增加冗餘或重複的數據來提高數據庫的讀性能(以內存換時間)。例如,學生表中的“所在院系”字段,本來應該通過關聯院系表再進行查詢的,實際情況綜合考慮後,想節省關聯查詢的時間成本不惜付出數據冗餘的內存成本爲代價,使用了反範式原則。
學生表ID 學生 院系ID 所在院系
1 張三 1 計算機系
2 李四 2 數學系
3 王五 1 計算機系
院系表ID 所在院系 院系地址
1 計算機系 行政樓1樓
2 數學系 行政樓2樓

 

優點與缺點:

範式的優點:更新數據快,重複數據少,修改數據少,表很小可以在內存中執行,查詢時需要更少的distinct或group by
範式的缺點:查詢時需要更多的關聯,可能引起索引策略無效

反範式的優點:所有的數據可以在一張表上顯示,可以避免關聯,可以設計有效的索引
反範式的缺點:冗餘字段較多,刪除記錄會造成有用數據丟失
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章