点系统的高效数据库模型?

时间:2013-02-25 23:40:04

标签: sql optimization

我正在尝试为网站添加一个非常简单的积分系统。在我的SQL数据库中,有一个用于授予积分的表,因为管理员可以按任意数量增加用户的积分,以及积分增加的基本原理。因此,简化一点,此表包含每次管理员奖励积分时获得的分数,理由和用户ID。到目前为止一切都很好。

但是,网站上有10个用户组竞争最高总积分。单个用户组的点数总共可以轻松达到15 000个,因为该站点的成员已经超过10 000个(诚然,大多数都处于非活动状态)。我希望有一个排行榜来显示竞争用户组及其总分,但我担心在实施系统时,每次总结这些分数所需的时间太长。这是一个问题:在什么级别(如果有的话)我应该在数据库中保存点聚合?我是否应该在用户表中为每个用户的总分数设置一个字段,并为用户组排行榜实时汇总这些字段?或者,我是否应该为每个用户组设置一个聚合字段,每次更新点数都会添加到单个用户?在实际实现系统之前,我想知道需要多长时间来实现这些功能的总结,因为糟糕的实现会影响成千上万的用户,而且我没有太多实际操作经验。数据库。

2 个答案:

答案 0 :(得分:1)

这取决于你的硬件,但总计数千行应该没问题。但一般情况下,除非绝对需要,否则应避免对所有用户分数求和。我建议添加一个rolup表来存储每个组的总分,然后每晚运行一个cron来验证总分(基本上是总和,然后存储绝对正确的值)。

我建议在您的表格中添加记录获奖点数和奖励原因。此外,分别存储每个用户的总计分数,并在插入日志记录表的同时更新它,并将另一个表更新为每组总分。这应该适合您的活动水平。如果它太有争议,你也可以对总分组进行异步更新,但它应该没问题。

答案 1 :(得分:-2)

老实说,您的聚合仍然可能在不到一秒的时间内计算,行数少于1万 - 您应该将操作数据库保持原子状态,只需存储每个点事务并在查询时计算聚合。如果你真的想要,你可以预先计算你的聚合到物化视图,但我真的认为你不需要。

您可以使用

子句创建物化视图
   refresh fast start with sydate
     next sysdate + 1/24

- 让它每小时刷新一次。

您不会拥有实时聚合数据(可能会被一小时关闭),但如果数据变得庞大,它可能会使聚合查询的性能提高很多。正如您现在的数据一样,我甚至不打扰它 - 您的性能应该没问题。

编辑:不确定我为什么被投票。我认为这比将聚合存储在表中更好。