通过引用属性,您可能是指关键属性。这是对另一个数据存储实体的引用。它存在于 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 引用和相关的权限表示。
由于这听起来像是一个商业项目,如果您需要进一步的帮助,我很乐意为您咨询。希望你有足够的成功!