【问题标题】:Get a random entity in Google App Engine datastore which does not belong to a list在 Google App Engine 数据存储中获取不属于列表的随机实体
【发布时间】:2013-07-04 18:39:46
【问题描述】:

我正在使用 Google App Engine 构建网页游戏。游戏有一个存储的用户创建的关卡列表(可能很多,并且还会动态增加),每个用户都有一个他已经玩过的关卡列表。我需要为他以前没有玩过的用户随机选择一个级别。实体的建模如下:

class User(ndb.Model):
    uid = ndb.StringProperty()
    levels_played = ndb.KeyProperty(kind='Level', repeated=True)

class Level(ndb.Model):
    #some stuff here

所以基本上我需要执行一个查询,给定一个uid,选择一个不属于相应列表levels_played 的随机级别。最有效的方法是什么?

【问题讨论】:

    标签: google-app-engine app-engine-ndb


    【解决方案1】:

    没有简单的方法,因为您无法以符合您要求的方式进行连接。

    看看这里选择随机记录的策略。

    Query random row in ndb

    我个人会从范围键中随机选择 id,然后获取下一个 n 记录选项。然后检查提取的 n 条记录中的选择是否不在播放记录列表中。如果从 n 条记录列表中选择不同的级别。

    但是,一旦您拥有大量播放记录,即使这样也无法很好地扩展,除非您保留一个二进制密钥块,否则您可以快速检查一个关卡是否已经播放过。

    您合理地期望拥有多少级别和多少玩家。一旦关卡和玩家数量增加,您可能不得不牺牲性能来换取大量的内务数据,以提高性能。

    另一种方法是对级别使用 allocids(获取顺序 ID) 并构建位图。维护一个全局位图,为每个已创建的关卡 id 设置一个位,然后为每个用户设置一个位图,为所玩的关卡设置每个位。您可以在一个 1MB 的 blob 属性中存储大约 800 万个级别。一些位操作,您就有一组未玩过的游戏可供选择。选择一点,然后获取级别。

    【讨论】:

    • 一开始,用户数在 100-200 左右,级别在 1000 左右。但我想确保它可以扩展到大约 10000 名用户,级别数大致相同(因为关卡制作非常容易)。位图选项看起来不错,虽然我直到现在还不太了解 BlobProperty。我会看看文档。谢谢! :)
    • 根据你的数字,我肯定会调查位图。
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 2017-11-04
    • 2010-12-03
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多