保持余额更新的数字总和的数据结构

时间:2016-05-03 07:24:22

标签: database data-structures sum aggregate b-tree

我有一张包含单个帐户数百万笔交易的表格。每笔交易都包含:

  • moment - 交易发生时的时间戳。
  • sequence - 一个数字,用于对完全相同的moment发生的交易进行排序。
  • descriptionmerchant等 - 总体信息。
  • amount - 交易的货币价值,可能是正数或负数。
  • balance - 交易后的帐户余额(当前和之前所有amount的总和)。这是由系统计算的。

为了快速显示或更新所有交易的正确balance,优化了哪些数据结构,假设用户可以插入,删除或修改旧amount的旧交易?

我目前的选择是以B-tree订单 M 组织交易,然后在每个节点上存储amount的总和。然后,如果更新了一些非常旧的事务,我只更新相应的节点总和及其所有父节点的根,这非常快。它还允许我通过单个读取根节点来显示总balance。但是,为了显示未来记录的正确balance值,我最终需要读取 M 节点,假设每个节点都在云存储上,这种节点很慢。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

可以进一步增强B树的解决方案。您可以在RAM中存储增量修改列表。此列表(也可能是二叉树)仅包含更新,并按时间戳排序。

例如,此列表在某些时候可能如下所示:

(t 1 ,+ 5),(t 10 , - 6),(t 15 ,+ 80)

这意味着当您需要显示具有时间戳的交易余额时

  • 小于t 1 - 什么都不做
  • 之间[t 1 ,t 10 ) - 你加5
  • 之间[t 10 ,t 15 ) - 递减6
  • [t 15 ,inf) - 加80

现在假设我们需要进行修改(t 2 , - 3)。我们

  1. 将此节点插入正确位置的列表
  2. 使用delta(-3)
  3. 更新右侧的所有节点
  4. 使用其左邻居(+5 -3 = +2)
  5. 的值更新此节点的值

    列表变为:

    (t 1 ,+ 5),(t 2 ,+ 2),(t 10 , - 9),(t 15 ,+ 77)

    最终,当delta列表变大时,您需要将其应用于B树。