【问题标题】:Database approach for Game Leaderboard游戏排行榜的数据库方法
【发布时间】:2016-09-13 10:22:24
【问题描述】:

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

目前我正在使用两个表。

user_score

  • 身份证
  • user_id
  • game_id
  • 得分
  • created_at

user_max_score

  • 身份证
  • 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;

还有比这更好的方法吗?

【问题讨论】:

  • 删除user_max_score 表并执行SELECT user_id, MAX(score) AS max_score FROM user_score GROUP BY user_id 之类的操作(请参阅stackoverflow.com/questions/7745609/…
  • 有一段时间了,你是怎么解决这个问题的@dgoku?

标签: mysql database


【解决方案1】:

我使用的一种方法是单表概念。发布所有分数,然后您可以将后台中的分数合并到一个汇总表中。这样可以保持前端性能,并且您可以将汇总信息的后台合并过程处理到累积分数的缓存表中,在我的情况下,我使用 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] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多