Python 2.7 盖伊:什么';这是构建模型数据存储的最佳实践

Python 2.7 盖伊:什么';这是构建模型数据存储的最佳实践,python-2.7,google-app-engine,data-structures,nosql,google-cloud-datastore,Python 2.7,Google App Engine,Data Structures,Nosql,Google Cloud Datastore,因此,在过去的3年中,我一直在使用关系数据库,我在创建noSql数据库的思维方式上遇到了一些问题。我有以下型号: class Account(ndb.Model): first_name = ndb.StringProperty() last_name = ndb.StringProperty() email = ndb.StringProperty() password = ndb.StringProperty() class Organisation(nd

因此,在过去的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组织在技术上是一种多对多关系,因此UserProfile就像关系数据库中的链接表一样

根据我的理解,我不应该为了获取实体的信息而进行超过1次的查询。例如,如果我通过查询获取属于该用户的所有UserProfiles,那么我就不必通过循环查询每个UserProfiles实体来分别获取关于每个组织的信息。我觉得我的组织方式不是最好的,也不是应该的

我考虑的另一件事是将组织详细信息存储在帐户模型本身中,但是如果组织详细信息发生了变化,那么我将不得不查询与该组织相关的所有帐户,并分别更新每个帐户

对于如何做到这一点,我通常感到困惑,任何帮助或解释我的错误之处都将不胜感激

为了获取实体的信息,我不需要进行超过1次的查询

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

但是你有两个基本的(和相反的)想法:

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

  • 将所需信息克隆到各个实体内部(可能使用?)-允许更快的访问(无需额外的查询/查找来获取信息),但在需要更新克隆信息时需要同步/维护

这实际上取决于您决定什么对您的应用程序有意义,并相应地在两个极端之间取得平衡/中间立场


就我个人而言,如果可能的话,我倾向于选择第一种。当我面对需要多个查询/查找的情况时,我总是反复检查是否真的需要同时使用来自多个实体的信息(例如,在单独的屏幕上显示组织详细信息可能是可以接受的?)。但这只是个人偏好。

谷歌将把每个数据存储用户迁移到NoSQL Cloud Firestore(数据存储模式)。但您也可以使用原生云Firestore,它有许多好处。更多:感谢您的见解