一尘不染

App Engine:一对多关系的结构化属性与参考属性

python

我设计数据存储的背景来自iOS上的Core Data,它支持与另一个实体具有一对多关系的属性。

我正在开发一个App Engine项目,该项目目前具有三种实体类型:

  • User,代表使用该应用程序的人。
  • Project,代表一个项目。AUser可能与许多项目相关联。
  • Post,这是背后的主要内容Project。AProject可能有很多职位。

当前,User它具有属性,projects即与Project实体的一对多关系。Project具有一个属性,posts即与Post实体一对多的关系。

在这种情况下,数据存储的参考属性或NDB的结构化属性是否更适合这项工作(两者在概念上有何不同)?有没有更好的方法来组织数据?


阅读 272

收藏
2021-01-20

共1个答案

一尘不染

通过引用属性,您可能指的是关键属性。这是对另一个数据存储实体的引用。它同时存在于db和ndb
API中。使用这些,您可以通过将许多实体指向另一个实体的键来建立多对一关系的模型。

结构属性是完全不同的野兽。它允许您定义数据结构,然后将其包含在另一个实体中。

这是文档中的示例,其中您为单个联系人包括多个地址:

class Address(ndb.Model):
  type = ndb.StringProperty() # E.g., 'home', 'work'
  street = ndb.StringProperty()
  city = ndb.StringProperty()

class Contact(ndb.Model):
  name = ndb.StringProperty()
  addresses = ndb.StructuredProperty(Address, repeated=True)

guido = Contact(name='Guido',
                addresses=[Address(type='home',
                                   city='Amsterdam'),
                           Address(type='work',
                                   street='Spear St',
                                   city='SF')])

guido.put()

对于您的特定应用程序,我建议使用NDB(始终最好使用可用的api的最新版本),其中包括以下内容:

发布模型包含在项目模型下,作为重复的结构化属性。用户包括重复的KeyProperty,其中包含他们有权访问的项目的键。

为了使其更加复杂,可以创建另一个模型来表示项目和权限/角色,然后将其作为重复的结构化属性包含在用户模型中。

您要挂在键上的主要原因是要根据HRD最终的一致性来保持数据的可访问性。

让我知道您是否需要更多帮助。

编辑:

为了澄清,这是建议的结构:

楷模:

  • 用户
  • 用户项目映射(可选,需要处理权限)
  • 项目
  • 发布

用户模型应包含User-Project-Mapping作为重复的结构化属性。

项目模型应包含Post作为重复的结构化属性。

User-Project-Mapping仅需要包含对Project的Key引用以及相关的权限表示。

由于这听起来像是一个商业项目,所以如果您需要进一步的帮助,我们将很乐意为您咨询。希望你有足够的成功!

2021-01-20