我正在尝试在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
事实上,这个例子(家庭例子)对我的项目有好处,但它让我知道我遇到的问题
答案 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。您可以存储多对多对象之间的关系,而无需将它们全部存储在同一个实体中。