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文档。