首页 > 解决方案 > GAE:构建模型数据存储的最佳实践是什么

问题描述

所以在过去的 3 年里我一直在使用关系数据库,我在创建 noSql 数据库的心态上遇到了一些麻烦。我有以下型号:

class Account(ndb.Model):
    first_name = ndb.StringProperty()
    last_name = ndb.StringProperty()
    email = ndb.StringProperty()
    password = ndb.StringProperty()


class Organisation(ndb.Model):
    org_name = ndb.StringProperty()
    org_address = ndb.StringProperty()
    .. and so on

class UserProfile(ndb.Model):
    user = ndb.KeyProperty(kind='Account')
    organisation = ndb.KeyProperty(kind='Organisation')
    role = ndb.StringProperty()

Account x Organization 在技术上是多对多关系,因此 UserProfile 就像一个链接表,就像在关系数据库中一样

据我了解,为了获取有关实体的信息,我不应该进行超过 1 次查询。例如,如果我查询以获取属于该用户的所有 UserProfile,那么我不应该遍历并查询每个 UserProfiles 实体来单独获取有关每个组织的信息。我觉得我构建它的方式不是最好的或应该的方式。

我正在考虑的另一件事是将组织详细信息存储在 Account 模型本身中,但是如果组织详细信息发生更改,那么我将不得不查询连接到该组织的所有帐户并单独更新每个帐户。

只是一般对如何做到这一点感到困惑,任何关于我哪里出错的帮助或解释将不胜感激。

标签: python-2.7google-app-enginedata-structuresnosqlgoogle-cloud-datastore

解决方案


为了获取有关实体的信息,我不必执行超过 1 次查询

好吧,在您的示例中,您不是 - 额外的查找(不是查询)将用于收集有关组织的信息,这些信息与您查询的用户配置文件实体不同。

但是你有两个一般(和相反)的想法:

  • 用于ndb.KeyProperty在建模一对多和多对多关系时引用其他实体:最少/无重复信息,因此不需要同步/维护,但需要多次查询/查找来聚合分布在多个实体中的信息

  • 在各个实体内克隆所需的信息(也许使用结构化属性?) - 允许更快的访问(不需要额外的查询/查找来获取信息),但是当需要更新克隆的信息时需要同步/维护。

真正由您决定什么对您的应用程序有意义,并相应地在两个极端之间取得平衡/中间立场。

如果可能的话,我个人倾向于支持第一个。当我遇到需要多个查询/查找的情况时,我总是仔细检查是否确实需要同时使用来自多个实体的信息(例如,在单独的屏幕中显示组织详细信息是否可以接受?)。但这只是个人喜好。


推荐阅读