2016-05-17 71 views
1

我正在開發一款具有多種遊戲的應用程序,並且應該能夠處理數百萬玩家。每個遊戲都需要一個排行榜,並且必須能夠顯示玩家的當前位置和前10名玩家,以及玩家朋友的位置。遊戲排行榜的數據庫方法

目前我正在使用兩個表格。

user_score

  • ID
  • USER_ID
  • game_id
  • 得分
  • created_at

用戶_ 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:[email protected]+1 AS rank 
FROM user_max_score WHERE game_id = $gameId 
ORDER BY max_score DESC, updated_at ASC; 

有沒有比這更好的方法?

+0

下降了'user_max_score'表,這樣做'選擇USER_ID,MAX(分數)AS MAX_SCORE FROM user_score GROUP BY user_id'(見http://stackoverflow.com/questions/7745609/sql-select-僅-行與 - 最大 - 值上一列) – AmazingDreams

回答

0

我正在使用的一種方法是單表概念。所有分數都已發佈,然後您可以將背景中的分數合併到彙總表中。這保持了前端的性能,並且您可以將總結信息的後臺整合過程處理爲累積分數的緩存表,在我使用goLang和couchbase表的情況下,但在mySql中,您會發現添加一行很多比upsert快,你會發現一條記錄然後更新。由於規模和可擴展性,當前的數據庫模式正在迅速轉變爲noSQL格式,舊式SQL模式在性能和複製方面的努力變得越來越複雜,對於單個數據庫系統和小型用戶羣而言,您無所謂。

請求URL

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]