2012-02-13 24 views
2

例如,我有一個銀行用戶表(用戶標識,用戶名)和一張交易表(用戶標識,帳戶標識,金額)。
賬戶在不同的用戶中具有相同的屬性,但保存的金額不同(例如Alex - > Grocery,這是Alex特有的,但所有其他用戶也都有Grocery賬戶)。將某個值緩存在數據庫表中還是每次重新計算它會更好?

問題是,最好是創建一個單獨的帳戶表(帳戶ID,用戶ID,剩餘金額)或通過選擇具有所需用戶ID和帳戶ID的所有交易並僅將總和'數量'值?看起來第一種方法會更快,但更容易出錯和數據庫損壞 - 每次事務發生時我都需要更新帳戶。第二種方法似乎更清潔,但是會導致顯着的速度降低?

你會推薦什麼?

+0

優化是好的。過早優化(在遇到*需求*之前)可以在將來綁定您的手。 – MatBailie 2012-02-13 16:53:37

回答

3

好問題!

在我看來,你應該總是避免重複的數據,所以我會用「加法」每一次選擇去

「看來,第一種方法會更快,更容易出錯和數據庫損壞 - 我每次交易發生時都需要更新賬戶「

說了一切,你會遇到錯誤,你必須建立一個機制來保持數據是最新的。

不要忘記,第一種方法只會選擇更快。插入更新和刪除會比較慢,因爲您將不得不更新第二張表。

1

只有遇到嚴重的性能問題時,採用非規範化方法(第一種解決方案)纔有意義。由於您只是使用適當的索引進行簡單的SUM(或按組合並然後求和),因此您的規範化解決方案將運行得非常好,並且將更容易維護(如您所記下的)。

但是,根據您的查詢,使用非規範化解決方案可能有意義...例如,如果您的數據庫是隻讀的(您定期從其他數據源加載數據並且不進行插入/更新或者使它們真的很少),那麼你可以以最簡單的方式加載數據來進行查詢......在這種情況下,非規範化解決方案可能會更好。

2

這是Denormalization的示例。

一般來說,非規範化是不鼓勵的,但有一些例外情況 - 銀行賬戶餘額通常就是這樣一個例外。

因此,如果這是您的準確的情況,我會建議與單獨的帳戶表解決方案 - 但如果你有比銀行通常少的記錄,那麼我建議派生的方法,而不是。

2

在某種程度上,這取決於。

對於「小」數據量,性能可能會更好。 但隨着數據量的增長,必須彙總所有事務可能會變得更加昂貴,以至於您開始注意到性能問題。

另外要考慮的是數據訪問/使用模式。在一個準備就緒的系統中,「一次寫入,準備好很多」系統,然後SUM方法在每次讀取時都達到性能 - 在這種情況下,在寫入時執行性能命中可能是有意義的,以改善後續讀取性能。

如果你預計「大」的數據量,我肯定會去與額外的表來保持高水平的總數。您需要確保它在(事務)事務處理完成時更新,以便在(sql server)事務中使其成爲原子操作。

隨着數據量的減少,您可能會離開它......個人而言,我可能仍然沿着這條道路走下去,以簡化閱讀場景。

相關問題