我正在开发一个应用程序,我将不得不存储一些银行帐户信息,包括每日帐户余额。
例如:
17/10/2014 - (+) - Starting/Initial balance - 5,000.00
17/10/2014 - (=) - Balance - 5,000.00
-
18/10/2014 - (-) - Payment - (1,000.00)
18/10/2014 - (=) - Balance - 4,000.00
-
19/10/2014 - (=) - Balance - 4,000.00
-
20/10/2014 - (-) - Payment - (1,000.00)
20/10/2014 - (=) - Balance - 3,000.00
我想我可以创建一个特定的"account_balance"表,在该表中可以存储每天的每个帐户余额。
如果我错了,您能帮我找到最佳方法吗?但是,如果我对了,我如何使数据库计算每日余额,特别是当用户开始编辑较旧的值时,我如何使数据库更新余额?
而我所说的"旧价值观",是指:
1-"帐户A"报表如下所示:
18/10/2014 - (+) - Starting/Initial balance - 5,000.00
18/10/2014 - (=) - Balance - 5,000.00
-
19/10/2014 - (=) - Balance - 5,000.00
-
20/10/2014 - (=) - Balance - 5,000.00
2-但是用户忘记登记收入,所以他通过添加新收入来完成(所以现在必须更新余额):
18/10/2014 - (+) - Starting/Initial balance - 5,000.00
18/10/2014 - (+) - Sales commission - 2,500.00 <- USER ADDED THIS.
18/10/2014 - (=) - Balance - 7,500.00 <- THIS BALANCE HAS BEEN UPDATED.
-
19/10/2014 - (=) - Balance - 7,500.00 <- THIS BALANCE HAS BEEN UPDATED.
-
20/10/2014 - (=) - Balance - 7,500.00 <- THIS BALANCE HAS BEEN UPDATED.
3条答案
按热度按时间pw136qt21#
不要存储余额,而是使用一个表来存储每个用户的交易。
例如:
然后,您可以创建余额视图(类似于):
如果您希望更精确,并包括开始和停止日期(即:能够在任何时间点获得平衡),您可以创建一个parametrized view(还没有尝试使用日期,但我认为它也会工作)。
zysjyyx42#
这个答案是针对PostgreSQL的,OP在对原始问题的评论中提出了这个问题。
数据完整性对我来说是最重要的,所以我不愿意存储聚合值,除非a)性能很差,b)dbms可以保证聚合值是正确的。
我从这张table开始。
我选择了timestamp而不是date,因为像这样的应用程序通常需要支持timestamp,而且在一般情况下,它的性能比date差。如果我们使用timestamp获得了良好的性能,那么使用date也应该能够获得良好的性能。我没有假设单个客户的timestamp是唯一的。
我在这个表中加载了2000万行随机数据,然后更新了统计数据,数据包括正负金额,金额甚至以数百美元为单位,以便更容易地进行目测。
这种应用程序中比较常见的查询之一涉及返回单个客户的寄存器--所有交易都有一个运行余额。
下面是客户128前三天的原始数据。
头三天我们应该会收到这些钱。
前三天的余额应该是这样的。
执行计划显示上面的查询运行时间为12毫秒。我认为这对于此类应用程序是合理的,但是我可能能够通过索引表达式(
trans_time::date
)或复合索引将运行时间减少到12毫秒以下。rbpvctlc3#
在我的案例中,下面是表模式
为此,我提供以下解决方案
这是结果,希望对你有帮助。