0

我使用的是Google App Engine,因此我使用非關係數據庫(NoSQL)。我的問題是:非關係數據庫(NoSQL)建模排名(分數)

使用他們的分數建立排名(玩家排名)的最佳選擇是什麼?

例如,我的球員有:

Player { String name, int score} 

我想知道從一個玩家的等級(位置),並同時獲得前10名的球員,但我懷疑這是最好的辦法。

謝謝。

回答

2

如果您的分數已編入索引,那麼執行數據存儲查詢並按排序順序排列玩家很容易。 所以如果你想要前十名的球員,這是非常微不足道的。

獲得任意玩家的排名真的很難。如果可以的話,儘量避免使用它,如果不能使用,可以找到解決辦法。例如,如果您擁有50,​​000名玩家,並且PlayerX排名爲12,345,那麼唯一的方法就是查詢所有玩家,並查看其中每個玩家,保持計數,直到找到PlayerX。

一個黑客可能會將玩家排名存儲在玩家實體中,並使用每隔幾小時運行一次的cron作業進行更新。

0

的這在JSON一種合適表示是:

"players" : [ 
    { 
     "name" : "John", 
     "score" : 15 
    }, 
    { 
     "name" : "Swadq", 
     "score" : 7 
    }, 
    { 
     "name" : "Jane", 
     "score" : 22 
    } 
] 

有關如何排序這個例子:

0

你可以設置你的index.yaml中,像這樣:

- kind: Player 
    properties: 
    - name: score 
    direction: ascending 

要獲得玩家的分數,你只需要做出傳過來的球員(同時保持計數)和緩存結果進一步加快搜索該玩家。

1

有在Redis內置的解決方案:

首先添加幾個成員的分數:

redis> ZADD myzset 1 "one" 
(integer) 1 
redis> ZADD myzset 2 "two" 
(integer) 1 
redis> ZADD myzset 3 "three" 
(integer) 1 

獲得的 「兩型」 軍銜:

redis> ZREVRANK myzset "one" 
(integer) 2 

(索引從0開始)

如果你想要當前的順序:

redis> ZREVRANGE myzset 0 -1 
1) "three" 
2) "two" 
3) "one" 

請參閱和ZREVRANK的redis文檔。