1

让我举一个我的问题的例子。假设我有一个名为users的表和一个名为payment的表。为了计算用户的总余额,我会使用查询来获取某个日期之后的所有付款,然后将结果缓存一段时间。

但是,我想知道,由于这种性质,在 users 表中调用一个列,balance然后当缓存过期时,我使用不同的查询来收集付款,但从更短的时间和然后将此金额添加到balance列中的任何内容中?

4

2 回答 2

3

要计算用户的总余额,

您可以创建一个始终包含用户当前余额的附加表。如果为用户添加了新的付款,则该列也需要更新。进行交易,以便添加付款和更新总余额是一致的。

如果您需要更多差异化,您可以在用户关系旁边保留一个日期列,表示您需要能够进行计算的时间间隔。例如,能够返回过去查看的周数或月数。

如果您需要更大的灵活性,您可以在一段时间后将现有付款压缩为总价值,并将其存储到与用户相关并保留日期列的余额表中。

然后,您可以将它与尚未压缩/压缩的日期的“实时”付款表联合起来。然后使用聚合函数对总余额求和。如果您需要保留更详细的最新数据,这可能会为您提供两全其美的效果,您可以在一段时间后移出数据存储区,只保留统计值。

于 2013-01-03T19:27:01.740 回答
2

通常,使用这些“预先计算”的值,我发现最轻松的方法是在保存任何涉及数据的模型时存储/更新它们

简而言之,只要保存新的付款,就更新总余额。这样您就可以保证您的数据库和数据始终保持同步

预计算可以是 mysql 触发器,也可以是带有 Gearman 之类的后台任务


但是,正如您自己的问题所建议的那样,如果您想对余额进行某种增量汇总,我建议您按月或某个固定日期范围进行。如果您没有付款回溯或类似的情况,这将起作用,付款可能会出现在旧月份。

新的一个月开始,运行一个支付聚合器,bam,你现在只需要对月表求和。

这完全取决于您必须处理多少数据。但我再次强调,数据一致性比速度更有价值,你总是可以购买更多的服务器。

于 2013-01-03T19:26:50.283 回答