在用户表中使用额外的列存储用户信用很容易,例如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的总和。