【发布时间】:2011-04-27 03:42:39
【问题描述】:
有什么聪明的方法可以避免在像下面这样的情况下使用 IN 子句进行代价高昂的查询?
我正在使用 Google App Engine 构建 Facebook 应用程序,并且在某些时候我(显然)需要查询数据存储区以获取属于给定用户的任何 Facebook 朋友的所有实体。
假设我有几个这样建模的实体:
class Thing(db.Model):
owner = db.ReferenceProperty(reference_class=User, required=True)
owner_id = db.StringProperty(required=True)
...
和
class User(db.Model):
id = db.StringProperty(required=True)
...
在某些时候,我查询 Facebook 以获取给定用户的朋友列表,我需要执行以下查询
# get all Thing instances that belong to friends
query = Thing.all()
query.filter('owner_id IN', friend_ids)
如果我这样做了,AppEngine 将为friend_ids 中的每个 id 执行子查询,这可能超过任何查询可以产生的最大子查询数 (30)。
有没有更好的方法来做到这一点(即最小化查询数量)?
我知道没有使用数据存储的关系和连接,但特别是,如果有助于使事情变得更容易,我会考虑向 User 或 Thing 类添加新字段。
【问题讨论】:
标签: python google-app-engine google-cloud-datastore gql gquery