Google AppEngine:进行复杂的查询

时间:2013-09-25 18:20:51

标签: google-app-engine

我有一个这样的模型:

class Person(db.Model):
     ...
     zipcode = db.StringProperty()

class Book(db.Model):
     owner = db.ReferenceProperty(Person)
     date_created = db.DateTimeProperty(auto_add=True)

如何获得按date_created降序排序的特定邮政编码中的所有图书清单?

2 个答案:

答案 0 :(得分:1)

将Greg的答案更进一步,在App Engine的数据存储上正确的做法是反规范化:

class Person(db.Model):
     ...
     zipcode = db.StringProperty()

class Book(db.Model):
     owner = db.ReferenceProperty(Person)
     date_created = db.DateTimeProperty(auto_add=True)
     zipcode = db.StringProperty()

设置所有者时,您必须小心设置Book的邮政编码。之后,将您想要的查询作为单个查询非常简单。 Greg的解决方案成本更高,因为您需要执行多个查询并获取许多实体才能进行合并。对于大型数据集,它也很慢,并且您冒着各种提取操作超时的风险,以及合并操作需要很长时间和大量内存。

答案 1 :(得分:0)

您必须使用您正在查找的邮政编码对所有Person实体进行查询,然后查找每本书籍,合并列表,然后对结果进行排序。

通常,像您一样对关系数据库进行规范化并不是使用数据存储区建模的最佳方式。