游戏排行榜的数据库方法

时间:2016-05-17 10:52:54

标签: mysql database

我正在开发一款拥有多款游戏的服务器应用程序,应该可以处理数百万玩家。每个游戏都需要一个排行榜,并且必须能够显示玩家的当前位置和前10名玩家,以及玩家朋友的位置。

目前我正在使用两张桌子。

user_score

  • ID
  • USER_ID
  • game_id
  • 得分
  • created_at

user_ max_score

  • ID
  • USER_ID
  • game_id
  • MAX_SCORE
  • created_at
  • 的updated_at

每当用户第一次玩任何游戏时,数据都会插入第一张和第二张表中。如果用户第二次播放并且得分高于之前的分数,我们会将数据插入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;

有没有比这更好的方法?

1 个答案:

答案 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]