好的。我正在与 GAE 合作。我想创建这样的东西:
我有类型“组”“主题”“标签”:
每个“组”可以有尽可能多的 根据需要“主题”
每个“主题”可以有多个“标签” 根据需要
每个“组”可以有多个“标签” 根据需要
它有点像圆圈。
现在我有这样的东西:
class TopicGroup(db.Model):
value = db.StringProperty(required=True)
class Topic(db.Model):
title = db.StringProperty(required=True)
group = db.ReferenceProperty(TopicGroup, 'group', 'topics', required=True)
class TopicTag(db.Model):
topic = db.ReferenceProperty(Topic, 'topic', 'tags', required=True)
group = db.ReferenceProperty(TopicGroup, 'group', 'tags', required=True)
value = db.StringProperty(required=True)
但这并不好(在我的模型中,“主题”只能有一个标签,但我需要“主题”根据需要拥有尽可能多的标签)
好吧,我的脑袋已经有问题了...有人可以帮忙吗?
最佳答案
多对多连接可以作为连接表(或关系模型)实现。在下面的解决方案中,有一个模型包含所有应用于单个 Groups
(GroupTags
) 的标签,还有一个模型包含应用于 主题
(主题标签
)。
将 Tag
本身与对 Tag
的引用解耦允许您执行更改标签拼写等操作,而无需更新每个 Group
或 Topic
应用了 Tag
。
此外,该模型还充分利用了 AppEngine 在其他实体引用它们的实体上创建自动反向引用这一事实。在下面的模型中,一个 Group 实体将有一个名为 topics
的属性,该属性是一个查询,它将获取 group
引用指向的所有 Topic
实体那个组
。类似地,每个 Group
从 GroupsTags
模型中获取一个 tags
属性,该属性赋予它所有属于的 Tag
实体给它。每个 Tag
实体都有一个 groups
和 topics
属性,该属性是对分配了给定标签的那些类型的所有实体的查询,使得按标签搜索(非常典型的操作)非常简单。
对于像您这样的系统建模,这是一种非常强大和灵活的方法。
class Group(db.Model):
# All of my group-specific data here.
class Topic(db.Model):
title = db.StringProperty(required=True)
group = db.ReferenceProperty(Group, collection='topics')
# other topic-specific data here.
class Tag(db.Model):
text = db.StringProperty(required=True)
class GroupTags(db.Model):
group = db.ReferenceProperty(Group, collection='tags')
tag = db.ReferenceProperty(Tag, collection='groups')
class TopicTags(db.Model):
topic = db.ReferenceProperty(Topic, collection='tags')
tag = db.ReferenceProperty(Tag, collection='topics')
关于python - GAE组织数据结构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004770/