我正在开发一个服务器应用程序,它有多个游戏并且应该能够处理数百万玩家。每个游戏都需要一个排行榜,必须能够显示玩家的当前位置和前 10 名玩家,以及玩家好友的位置。
目前我正在使用两个表。
用户评分
- 编号
- 用户编号
- 游戏编号
- 得分
- 创建于
user_max_score
- 编号
- 用户编号
- 游戏编号
- 最高分
- 创建于
- 更新时间
每当用户第一次玩任何游戏时,数据都会插入到第一个和第二个表中。如果用户第二次玩并且得分高于他们之前的得分,我们将数据插入 user_score 表并使用新的 max_score 更新 user_max_score 表。
为了获得用户的排名,我像这样触发查询。
SET @i=0;
SELECT id, user_id, max_score, @i:=@i+1 AS rank
FROM user_max_score WHERE game_id = $gameId
ORDER BY max_score DESC, updated_at ASC;
还有比这更好的方法吗?
最佳答案
我使用的一种方法是单表概念。发布所有分数,然后您可以将后台的分数合并到汇总表中。这样可以保持前端性能,您可以将汇总信息的后台合并过程处理到累积分数的缓存表中,在我的情况下,我使用的是 goLang 和 couchbase 表,但是在 mySql 中,您会发现添加一行要多比 upsert 快,你可以在 upsert 中找到记录然后更新。由于大小和可伸缩性,当前的数据库模式正在迅速转变为 noSQL 格式,旧的 SQL 模式在性能和复制方面的斗争变得复杂,对于单个数据库系统和小用户群,你没问题。
请求地址
HTTP POST http://[some dns]:8080/v1/post_score
请求负载
{
'user_id' : '[some-user-id]',
'game_id' : '[some-game-id]',
'score' : [value],
'duration' : [time played],
'level' : [level reached],
'stars' : [stars gained],
'os' : '[os identified]'
}
数据库中的附加字段,由用户代理捕获。
'ip' : [detected user ip],
'ts" : [timestamp from the server point of view]
关于mysql - 游戏排行榜的数据库方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37274066/