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引用和相关的权限表示.
由于这听起来像是一个商业项目,如果你想进一步帮助我,我很乐意为你咨询.希望你有足够的成功!