用户的账户余额应该存储在数据库中还是动态计算?
为了得到准确的结果,动态计算似乎更合理,但当用户数量增多且数据库变得非常大时,这可能会成为问题。
交易
- Id (主键)
- AccountId(账户id)
- Type(类型)
- DateTime(时间)
- Amount(金额)
- 等等。。。
账户余额
- TransactionId(主键/外键)
- BalanceAmount(余额金额)
用户的账户余额应该存储在数据库中还是动态计算?
为了得到准确的结果,动态计算似乎更合理,但当用户数量增多且数据库变得非常大时,这可能会成为问题。
交易
账户余额
我认为这是一个好问题。每次计算显然很容易做到,但可能会导致很多不必要的计算,并产生性能损失。
但是,在其他表中存储当前余额可能会导致数据并发性方面的问题,其中用于构建聚合的数据与聚合本身的数据不同步。
也许一种折衷方法是在交易表上设置 SQL 触发器,以在用户插入或更新时更新聚合值。
当前余额已经可用!这是账户上最后一笔交易的余额:
select top 1 [Balance]
from dbo.Trans
where [AccountID] = @AccountID
order by [TranID] desc
每次交易都必须计算和存储余额,否则系统无法扩展... 此外,如果您不存储余额,就没有核对和平衡(如余额必须等于先前余额加上新的信用减去新的借记)
如果您的应用程序在需要余额时没有从数据库检索数据进行余额计算,我建议您应该计算余额或将其存储在数据库中。
如果您需要经常更新余额,并且它是基于多个表动态更改的,则应该使用表视图而不是触发器。