1

我正在努力设计一个有效的自动化任务来清理声誉积分表,类似于我想的 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 个月的点合并到单独的月份中,它会非常有帮助。

4

1 回答 1

2

可以使用 cron 作业这样做,但是如何:创建一个触发器过程,以便无论何时添加一个点,它都会更新total用户表中的一列,并且无论何时撤销一个点,都会total从中减去该列?

这样,无论积分表中有多少百万或数十亿行,您都不必查询那些以获得总积分结果。您甚至可以有几个月或几年的单独列。此外,由于您没有删除任何行,因此如果需要,您可以返回并追溯撤销一年前的某个点。

于 2012-11-12T09:07:46.707 回答