【问题标题】:Data structure for a sum of numbers that keeps the balance updated保持余额更新的数字总和的数据结构
【发布时间】:2016-05-03 07:24:21
【问题描述】:

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

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

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

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

有没有更好的解决方案?

【问题讨论】:

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


    【解决方案1】:

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

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

    (t1, +5), (t10, -6), (t15, +80)

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

    • 小于 t1 - 什么也不做
    • 在 [t1, t10) 之间 - 你加 5
    • 在 [t10, t15) 之间 - 递减 6
    • [t15, inf) - 加 80

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

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

    列表变成:

    (t1, +5), (t2, +2), (t10, -9), (t 15, +77)

    最终,当增量列表变大时,您需要将其应用到您的 B-tree。

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 2016-06-09
      • 2021-06-14
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 2015-06-24
      • 2020-08-15
      • 2021-08-20
      相关资源
      最近更新 更多