在數據庫中儲存計算數據的壞習慣?
將計算的數據儲存在每一行中是不好的做法,還是在每次從數據庫讀取時在應用程序層計算更好。
儲存在數據庫中避免了多次計算的需要,但如果出現錯誤,則需要更新數據,而不僅僅是更改應用程序級別的計算。
我認為後者更好,但有一般的經驗法則嗎?
例如,我需要計算食物的每日總營養攝入量。所以各種各樣
portions
的energy
。foods
我可以portion
根據相應的能量計算能量並將每個能量food
儲存在表中,或者我可以每次都從對應的連接中計算。energy``portion``portions``food
您可以想像,如果您必須長時間計算年平均值、月平均值、日平均值等,它會變得非常笨重。
每次舊數據(比如一周或更長時間)根據觸發器或類似的東西更新時,使用物化視圖會重新計算怎麼樣?
如果電腦速度無限快,那麼,不,您永遠不會儲存可以從數據庫中的其他列計算的值。儲存計算值違反了數據庫規範化。
範例包括:
- 包含價格和數量欄位的發票行的擴展成本。
- 發票行的總成本。
在現實世界中,我們有時確實會選擇違反規範化。動機通常是出於性能原因。千萬不要在沒有太多考慮的情況下這樣做,並希望諮詢其他 DBA 或數據庫開發人員。並始終徹底記錄您的決定及其具體動機。
有一般的經驗法則嗎?
是:規範化,並測試/profile。
始終從標準化設計開始。載入假數據,測試性能。驗證任何發現的瓶頸確實是由於您的動態計算造成的。
這取決於。有些值最好立即計算,有些值最好推遲到請求。
一旦我不得不預先計算每兩個連續 GPS 點之間的距離,並增加與點數據一起儲存的里程表值。這些擴展計算使我能夠通過從最後一個里程表減去範圍內的第一個里程表值來獲得路線上任意兩個任意點之間的距離。按需計算距離花費了大量時間,這是不可接受的。但是這些數據並不重要,如果錯過了某個點,里程表/距離值仍然具有可接受的精度。
在我看來,如果您可以預先計算一些數據來加速一些頻繁和繁重的查詢 - 預先計算它們。如果您想在沒有實際必要的情況下提前預先計算 - 不要浪費 CPU 和 IO 資源。