数据存储区的分层查询

时间:2014-11-03 10:38:25

标签: python google-app-engine google-cloud-datastore

我正在尝试在App Engine上创建分层查询。

我的数据存储区有父母和孩子。每个父母都有孩子。想象一下,我必须找到孩子。我有一个关于父母和孩子的条件,例如,想象一个真正的家庭数据库,我的条件是:我希望所有孩子都是35岁或以上的父母。

我现在的查询是这样的:

P = Parent.query(Parent.age >= 35)
for p in P:
    C = Children.query(gender == "boy", ancestor = p.key)
    for c in C:
        -> here I print information on the children 

但是查询速度非常慢,需要测试很多父级和子级。我想避免迭代等等,因为我觉得这需要很长时间!什么是最好的做法,但快速进行他的查询?

我也有孩子的兄弟,我可以提出疑问,例如,如果我想要所有有35岁以上父母的孩子和一个名叫" Sisi"的姐姐,我会(每个孩子都有他的兄弟的价值"兄弟"):

 P = Parent.query(Parent.age >= 35)
        for p in P:
            C = Children.query(gender == "girl", name == "Sisi", ancestor = p.key)
            for c in C:
                C1 = Children.query(gender == "boy", brother == c.key, ancestor = p.key)
                for c1 in C1:
                    ->Here I print information about the children

事实上,这个例子(家庭例子)对我的项目有好处,但它让我知道我遇到的问题

1 个答案:

答案 0 :(得分:1)

我以前如何能够将密钥存储在单独的查找实体中。这就是键值存储的前提,即有时需要重复信息才能加快查找速度。例如:

ParentChildLookup
 - parent_key = ndb.KeyProperty()
 - child_key = ndb.KeyProperty()

你甚至可以添加第三个方面的孙子孙女:

ParentChildLookup
 - parent_key = ndb.KeyProperty()
 - child_key = ndb.KeyProperty()
 - grandchildren_key = ndb.KeyProperty()

如果您想在一个查询中查找所有内容,可以添加重复子句以使子项和孙子列表:

ParentChildLookup
 - parent_key = ndb.KeyProperty()
 - child_key = ndb.KeyProperty(repeated=True)
 - grandchildren_key = ndb.KeyProperty(repeated=True)

然后,只要关系发生变化,您就需要插入/更新这些查找值。这样做的好处是可以避免大量查询,特别是嵌套或多属性查询。如果你不喜欢这种方法,我建议你看看这里的“关系模型”解释:https://cloud.google.com/appengine/articles/modeling。您可以存储多对多对象之间的关系,而无需将它们全部存储在同一个实体中。