【问题标题】:GQL + Join Table Query Replacement for Google App Engine DatastoreGoogle App Engine 数据存储区的 GQL + 联接表查询替换
【发布时间】:2011-11-07 08:29:35
【问题描述】:

鉴于 Google App Engine 数据存储区中设计的以下多对多关系:

用户
PK:用户ID
名称

公司
PK:公司ID
名称

CompanyReview
CK CompanyID
CK UserID 审核内容

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

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

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

我可以在哪里检索 CompanyReview 表的数据。但是,在这种情况下,我需要检查来自 CompanyReview 表的 UserID 和 User 表,以获取为所选公司发表评论的用户的名称。

是否有更好的解决方案来获取用户名,在这种情况下全部在一个语句中,或者至少有更好的优化解决方案?强调性能。

【问题讨论】:

    标签: google-app-engine gql


    【解决方案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()
    

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

    额外: 由于您精通性能,我建议您使用 decorator for memcaching function returns 并将这个出色的 layered storage library 用于 Google App Engine。

    【讨论】:

    • 感谢提醒...对于这种情况,是的,需要另一个模型..因为公司和用户本身都是实体..所以,我们肯定需要另一个审查表来存储内容和审查的详细信息.. 也感谢您提供额外有用的信息...;) 但是,感谢您再次强调使用 DbListProperty 的有用性..以及额外的信息! ;)
    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 2013-05-17
    • 2011-08-16
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2013-10-13
    • 2014-03-02
    相关资源
    最近更新 更多