我正在努力设计一个有效的自动化任务来清理声誉积分表,类似于我想的 SO。
如果用户阅读文章、评论文章和/或分享文章,我会给我的成员一些声誉积分。例如,如果我的成员执行所有这三个操作,则该数据库表中将有三个单独的行。在显示成员积分时,我只是使用 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 个月的点合并到单独的月份中,它会非常有帮助。