GAE组织数据结构问题

时间:2010-10-23 15:44:42

标签: python database google-app-engine

确定。我正在和GAE合作。我想创建这样的东西:

我有类型“group”“topic”“tag”:

  1. 每个“组”都可以拥有多少 根据需要“主题”

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

  3. 每个“群组”都可以拥有尽可能多的“代码” 根据需要

  4. 就像圈子一样。

    现在我有这样的事情:

    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)
    

    但这并不好(在我的模型中“主题”只能有一个标签,但我需要“主题”才能拥有所需数量的标签)

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

2 个答案:

答案 0 :(得分:5)

多对多连接可以实现为连接表(或关系模型)。在下面的解决方案中,有一个模型可以包含应用于单个GroupsGroupTags)的所有标记以及一个包含应用于Topics的标记的模型({ {1}})。

TopicTags本身与对Tag的引用相关联,可以让您更改标记的拼写,而无需更新每个TagGroup Topic已应用。

此外,此模型充分利用了AppEngine为具有引用它们的其他实体的实体创建自动反向引用的事实。在下面的模型中,Group实体将拥有一个名为Tag的属性,该属性是一个查询,可以获取topics Topicgroup个参考点的实体Group。同样,每个Grouptags模型中获取GroupsTags属性,该属性为其提供属于它的所有Tag个实体。每个Tag实体都会获得groupstopics属性,该属性是对分配了给定标记的那些类型的所有实体的查询,从而按标记进行搜索(非常典型的操作)非常简单。

这是一种非常强大而灵活的建模系统方法,例如你的系统。

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')

答案 1 :(得分:2)

解决方案是使用类型为db.Key的db.ListProperty。 请参阅:http://code.google.com/appengine/articles/modeling.html(多个部分)