让我举一个我的问题的例子。假设我有一个名为users的表和一个名为payment的表。为了计算用户的总余额,我会使用查询来获取某个日期之后的所有付款,然后将结果缓存一段时间。
但是,我想知道,由于这种性质,在 users 表中调用一个列,balance
然后当缓存过期时,我使用不同的查询来收集付款,但从更短的时间和然后将此金额添加到balance
列中的任何内容中?
让我举一个我的问题的例子。假设我有一个名为users的表和一个名为payment的表。为了计算用户的总余额,我会使用查询来获取某个日期之后的所有付款,然后将结果缓存一段时间。
但是,我想知道,由于这种性质,在 users 表中调用一个列,balance
然后当缓存过期时,我使用不同的查询来收集付款,但从更短的时间和然后将此金额添加到balance
列中的任何内容中?
要计算用户的总余额,
您可以创建一个始终包含用户当前余额的附加表。如果为用户添加了新的付款,则该列也需要更新。进行交易,以便添加付款和更新总余额是一致的。
如果您需要更多差异化,您可以在用户关系旁边保留一个日期列,表示您需要能够进行计算的时间间隔。例如,能够返回过去查看的周数或月数。
如果您需要更大的灵活性,您可以在一段时间后将现有付款压缩为总价值,并将其存储到与用户相关并保留日期列的余额表中。
然后,您可以将它与尚未压缩/压缩的日期的“实时”付款表联合起来。然后使用聚合函数对总余额求和。如果您需要保留更详细的最新数据,这可能会为您提供两全其美的效果,您可以在一段时间后移出数据存储区,只保留统计值。
通常,使用这些“预先计算”的值,我发现最轻松的方法是在保存任何涉及数据的模型时存储/更新它们
简而言之,只要保存新的付款,就更新总余额。这样您就可以保证您的数据库和数据始终保持同步
预计算可以是 mysql 触发器,也可以是带有 Gearman 之类的后台任务
但是,正如您自己的问题所建议的那样,如果您想对余额进行某种增量汇总,我建议您按月或某个固定日期范围进行。如果您没有付款回溯或类似的情况,这将起作用,付款可能会出现在旧月份。
新的一个月开始,运行一个支付聚合器,bam,你现在只需要对月表求和。
这完全取决于您必须处理多少数据。但我再次强调,数据一致性比速度更有价值,你总是可以购买更多的服务器。