【发布时间】:2017-01-11 04:52:03
【问题描述】:
假设我有三张桌子
交易
- 金额
- 日期
记录
- 金额
- 日期
CUSTOM_RECORDS
- 金额
- 日期
(假设还有许多其他字段可以证明拆分这些表是合理的)
要计算运行余额,我有两种方法
-------------方法1 -------------
重读,轻写
每当我们阅读时,只需加入表格,按日期排序并计算运行余额。
专业版
- 写起来很简单,写到每个表里就行了
骗局
- 读取非常繁重,每次读取都需要进行计算。 查询(假设是 1 周的跨度)并对所有记录进行计算是非常奇怪的。如果我查询 10 条记录,则需要对 100 万条记录进行计算才能知道 10 条记录的余额。
-------------方法2 -------------
写重,读轻
我还有一张桌子
FINAL_TABLE
- 日期
- 金额
- 流动余额
每当我写的时候,我都会刷新这个表并重新计算所有的流动余额。
专业版
- 读取很容易,已经计算了运行余额。
- 时间段之间的查询就像从 FINAL_TABLE 中提取时间跨度之间的日期一样简单
骗局
- 写入真的很慢,对三个表中的任何一个的每次写入都意味着刷新整个 FINAL_TABLE 表!
我为什么不直接重复使用最新的运行余额?如果条目保证在现实生活中按时间顺序排列,则可能会发生这种情况。但是,有时可能会延迟添加条目。
目前,我正在使用方法 2,每次客户端将一行保存/更新到三个表中的任何一个时,服务器都会在尝试刷新和计算 FINAL_TABLE 时冻结。显然,这不是非常可扩展的。
方法 1 在查询方面也不是很可扩展。我必须从一开始就计算运行余额才能知道上周的运行余额。
这两种方法的可扩展性都不是很好。什么是确保可扩展性和相对快速的读写性能的良好设计?银行使用什么方法来跟踪流动余额?
【问题讨论】:
标签: sql database postgresql database-design