考虑到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,以获取已为所选公司注释的用户的名称。
是否有一个更好的解决方案来获取用户名,在这种情况下一个声明或至少更好的优化解决方案?表现得到强调。
答案 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。