因此,过去三年来我一直在使用关系数据库,而在创建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实体即可分别获取有关每个组织的信息。我觉得我的结构不是最好的还是应该的。
我想到的另一件事是将组织详细信息存储在“帐户”模型本身内部,但是如果组织详细信息发生更改,则我将不得不查询连接到组织的所有帐户并分别更新每个帐户。
通常对如何执行此操作感到困惑,对我要去哪里的任何帮助或解释将不胜感激。
答案 0 :(得分:1)
为了获得有关实体的信息,我不必进行超过1次查询
好吧,在您的示例中,您不是-额外的查找(而非查询)用于收集有关组织的信息,这些组织与您要查询的用户个人资料实体相比,有不同的实体。 >
但是您有2个大致的想法(相反):
在建立一对多和多对多关系时,使用ndb.KeyProperty
来引用其他实体:最少/没有重复信息,因此不需要同步/维护,但需要多次查询/查找汇总分布在多个实体中的信息
在相应实体内克隆所需的信息(也许使用Structured Properties?)-允许更快的访问(无需其他查询/查找即可获取信息),但是在克隆的信息时需要同步/维护需要更新。
真正由您决定什么对您的应用程序有意义,并相应地在两个极端之间取得平衡/中间立场。
如果可能的话,我个人倾向于第一个。当我遇到需要多个查询/查找的情况时,我总是仔细检查是否确实确实需要同时使用多个实体的信息(例如,可以在单独的屏幕中显示组织详细信息吗?)。但这只是个人喜好。