我有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更好,但您的意见是什么?
此实施的其他任何好主意?
感谢您的帮助:)
答案 0 :(得分:12)
这些模式称为mysqlicious
,scuttle
和toxi
(从最小到最规范化)。
他们都有自己的利弊。你可以在这里阅读很好的分析:
http://forge.mysql.com/wiki/TagSchema (WayBackMachine Version)
请注意,mysqlicious
在很大程度上取决于您的数据库是否有效执行FULLTEXT
次搜索。
这意味着对于MySQL
InnoDB
以及其他一些系统来说,这是非常不切实际的。
答案 1 :(得分:6)
标签和内容之间的关系为many-to-many。这意味着一个标签可以与多个内容单元相关联,一个内容单元可以与多个标签相关联。
要在数据库中实现此功能,可以使用名为ContentTags
的辅助表。 Content
与ContentTags
的关系是一对多关系; Tags
与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
如您所见,关系清晰地反映出来(内容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