【问题标题】:Modeling Ranking (scores) in Non Relational DataBase (NoSQL)非关系数据库 (NoSQL) 中的建模排名(分数)
【发布时间】:2014-08-04 15:03:39
【问题描述】:

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

哪个是使用他们的分数来建模排名(玩家排名)的最佳选择?

例如,我的玩家是:

Player { String name, int score}

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

谢谢。

【问题讨论】:

    标签: google-app-engine database-design nosql ranking amazon-simpledb


    【解决方案1】:

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

    获得任意玩家的排名真的很难。够难了,我会说,如果可以,请避免它,如果不能,请找到绕过它的黑客方法。

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

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

    【讨论】:

      【解决方案2】:

      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 文档中的 ZREVRANGEZREVRANK

      【讨论】:

        【解决方案3】:

        在 JSON 中的合适表示是:

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

        有关如何排序的示例:

        【讨论】:

          【解决方案4】:

          你可以像这样设置你的 index.yaml:

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

          要获得一名球员的得分,您只需传递球员(同时保持计数)并缓存结果以加快对该球员的进一步搜索。

          【讨论】:

            猜你喜欢
            • 2011-02-06
            • 1970-01-01
            • 1970-01-01
            • 2011-05-08
            • 2019-04-18
            • 1970-01-01
            • 1970-01-01
            • 2014-05-15
            • 1970-01-01
            相关资源
            最近更新 更多