資料庫反範式設計是一個老生常談的話題,最近兩年我用的也確實非常多,我個人覺得合理的反範式設計才是更合理的設計,嚴格的範式設計在某種程度上會加大開發的複雜度,並且帶來性能上的耗損 對於反範式的優劣勢,歡迎大家留言討論 一、關係資料庫三大範式回顧 第一範式:原子性,每一列都是不可分割的 第二範式:每個表 ...
資料庫反範式設計是一個老生常談的話題,最近兩年我用的也確實非常多,我個人覺得合理的反範式設計才是更合理的設計,嚴格的範式設計在某種程度上會加大開發的複雜度,並且帶來性能上的耗損
對於反範式的優劣勢,歡迎大家留言討論
一、關係資料庫三大範式回顧
第一範式:原子性,每一列都是不可分割的
第二範式:每個表必須有一個主鍵、唯一標識
第三範式:說的就是減少冗餘欄位、增加外鍵關係
二、什麼是反範式?
不完全滿足以上範式的設計過程就是反範式設計
三、常見的反範式設計 - 合理冗餘
(思考:冗餘會帶來哪些問題?)
冗餘可能是用的最多也是最能立竿見影的方式了,在資料庫範式規範中,提倡我們儘量減少冗餘,但實際工作下來,覺得合理的冗餘將極大的提升查詢性能,並給開發工作帶來了極大的便利
如上圖,是我常用的伎倆,在存儲操作人、省市區等信息的時候,我常常會將對應的名稱也存儲起來, 省去了多表聯查,提升了性能
數據冗餘規範:
1. 變更頻率小或者不變更的內容,如省市區、姓名、行業等;
2. 冗餘數據不能過大,如果表占用空間過大,反而降低查詢性能
(思考:還有哪些需要註意的點?)
四、常見的反範式設計 - 去除外鍵
在範式設計中,對於兩個表的關聯,要求我們需要建立外鍵關係,但實際工作中,我們在設計時常常去除了這一點,對於數據的完整性和一致性都是通過程式來處理
五、反範式設計的優勢
1. 減少多表聯查,提升查詢性能
2. 降低開發複雜度
六、反範式設計帶來的問題:
1. 數據一致性問題,對於冗餘數據一旦發生變更,維護起來將是一件麻煩的事情(目前還沒有遇到這類問題,偶爾出現姓名更改,但如果把姓名冗餘當做快照來看待也沒問題)
2. 增加磁碟空間占用,冗餘數據將會占用額外的磁碟空間 (也就是空間換時間的概念)
最後:
大家結合自身實際情況,切不可盲目參照,合理使用,對於反範式設計的想法,歡迎大家留言區討論
相關資源獲取或其他疑問可在公眾號CodeL留言。