非关系数据库 (NoSQL) 中的建模排名(分数)



我使用的是Google App Engine,所以我使用的是非关系数据库(NoSQL)。我的问题是:

使用他们的分数对排名(玩家排名)进行建模的最佳选择是什么?

例如,我的玩家是:

Player { String name, int score}

我想知道玩家的排名(位置),并获得前 10 名玩家,但我怀疑哪个是最好的方法。

谢谢。

如果您的分数已编入索引,则可以轻松执行数据存储查询并按排序顺序获取球员。所以如果你想要前10名的球员,那是微不足道的。

获得任意玩家的排名真的很难。 很难,我会说,如果可以的话,避免它,如果你不能,找到一个解决方法。

例如,如果您有 50,000 名玩家,而 PlayerX 排名为 12,345,那么知道这一点的唯一方法是查询所有玩家,并检查每个玩家,保持计数,直到找到 PlayerX。

一种技巧可能是将玩家排名存储在玩家实体中,并使用每隔几个小时运行一次的 cron 作业对其进行更新。

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"

请参阅 Redis 文档中的 ZREVRANGE 和 ZREVRANK。

JSON 中对此的合适表示是:

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

有关如何对此进行排序的示例:

  • PHP:如何在 PHP 中按给定键的值对关联数组进行排序?
  • JavaScript:如何在PHP中按给定键的值对关联数组进行排序?
  • JavaScript 常规排序:http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C8D00514FA4
你可以

像这样设置你的index.yaml:

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

要获得玩家的分数,您只需在玩家上方进行传递(同时保持计数)并缓存结果以加快对该玩家的进一步搜索。

相关内容

  • 没有找到相关文章