我正在开发一款拥有多款游戏的服务器应用程序,应该可以处理数百万玩家。每个游戏都需要一个排行榜,并且必须能够显示玩家的当前位置和前10名玩家,以及玩家朋友的位置。
目前我正在使用两张桌子。
user_score
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;
有没有比这更好的方法?
答案 0 :(得分:0)
我使用的一种方法是单表概念。发布所有分数,然后您可以将背景中的分数合并到汇总表中。这样可以保持前端性能,并且可以处理后台整合过程以获取累积分数的缓存表中的摘要信息,在我的情况下我使用的是goLang和couchbase表,但是在mySql中,你会发现添加一行很多比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]