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

Koe*_*err 9 database tags database-design

我有3个计划:

1,在问题表中:

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

2,在标签表和拆分中:

tags
------------------------------------
id tag 
------------------------------------
1  tag1,tag2,tag3  (use , to split more tags)
Run Code Online (Sandbox Code Playgroud)

3,在标签表中:

tags
------------------------------------
id tag 
------------------------------------
1  tag1
2  tag2
3  tag3 
Run Code Online (Sandbox Code Playgroud)

我认为计划3更好,但您的意见是什么?

这个实现的任何其他好主意?

谢谢您的帮助 :)

Qua*_*noi 12

调用这些模式mysqlicious,scuttle并且toxi(从最小到最正常化).

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

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

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

这意味着,MySQLInnoDB和其他一些系统这是非常不切实际的.


Esc*_*alo 6

标签和内容之间的关系是多对多的.这意味着一个标签可以与几个内容单元相关联,并且一个内容单元可以与多个标签相关联.

要在数据库中实现此功能,可以使用名为的辅助表ContentTags.Contentto 的关系ContentTags是一对多的; Tagsto 的关系ContentTags是一对多的.

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

如您所见,关系清楚地反映出来(内容1与标签1和2相关联;内容2与标签1,2和3相关联;内容3仅与标签1相关联)