计算一个账户所有交易金额总和的有效方法

Posted

技术标签:

【中文标题】计算一个账户所有交易金额总和的有效方法【英文标题】:An effective way of calculating total sum of all transaction amounts for an account 【发布时间】:2011-11-23 16:51:14 【问题描述】:

我有一个系统可以让用户输入包括美元金额在内的金融交易。一旦从系统中添加\更新或删除交易,必须重新计算账户总额并立即显示给用户。用户可以访问系统中的某些帐户,但不是全部。

以下是包含帐户和交易数据的表格的屏幕截图链接。

http://i.imgur.com/EqV7w.png

目前为了获得帐户总数,我使用以下查询:

select sum(t.Amount) 
from [Transaction] t
join [Account] a on a.AccountId=t.AccountId
where a.AccountId=@AccountId

我在 AccountId 和 Amount 列的 Transaction 表上有非唯一的非聚集索引,这允许查询快速查找 AccountId 的交易。

它可以满足我的需求,但我担心的是 Transaction 表的增长速度非常快,目前我在那里有大约 100 万条记录,随着时间的推移,我预计它会达到数千万。此外,可以主动编辑交易的用户数量也在增长,我在系统中有大约 5500 个。

我正在寻找一种解决方案,以在获取帐户的总美元时限制 Transaction 表的使用,以便系统可以横向扩展。我有两个解决方案:

    要求用户在需要该信息时单击某个按钮,从而按需计算帐户总数。我可能会走那条路,但我仍想通过实时更新帐户总额来探索我的选择。 在其他地方存储一个运行总计,并使用它来计算帐户总计。有一个与之相关的限制,因为所有事情都必须通过一个了解所有这些细微差别的单一界面来完成。编辑数据库中的交易会很棘手,因为您必须确保运行总计也得到更新。

我正在寻找其他替代方法来实时计算帐户总数,而不用担心数据库性能。

【问题讨论】:

文字墙!!!!请格式化一些!数据库模式也很好,你尝试了一些 SQL! 抱歉,这是我的第一篇文章。我已经对其进行了更新,通过一些视觉效果使其更加干净。 【参考方案1】:

我的建议是仅在遇到性能问题时使用最后一种解决方案。 处理大量数据是数据库的工作,因此,如果您的数据结构正确,即使有数千行,SQL 查询也能很好地执行。 所以,首先尝试继续这样。如果遇到性能问题,请尝试寻找解决方案。

如果您决定使用保留计算的 Total 字段的解决方案,以规避更新数据而不更新 Total 字段的风险,您应该使用触发器:每次添加、删除或更新一行时,您应该添加或减去 Total 值。

Here's some help on how to create triggers.

【讨论】:

【参考方案2】:

即使表很大,accountId 上的索引也会以有效的方式将查询中涉及的行数减少到相对较少的行数。

如果您有很多此类查询,并且可以忍受摘要不如实际事务的新鲜,您可以考虑设置一个单独的数据库用于报告,您可以在其中进行非规范化、构建摘要等。然后您可以创建作业定期更新这些表(这是"data warehouse" 背后的基本理念——您可能不需要完整版本,但同样的理念也适用)。

【讨论】:

以上是关于计算一个账户所有交易金额总和的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何特定的 RAILS 宝石/库可以帮助执行交易,例如银行账户的贷记和借记金额?

试图找到交易金额<= $ 10的至少1项交易

以太坊系节点交易金额有效性判断

找到两个日期之间的金额总和

核心数据实体中所有对象的属性总和

如何计算储蓄账户达到一定金额所需的每月供款?