GAE:构建模型数据存储区的最佳实践是什么

时间:2019-02-28 04:18:47

标签: python-2.7 google-app-engine data-structures nosql google-cloud-datastore

因此,过去三年来我一直在使用关系数据库,而在创建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()

帐户x组织从技术上讲是多对多关系,因此UserProfile就像关系数据库中的链接表一样

根据我的理解,我不必为了获取有关实体的信息而进行超过1个查询。例如,如果我查询以获取属于该用户的所有UserProfiles,则不必遍历并查询每个UserProfiles实体即可分别获取有关每个组织的信息。我觉得我的结构不是最好的还是应该的。

我想到的另一件事是将组织详细信息存储在“帐户”模型本身内部,但是如果组织详细信息发生更改,则我将不得不查询连接到组织的所有帐户并分别更新每个帐户。

通常对如何执行此操作感到困惑,对我要去哪里的任何帮助或解释将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

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

好吧,在您的示例中,您不是-额外的查找(而非查询)用于收集有关组织的信息,这些组织与您要查询的用户个人资料实体相比,有不同的实体。 >

但是您有2个大致的想法(相反):

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

  • 在相应实体内克隆所需的信息(也许使用Structured Properties?)-允许更快的访问(无需其他查询/查找即可获取信息),但是在克隆的信息时需要同步/维护需要更新。

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

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