GQL +加入Google App Engine数据存储区的表查询替换

时间:2011-08-31 05:38:58

标签: google-app-engine gql

考虑到Google App Engine数据存储区中设计的以下多对多关系:

用户
PK :用户ID
名称

公司
PK :公司ID
名称

CompanyReview
CK 公司ID
CK UserID ReviewContent

对于优化查询,查询此关系表的最佳方法是显示所选公司的用户评论。

目前,我正在做以下事情:

results = CompanyReview.all().filter('owned_by = ', company).filter('written_by = ', user).fetch(10)

我可以在那里检索CompanyReview表的数据。但是,在这种情况下,我需要针对User表检查此CompanyReview表中的UserID,以获取已为所选公司注释的用户的名称。

是否有一个更好的解决方案来获取用户名,在这种情况下一个声明或至少更好的优化解决方案?表现得到强调。

1 个答案:

答案 0 :(得分:1)

它取决于关系的哪一方会有更多的价值。如上所述this article of Google App Engine docs,您可以通过在关系的一侧使用键列表来建模多对多关系。 “这意味着您应该将列表放在您希望具有较少值的关系的一侧。”

如果关系的双方都有很多值,那么你真的需要CompanyReview模型。但请注意文章所说的内容:

  

然而,你需要非常小心因为遍历了   集合的连接将需要对数据存储区的更多调用。   只有在真正需要时才使用这种多对多关系   小心,并谨慎地执行您的申请。

这是因为它在关系模型中使用了RefereceProperty:

class ContactCompany(db.Model):
    contact = db.ReferenceProperty(Contact,
                                   required=True,
                                   collection_name='companies')
    company = db.ReferenceProperty(Company,
                                   required=True,
                                   collection_name='contacts')
    title = db.StringProperty()

因此,如果我们尝试访问公司的联系人实体,它将进行新的查询。如果在ContactCompany实体中我们尝试获取联系人的属性,如contact_company.contact.name,那么也将对该单个联系人进行查询。请阅读ReferencyProperty docs了解详情。

额外: 由于您精通业绩,我建议您使用decorator for memcaching function returns并将此优秀的layered storage library用于Google App Engine。