2016-04-08 36 views
1

我正在设计一个数据库,它将保存事务级别的数据。它的功能与银行账户相同 - 借记/贷记账户号码。交易汇总的最佳实践数据库设计是什么?

什么是获得这些交易的最佳/最有效的方式。

我在考虑使用汇总表,然后将这些汇总表添加到当前交易列表中,以便推导出每个帐户有多少(即有余额)。

我希望这是可扩展的(即10亿交易),所以不希望执行数据库命中主要事实表,因为它需要找到所有与期望的帐号关联的借/贷款扫描潜在的十亿行。

谢谢,任何帮助或资源将是真棒。

回答

3

(已在银行工作了近10年,以下是实际工作情况)。

TLDR:你的想法很好。

每隔一段时间您都会将余额存储在其他地方(“结转余额”)。例如。每个月左右(或者一定数量的交易)。要计算实际余额(或过去的任何余额),您必须累积所有相关的交易,直到您保留的最近余额(“结转余额”),当然您需要添加。

“当前”余额不保存在任何地方。如果你一直更新这个平衡,就一个人就可以解决锁定问题。 (在真实银行中,几乎每一笔交易都会触及一些银行的内部账户,有很多银行内部账户可以获得法律要求的数字,这些账户非常频繁地出现,因此当您出现锁定问题时每个交易都要更新它们,而每笔交易只是插入 - 即使结转余额只是插入)。

而且在现实的银行,你有许多用例,这使得这种方法更有利:

  • 由于能够在任何时间取回日余额 - 能根据不同日期的任何时间获得余额(例如价值日期与交易日期)。
  • 逆转/取消是它自己的乐趣。想象一下,在两周前扭转交易,仍然保持以上所有情况。

你看,这是一个很长的故事。但是,您的问题的答案是:是的,您无法累积越来越多的交易,您需要保留中间余额以限制必要时积累的数量。打到有限数量的行的主表,应该没有问题。

确保您的主要查询使用Index-Only Scan

+0

感谢您的回答。你的回答很有意义,我认为有一个类似的过程。在从“结转余额”表和最近交易清单中获得余额的方面,您只需使用工会将所有工资放在一起,而不是将汇总应用于合并集以获得个人余额。谢谢你的帮助 – Jimmyn

-3

做一个面向对象的设计,创建对象的例子帐户,交易等。这是一个很好的website供您参考。但网上讨论OODBMS的内容还有很多。我提供的参考资料仅仅是我开始做OODBMS时的基础。