在数据库中存储标签。存储标签一次或多次?

时间:2009-09-26 10:28:23

标签: sql mysql database

我想进一步澄清在数据库中存储标签的toxi方法 - 在SO的其他地方提到。

数据库架构是:

Table: Item
Columns: ItemID, Title, Content

Table: Tag
Columns: TagID, Title

Table: ItemTag
Columns: ItemID, TagID

这可能是一个愚蠢的问题(但我不知道答案)......表标签中的每个条目都应该有一个唯一的标题。即我只存储一次标签或每次使用时都存储它?

为了说明,下面两个表格中的哪一个最终应该是:

TagID     Title
1         Fish
2         Cat
3         Dog

TagID     Title
1         Fish
2         Fish
3         Cat
4         Fish
5         Dog
6         Cat

如果使用第一个表,在输入标签之前我首先必须运行sql语句以查明它是否存在,对吗?

任何帮助将不胜感激。由于黑客攻击和编制索引,最近我的手指被烧伤,想要开始正确的基础知识。

3 个答案:

答案 0 :(得分:4)

基础是你需要存储像你在第一种情况下显示的标签。检查标签是否存在是好的(因为在现有标签的第二种情况下,您的数据库将返回与标签的外观一样多的行)并且适用于按标签检索项目(选择项目ID一个标签ID比选择项目更好) id由一组具有相同表征意义的tag_id组成。)

如果你因为索引而烧伤了手指 - 你应该总是检查查询是如何执行的(对于mysql它是EXPLAIN/DESCRIBE SELECT)。

答案 1 :(得分:2)

如果“Fish”和“Fish”是相同的标记,则您应该只在Tag表中使用一次。

所以,我会选择你的第一个解决方案 - 实际上,这意味着在你的select之前做insert,以确定标签是否已经存在;如果存在,则在TagID表中使用已存在的ItemTag作为项目与标记之间的链接。

实际上,这就是ItemTag存在的原因:它是一个关联表,它存储项目和标签之间的对应关系:对于每个项目,您可以有多个标签,并且,对于每个标签,您可以有多个项目

这也将使得更容易获得附加到特定标签的项目列表。

答案 2 :(得分:1)

你应该只在标签表中有一次标签; ItemTag表的重点是为您提供一个n:m关联(每个项目都有多个标签,每个标签属于多个项目。)

如果您要重复标记标题,可以通过让Tag表立即使用ItemID来简化结构,而不是标记ID。