2011-06-14 33 views
9

用戶的帳戶餘額應該存儲在數據庫中還是動態計算?用戶帳戶餘額應該存儲在數據庫中還是動態計算?

對於準確的結果計算它是動態的有意義的,但這可能是一個問題,當有許多用戶和數據庫增長非常大?

交易

  • ID(PK)
  • ACCOUNTID
  • 類型
  • 日期時間
  • 金額
  • etc..etc ...

AccountBalance

  • TRANSACTIONID(PK/FK)
  • BalanceAmount
+1

如何動態計算並將其存儲在數據庫中。這意味着用戶可以隨時檢查他的平衡。 – 2011-06-14 10:00:56

+0

記錄更改併爲實際數據保留一個「軟」記錄。軟記錄只是一個包含大部分餘額數據的最新字段。更新單個交易中的所有字段,然後您就可以開始了。對於一個簡單的遊戲,我只需保留一個「金額」字段。 – CodingBarfield 2011-06-14 10:03:59

回答

7

爲了保持準確的審計,您應記錄每筆影響用戶賬戶餘額的交易。這意味着您可以動態計算餘額,但出於性能方面的原因,我也會存儲餘額。爲了確保平衡是正確的,我會每天都有一份工作從頭開始重新計算餘額。

1

你要問自己幾個問題: 1)將擁有該如何計算? 2)誰將需要結果?

現在,如果計算的所有者是唯一需要它的人 - 或者需要它的人將從所有者那裏得到它,那麼就不需要存儲計算。

但是,在實際運行很長時間的大多數應用程序中,計算結果可能最終會在其他地方需要。例如,像SQLReportingServices這樣的報告應用程序將需要計算結果,因此如果計算的所有者是一個Web應用程序,那麼就有問題。報告服務(僅與數據庫交談)將如何得到結果?

這種情況下的解決方案 - 存儲計算或使數據庫成爲計算的所有者,並具有返回結果的sql函數。

就個人而言,我傾向於採用非純粹的方法 - 我將計算結果存儲在數據庫中。空間便宜,讀取時響應時間快於讀取+函數調用。

2

我認爲這是一個很好的問題。每次計算都很容易,但可能會導致大量不必要的計算,從而導致性能下降。

但是,將當前餘額存儲在某個其他表中可能會導致數據併發問題,其中構建聚合的數據被修改爲與聚合不同步。

也許一個愉快的媒介是在事務表上有一個sql觸發器,它更新該用戶的插入或更新的聚合值。

1

當前餘額已經可用! 它是在最後交易餘額的帳戶:

select top 1 [Balance] 
from dbo.Trans 
where [AccountID] = @AccountID 
order by [TranID] desc 

平衡已經進行計算和每一筆交易 否則系統將無法擴展的一部分存儲... ,如果你還不存儲餘額,您有沒有制衡機制(如資產負債必須等於前一資產負債再加上新的信貸少新借方)

+0

已經有了;) – 001 2011-06-16 14:04:25

0
  1. 如果您的應用程序不是平衡計算從數據庫中檢索數據,而你所需要的巴拉nce,我會建議你應該計算餘額或者存儲在數據庫中。

  2. 如果您需要經常更新餘額並且基於多個表動態更改,那麼您應該有表視圖而不是觸發器。

相關問題