如何为StackOverflow问题标签设计架构?

时间:2010-09-16 23:56:42

标签: database database-design tags

我有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更好,但您的意见是什么?

此实施的其他任何好主意?

感谢您的帮助:)

4 个答案:

答案 0 :(得分:12)

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

他们都有自己的利弊。你可以在这里阅读很好的分析:

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

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

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

答案 1 :(得分:6)

标签和内容之间的关系为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相关联)

答案 2 :(得分:1)

取决于您希望数据的规范化程度。

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

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

答案 3 :(得分:1)

正确的方法是创建一对多关系,即您有一个注释和多个标签。来自WIKI

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

数据库设计的主要概念是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