sql - 存储玩家/用户排名的常见做法是什么?
问题描述
有很多应用程序,用户时不时地获得一些分数,并且有他的整体排名(将他的分数与其他用户进行比较)。
所以假设有一个表包含:
some_action_id, points_for_action
我想知道整个排名是否基于这个简单的表格运行并使用一些 groupbys 和 rank 函数显示?
这对我来说似乎最合理,但是如何存储“用户最高排名”?
解决方案
您可能有兴趣采用的一种方法实际上是维护两个与用户点相关的表。一个表会将每个事务存储在单独的记录中。至于你为什么需要这个,如果你曾经需要回顾用户的历史并查看发生了什么,事务表将是至关重要的。例如,考虑 Stack Overflow 站点,它既显示用户的总分,也提供查看完整历史记录的选项。
第二个表将只为每个用户维护一条记录。该记录将包含总计,例如总分。该表将通过来自第一个事务表的触发器进行更新。也就是说,只要有用户活动导致点数发生变化,触发器就会更新总计表。这种方法的优点是总数立即可用。另一方面,仅维护一个包含事务的表会导致获取聚合的潜在问题。在这种情况下,每次我们想要查看总数时,我们都必须进行代价高昂的数据库操作,而且随着用户数量的增加和给定用户在网站上的使用期限的增加,问题会变得更糟。
将所有这些放在一起,表定义可能看起来像这样:
table transactions: (user_id, some_action_id, points_for_action);
table totals: (user_id, points_total);
第一个表将通过触发器更新第二个表。
推荐阅读
- javascript - 在 React.js 中显示保存的文本 onclick
- tdd - 您在 TDD 中的提交顺序?
- php - Laravel - 如何在控制器中处理 API 响应?
- javascript - 如何在编辑 contenteditable div 时计算光标的 x、y 坐标?
- xmpp - 如何防止用户向群组发送消息,但继续接收来自该群组的消息(只读)?
- python - 无法使用 tf.control_dependencies() 创建控制依赖项
- python - Python 异常在 Glib/DBUS 循环中发生时不会传播/打印
- django - 如何定义 django 模板文件夹?
- python - 可以用 PyCharm Professional 代替 CLion - 主要用于 python
- android - MacBook Pro Mojave、Android Pie、Android 设备被 adb 识别但未被 Android Studio 识别