在用户表中使用额外的列存储用户信用很容易,例如user_credits,现在这是一个额外的要求
对于添加到user_credits列的每个信用,如果没有消费,它将在一年后自动过期。
当然,我需要一个额外的表来存储过期信息,例如。

[table credits_history]
user_id
credits
used
created_at

所以,在消费积分时,我需要
检查user_credits是否足以消耗
循环所有credits_history表以获取used = 0 AND now - created_at < 1yr的用户信用,并设置used to 1
更新user_credits
最后,我需要设置一个每日cron作业,通过查看user_credits
上述方法合理吗?或者有什么标准的方法来处理上述要求?

最佳答案

不要储存你能计算的东西,除非计算起来太贵。假设每个用户credits_history中的行数不太高,则可以通过以下方式构造查询,以检查可用信用的总和:

SELECT SUM(credits-consumed) -- see more about "consumed" below
FROM credits_history
WHERE user_id=?
  AND created_at >= DATE_SUB(NOW(),INTERVAL 1 YEAR)

这种方法的一个好处是不再需要cron作业来维护user_credits
消费信用卡变得有点棘手:您需要添加一个列,显示已使用的信用卡部分。这里有一个例子来说明这一点。假设一个用户在其历史记录中添加了这些信用:
created_on credits consumed
---------- ------- --------
05/06/2014   50        0
07/12/2014   70        0
12/01/2014   40        0

如果您运行上面的查询,您将得到160的总和。
现在他想用90个学分。您的代码应该查询所有符合条件的信用记录,从最旧到最新排序,并根据需要使用尽可能多的信用来支付所需的金额(即90)
created_on credits consumed
---------- ------- --------
05/06/2014   50       50
07/12/2014   70       40
12/01/2014   40        0

现在上面的查询将得到70的总和。

10-05 19:58