我们正在构建一个SaaS产品,用户可以从各种类型的交易中产生成本,例如:
发送短消息messages
我们已经构建了存储每个服务的成本的系统,例如,call_audit
表如下所示:
Date Call ID Our Cost User Cost Currency Duration User ID
---------- -------- --------- --------- -------- -------- -------
2018-01-02 sm_123 0.01 0.02 USD 72 us_1
sms_audit
表如下所示:
Date SMS ID Our Cost User Cost Currency User ID
---------- -------- --------- --------- -------- -------
2018-01-02 sm_123 0.01 0.02 USD us_1
然后是一个包含用户付款和退款的payment_audit
表:
Date User ID Amount Currency Type
---------- -------- ------ -------- ----
2018-01-02 us_1 12 USD CHARGE
2018-01-02 us_1 -2 USD REFUND
我们也有一个带有balance
列的user
表,当用户遇到电话、短信费用或退款时,我们会递减该列。当用户向他们的账户(如上的CHARGE
)付款时,我们会递增它。
但展望未来,我认为我们需要更具弹性的东西,而不是在代码中更新的单个余额数字。
一个改进是使用触发器而不是代码来更新余额数字。
另一种方法是跨多个表计算用户的总成本和付款,并对批量进行求和。随着表增加到数千个事务,我可以想象这将成为一个缓慢的计算。
我们想到的另一种方法是创建一个包含debit
、credit
和running balance
列的balance_transactions
表。当然,这会导致行之间的传递依赖,如果寻求良好规范化的DB,这并不是很好。这也意味着我们在复制数据,但在现实世界中,这是一种可以接受的权衡吗?
发布于 2018-06-10 04:06:01
您可以使用实体化视图来避免复制数据。请注意,更新余额(以任何方式-通过应用程序、触发器、部分运行余额)已经复制了数据。因此,您应该运行一些验证过程,以便在出现差异时发出警报。这样的验证过程应该完成所有的计算,所以它们也可以填充物化视图。
然而,实际的解决方案取决于您需要这些数据的频率。例如,如果您为了开票目的而每月获取所有客户余额,请不要重复它们。但是,如果您在每次客户操作后打印余额,例如,在某种交易确认(如PDF生成并通过电子邮件发送给客户)中,您可能希望以显示给客户的形式保存运行余额,因为他拥有余额证据。
https://stackoverflow.com/questions/50777896
复制相似问题