【问题标题】:Google App Engine Query (not filter) for children of an entity实体子级的 Google App Engine 查询(非过滤器)
【发布时间】:2010-10-06 10:22:03
【问题描述】:

实体的子实体在查询中可用吗?

给定:

class Factory(db.Model):
    """ Parent-kind """
    name = db.StringProperty()

class Product(db.Model):
    """ Child kind, use Product(parent=factory) to make """
    @property
    def factory(self):
        return self.parent()
    serial = db.IntegerProperty()

假设 500 家工厂生产了 500 种产品,共计 250,000 种产品。有没有办法形成一个资源高效的查询,只返回一个特定工厂生产的 500 种产品?祖先方法是一个过滤器,所以使用例如Product.all().ancestor(factory_1) 需要重复调​​用数据存储。

【问题讨论】:

    标签: google-app-engine gql gqlquery ancestor


    【解决方案1】:

    虽然祖先被描述为“过滤器”,但它实际上只是更新查询以添加祖先条件。在迭代查询之前,您不会向数据存储区发送请求,因此您所拥有的一切都可以正常工作。

    不过有一个小问题:500 个具有相同父级的实体可能会损害可伸缩性,因为写入会序列化到实体组的成员。如果您只想跟踪制造产品的工厂,请使用 ReferenceProperty:

    class Product(db.Model):
       factory = db.ReferenceProperty(Factory, collection_name="products")
    

    然后您可以使用以下方式获取所有产品:

    myFactory.products
    

    【讨论】:

    • 文档称它为过滤器,但不是吗?求大神,接下来怎么办。写入的用例是每个工厂每天创建零到十个产品,产品之间的最短时间为十秒(“突发”)。 95% 的产品读取将是工厂整体。 parent-child 或 ReferenceProperty 哪个更好?
    • 我认为建议是仅使用交易中的实体组,因此 ReferenceProperty 会更好,尽管可能没有太大区别...
    • 同一实体组中的 500 个元素没有任何问题 - 重要的是更新率。
    • 为什么要使用祖先查询而不是引用属性?我发现自己想检查具有引用属性(等式过滤器)的一系列实体上是否存在属性(不等式过滤器!= null)。没有索引我做不到!我可以搜索 100,000 个实体。所以添加一个祖先(而不是引用 prop )也许可以让我在没有额外索引的情况下执行该查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多