【问题标题】:How to design the schema for something like StackOverflow questions tags?如何为 StackOverflow 问题标签之类的东西设计架构?
【发布时间】:2011-04-13 12:06:03
【问题描述】:

我有 3 个计划:

1,在问题表中:

question
------------------------------------
id title   content  ...       tags
------------------------------------
1  aaa     bbb      ...       tag1,tag2,tag3 (use , to split more tags)  

2、在标签表中并拆分:

tags
------------------------------------
id tag 
------------------------------------
1  tag1,tag2,tag3  (use , to split more tags)

3、在标签表中:

tags
------------------------------------
id tag 
------------------------------------
1  tag1
2  tag2
3  tag3 

我认为方案 3 更好,但你的意见是?

对于这个实现还有其他好的想法吗?

感谢您的帮助:)

【问题讨论】:

标签: database database-design tags


【解决方案1】:

这些模式被称为mysqliciousscuttletoxi(从最小到最规范化)。

它们都有其优点和缺点。您可以在这里阅读相当不错的分析:

http://forge.mysql.com/wiki/TagSchema (WayBackMachine Version)

请注意,mysqlicious 在很大程度上取决于您的数据库有效执行FULLTEXT 搜索的能力。

这意味着对于 MySQLInnoDB 以及其他一些系统来说这是非常不切实际的。

【讨论】:

    【解决方案2】:

    标签和内容的关系是many-to-many。也就是说,一个标签可以关联多个内容单元,一个内容单元可以关联多个标签。

    要在数据库中实现这一点,您可以使用名为ContentTags 的辅助表。 ContentContentTags 的关系是一对多的; TagsContentTags 的关系是一对多的。

    #Tags Table
    Id   Text
     1  'Tag1'
     2  'Tag2'
     3  'Tag3'
    
    
    #Content Table
    Id   Content
     1   "some content"
     2   "other content"
     3   "more content"
    
    #ContenTags Table
    ContentId TagId
    1         1
    1         2
    2         1
    2         2
    2         3
    3         1
    

    可以看到,关系体现的很清楚(内容1与标签1、2相关联;内容2与标签1、2、3相关联;内容3只与标签1相关联)

    【讨论】:

      【解决方案3】:

      取决于您希望数据的标准化程度。

      首先,当我在一个不唯一的表中看到“id”列时,我会感到畏缩。至少将该列重命名为“question_id”。

      其次,这取决于您是否想要快速列出所有定义的标签。在这种情况下,您需要一个单独的标签表来定义可能的标签集,然后在问题和标签之间提供一个提供多对多关联的中间表。

      【讨论】:

        【解决方案4】:

        正确的做法是创建一对多关系,即一个注释和多个标签。来自维基

        在数据库技术中,当一个实体与另一个实体中的许多事件相关时,就会出现一对多(也称为对多)关系。例如,一个俱乐部有很多成员。

        而数据库设计中的主要概念是Database normalization

        所以我会这样做。

        comments
        ------------------------------------
        id_comment title  content 
        ------------------------------------
        12         aaa     bbb
        
        tags
        ------------------------------------
        id_tag comment_id tag 
        ------------------------------------
        1      12         tag1
        2      12         tag2
        3      12         tag3 
        

        【讨论】:

        • 这种设计会在tag字段中大量冗余,因为很多评论共享相同的标签。例如,我们可能有 100 万个 cmets 被标记为“tag1”。顺便说一句,如果我接受冗余,那么我看到另一个问题:在 tags 表中同时放置 id_tagtag 没有用。我们只需要标签,如果这个表已经有comment_id,就不需要id_tag
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        相关资源
        最近更新 更多