维护点表以减少行数

时间:2012-11-12 09:03:18

标签: mysql sql

我正在努力设计一个有效的自动化任务来清理声誉点表,类似于我想的那样。

如果用户阅读文章,评论文章和/或分享文章,我会给我的会员一些声望点。例如,如果我的成员执行了所有这三个,那么该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个月的点合并到不同的月份,对于每个用户,它会非常有帮助的。

1 个答案:

答案 0 :(得分:2)

可以这样做,使用cron作业,但是这个怎么样: 创建triggerprocedure,以便在添加点时,它会更新users表中的total列,并且只要撤消某个点,就会减去total列从?

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