代码之家  ›  专栏  ›  技术社区  ›  obenjiro

GAE组织数据结构问题

  •  3
  • obenjiro  · 技术社区  · 14 年前

    好 啊。我和盖伊一起工作。我想创造这样的东西:

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

    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)
    

    但这并不好(在我的模型中,“topic”只能有一个标记,但我将“topic”排成需要的多个标记)

    好吧,我脑子里已经有一个裂缝。。。有人能帮忙吗?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Adam Crossland    14 年前

    多对多联接可以实现为联接表(或关系模型)。在下面的解决方案中,有一个模型保存应用于单个 Groups ( GroupTags )以及一个模型,它保存应用于 Topics ( TopicTags ).

    分离 Tag 从引用到 标签 Group Topic 对此 标签 已应用。

    topics 这是一个将获取所有 主题 实体谁是 group 参考点 . 同样,每个 集团 得到一个 tags 来自的属性 GroupsTags 模型提供了 标签 属于它的实体。每 标签 groups 话题 属性,该属性是对指定了给定标记的那些类型的所有实体的查询,使按标记搜索(非常典型的操作)变得非常简单。

    这是一个非常强大和灵活的方法来建模系统,如你的。

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