我正在努力设计一个有效的自动化任务来清理声誉点表,类似于我想的那样。
如果用户阅读文章,评论文章和/或分享文章,我会给我的会员一些声望点。例如,如果我的成员执行了所有这三个,那么该DB表中将有三个单独的行。在显示成员点时,我只需使用SUM查询来计算该成员的所有点。
现在,有一百万名活跃会员,声誉很高,我的桌子上有很多行,并且会以某种方式清理它们。使用Cron作业,我想将每个成员(3个月以上)的所有信誉行合并为一行。例如:
user | repTask | repPoints | repDate
-----------+-------------------------------+--------------+-----------------------
10001 + Commented on article | 5 | 2012-11-12 08:40:32
10001 + Read an article | 2 | 2012-06-12 12:32:01
10001 + Shared an article | 10 | 2012-06-04 17:39:44
10001 + Read an article | 2 | 2012-05-19 01:04:11
会变成:
user | repTask | repPoints | repDate
-----------+-------------------------------+--------------+-----------------------
10001 + Commented on article | 5 | 2012-11-12 08:40:32
10001 + (merged points) | 14 | Now()
或(合并数月):
user | repTask | repPoints | repDate
-----------+-------------------------------+--------------+-----------------------
10001 + Commented on article | 5 | 2012-11-12 08:40:32
10001 + (Merged for 06/2012) | 12 | Now()
10001 + (Merged for 05/2012) | 2 | Now()
3个月之后的任何事情都被视为合法,之前的任何事情可能需要在作弊的情况下被撤销,因此为什么我说3个月。
首先,这是一个好主意吗?我试图避免,比如在3年时间里,有100万行的数百万行。如果合并点不是一个好主意,是否有更好的方法来存储输入的数据。我显然无法改变已输入的内容,但可以使其在未来更好。
如果这是个好主意,我很难想出一个有效的查询来修改数据。我不是在寻找确切的代码,但是如果有人可以帮助描述一个合适的查询,可以合并所有超过3个月的点,对于每个用户,或者将所有超过3个月的点合并到不同的月份,对于每个用户,它会非常有帮助的。