首页 > 解决方案 > 存储玩家/用户排名的常见做法是什么?

问题描述

有很多应用程序,用户时不时地获得一些分数,并且有他的整体排名(将他的分数与其他用户进行比较)。

所以假设有一个表包含:

some_action_id, points_for_action

我想知道整个排名是否基于这个简单的表格运行并使用一些 groupbys 和 rank 函数显示?

这对我来说似乎最合理,但是如何存储“用户最高排名”

标签: sqldatabase

解决方案


您可能有兴趣采用的一种方法实际上是维护两个与用户点相关的表。一个表会将每个事务存储在单独的记录中。至于你为什么需要这个,如果你曾经需要回顾用户的历史并查看发生了什么,事务表将是至关重要的。例如,考虑 Stack Overflow 站点,它既显示用户的总分,也提供查看完整历史记录的选项。

第二表将只为每个用户维护一条记录。该记录将包含总计,例如总分。该表将通过来自第一个事务表的触发器进行更新。也就是说,只要有用户活动导致点数发生变化,触发器就会更新总计表。这种方法的优点是总数立即可用。另一方面,仅维护一个包含事务的表会导致获取聚合的潜在问题。在这种情况下,每次我们想要查看总数时,我们都必须进行代价高昂的数据库操作,而且随着用户数量的增加和给定用户在网站上的使用期限的增加,问题会变得更糟。

将所有这些放在一起,表定义可能看起来像这样:

table transactions: (user_id, some_action_id, points_for_action);
table totals:       (user_id, points_total);

第一个表将通过触发器更新第二个表。


推荐阅读