我有一张包含单个帐户数百万笔交易的表格。每笔交易都包含:
moment
- 交易发生时的时间戳。sequence
- 一个数字,用于对完全相同的moment
发生的交易进行排序。description
,merchant
等 - 总体信息。amount
- 交易的货币价值,可能是正数或负数。balance
- 交易后的帐户余额(当前和之前所有amount
的总和)。这是由系统计算的。为了快速显示或更新所有交易的正确balance
,优化了哪些数据结构,假设用户可以插入,删除或修改旧amount
的旧交易?
我目前的选择是以B-tree订单 M 组织交易,然后在每个节点上存储amount
的总和。然后,如果更新了一些非常旧的事务,我只更新相应的节点总和及其所有父节点的根,这非常快。它还允许我通过单个读取根节点来显示总balance
。但是,为了显示未来记录的正确balance
值,我最终需要读取 M 节点,假设每个节点都在云存储上,这种节点很慢。
有更好的解决方案吗?
答案 0 :(得分:1)
可以进一步增强B树的解决方案。您可以在RAM中存储增量修改列表。此列表(也可能是二叉树)仅包含更新,并按时间戳排序。
例如,此列表在某些时候可能如下所示:
(t 1 ,+ 5),(t 10 , - 6),(t 15 ,+ 80)
这意味着当您需要显示具有时间戳的交易余额时
现在假设我们需要进行修改(t 2 , - 3)。我们
列表变为:
(t 1 ,+ 5),(t 2 ,+ 2),(t 10 , - 9),(t 15 ,+ 77)
最终,当delta列表变大时,您需要将其应用于B树。