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

Fei*_*anZ 8 python database google-app-engine database-design

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

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

  • User,代表使用该应用的人.
  • Project,代表一个项目.A User可能与许多项目相关联.
  • Post,这是背后的主要内容Project.A Project可能有很多帖子.

目前,User有一个属性,projects即与Project实体的一对多关系.Project有一个属性,posts这是与Post实体的一对多关系.

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

Sol*_*oub 11

通过引用属性,您可能意味着Key Property.这是对另一个数据存储区实体的引用.它存在于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()
Run Code Online (Sandbox Code Playgroud)

对于您的特定应用程序,我建议使用NDB(最好使用最新版本的api),具体如下:

将项目模型中包含的模型作为重复的结构化属性.用户包括重复的KeyProperty,其中包含他们有权访问的Projects的键.

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

您想要依赖密钥的主要原因是根据HRD最终的一致性来保持数据的可访问性.

如果您需要更多帮助,请告诉我.

编辑:

澄清一下,这是建议的结构:

楷模:

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

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

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

User-Project-Mapping只需要包含Project的Key引用和相关的权限表示.

由于这听起来像是一个商业项目,如果你想进一步帮助我,我很乐意为你咨询.希望你有足够的成功!