2011-08-31 116 views
2

考虑下面的多对多的关系在谷歌App Engine数据存储设计:GQL +加入表查询替换为谷歌App Engine数据存储

用户
PK:用户名
名称

公司
PK:公司ID
名称

CompanyReview
CK CompanyID
CK用户名 ReviewContent

为了优化查询,有什么要查询的显示用户所选择的公司的审查这一关系表的最佳途径。

目前,我做了以下内容:

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

在那里我能找回CompanyReview表的数据。但是,在这种情况下,我需要根据用户表检查此CompanyReview表中的UserID,以获取为所选公司评论的用户的名称。

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

回答

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。

+0

感谢您的提醒...对于这种情况,是的,需要另一种模式。因为公司和用户都是自己的实体..所以,我们绝对需要另一个评论表来存储评论的内容和细节。 也感谢您的额外有用的信息...;) 但是,再次highlighing感谢使用DbListProperty ..以及额外的信息! ;) – MrCooL

相关问题