8

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

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

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

目前,User有一个属性,即与实体projects的一对多关系。有一个属性,即与实体的一对多关系。ProjectProjectpostsPost

在这种情况下,Datastore 的 Reference Property 还是 NDB 的 Structured Property 更适合这项工作(两者在概念上有何不同)?有没有更好的方法来构建我的数据?

4

2 回答 2

11

通过引用属性,您可能是指关键属性。这是对另一个数据存储实体的引用。它存在于 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 引用和相关的权限表示。

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

于 2012-12-28T17:29:58.607 回答
3

还有一点没有提到并且可能相关:插入到StructuredProperty中的实体“不是成熟的实体”,如文档的这一部分中所述。以下是完整的引用(它指的是@Sologoub 的答案中提到的相同示例):

尽管 Address 实例使用与模型类相同的语法定义,但它们不是成熟的实体。他们在 Datastore 中没有自己的密钥。它们不能独立于它们所属的联系人实体进行检索。

鉴于您不能在不复制数据的情况下重用实体的属性,这可能会给设计带来一些限制。另一方面,KeyProperty引用另一个实体的键,因此以更“关系”的方式表示实体关系。并且KeyProperties也可以重复:只需包含repeated=True参数。

于 2014-06-06T08:13:21.613 回答