GAE组织数据结构问题

obe*_*iro 3 python database google-app-engine

好.我正在和GAE合作.我想创建这样的东西:

我有类型"组""主题""标签":

  1. 每个"组"可以根据需要拥有尽可能多的"主题"

  2. 每个"主题"可以根据需要包含尽可能多的"标签"

  3. 每个"组"可以根据需要拥有尽可能多的"标签"

它就像圆圈一样.

现在我有这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

但这并不好(在我的模型中"主题"只能有一个标签,但是我需要"主题"来根据需要提供尽可能多的标签)

好吧,我脑子里已经有了一个裂缝...是否有人可以提供帮助?

Ada*_*and 5

多对多连接可以实现为连接表(或关系模型).在下面的解决方案中,有一个模型包含应用于individual Groups(GroupTags)的所有标记以及一个包含应用于Topics(TopicTags)的标记的模型.

解耦Tag从引用自身的Tag允许你做的事情,比如修改标签的拼写,而无需更新每个GroupTopic到该Tag应用.

此外,此模型充分利用了AppEngine在具有引用它们的其他实体的实体上创建自动反向引用的事实.在下面的模型中,Group实体将具有一个名为property的属性topics,该属性将获取所有引用指向该Topic实体的实体.类似地,每个都从模型中获取一个属性,该属性为其提供属于它的所有实体.每个实体得到一个和属性,是所有那些分配有给予标签类型的实体的查询,使得由标签(一个非常典型的操作)很简单的搜索.groupGroupGrouptagsGroupsTagsTagTaggroupstopics

这是一种非常强大而灵活的方法来建模您的系统.

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')
Run Code Online (Sandbox Code Playgroud)