用户的帐户余额应该存储在数据库中还是动态计算?用户帐户余额应该存储在数据库中还是动态计算?
对于准确的结果计算它是动态的有意义的,但这可能是一个问题,当有许多用户和数据库增长非常大?
交易
- ID(PK)
- ACCOUNTID
- 类型
- 日期时间
- 金额
- etc..etc ...
AccountBalance
- TRANSACTIONID(PK/FK)
- BalanceAmount
用户的帐户余额应该存储在数据库中还是动态计算?用户帐户余额应该存储在数据库中还是动态计算?
对于准确的结果计算它是动态的有意义的,但这可能是一个问题,当有许多用户和数据库增长非常大?
交易
AccountBalance
为了保持准确的审计,您应记录每笔影响用户账户余额的交易。这意味着您可以动态计算余额,但出于性能方面的原因,我也会存储余额。为了确保平衡是正确的,我会每天都有一份工作从头开始重新计算余额。
你要问自己几个问题: 1)将拥有该如何计算? 2)谁将需要结果?
现在,如果计算的所有者是唯一需要它的人 - 或者需要它的人将从所有者那里得到它,那么就不需要存储计算。
但是,在实际运行很长时间的大多数应用程序中,计算结果可能最终会在其他地方需要。例如,像SQLReportingServices这样的报告应用程序将需要计算结果,因此如果计算的所有者是一个Web应用程序,那么就有问题。报告服务(仅与数据库交谈)将如何得到结果?
这种情况下的解决方案 - 存储计算或使数据库成为计算的所有者,并具有返回结果的sql函数。
就个人而言,我倾向于采用非纯粹的方法 - 我将计算结果存储在数据库中。空间便宜,读取时响应时间快于读取+函数调用。
我认为这是一个很好的问题。每次计算都很容易,但可能会导致大量不必要的计算,从而导致性能下降。
但是,将当前余额存储在某个其他表中可能会导致数据并发问题,其中构建聚合的数据被修改为与聚合不同步。
也许一个愉快的媒介是在事务表上有一个sql触发器,它更新该用户的插入或更新的聚合值。
当前余额已经可用! 它是在最后交易余额的帐户:
select top 1 [Balance]
from dbo.Trans
where [AccountID] = @AccountID
order by [TranID] desc
平衡已经进行计算和每一笔交易 否则系统将无法扩展的一部分存储... ,如果你还不存储余额,您有没有制衡机制(如资产负债必须等于前一资产负债再加上新的信贷少新借方)
已经有了;) – 001 2011-06-16 14:04:25
如果您的应用程序不是平衡计算从数据库中检索数据,而你所需要的巴拉nce,我会建议你应该计算余额或者存储在数据库中。
如果您需要经常更新余额并且基于多个表动态更改,那么您应该有表视图而不是触发器。
如何动态计算并将其存储在数据库中。这意味着用户可以随时检查他的平衡。 – 2011-06-14 10:00:56
记录更改并为实际数据保留一个“软”记录。软记录只是一个包含大部分余额数据的最新字段。更新单个交易中的所有字段,然后您就可以开始了。对于一个简单的游戏,我只需保留一个“金额”字段。 – CodingBarfield 2011-06-14 10:03:59