【问题标题】:Storing Tags in Database. Store tag once or many times?在数据库中存储标签。存储标签一次还是多次?
【发布时间】:2009-09-26 10:28:23
【问题描述】:

我想进一步澄清在数据库中存储标签的毒性方法——在 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语句来确定它是否存在,对吗?

我们将不胜感激。我最近因为一起黑客和索引而烧伤了我的手指,想开始正确地学习基础知识。

【问题讨论】:

  • 在您的第二个解决方案中,您实际上并不需要标签表,只需将标签保存在您的 ItemTag 表中而不是 TagID 中。不过我会使用第一个解决方案。

标签: sql mysql database


【解决方案1】:

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

如果您因为索引而烫伤手指 - 您应该始终检查查询是如何执行的(对于 mysql,它是 EXPLAIN/DESCRIBE SELECT)。

【讨论】:

    【解决方案2】:

    如果“Fish”和“Fish”是同一个标签,您可能应该在Tag 表中只使用一次。

    所以,我会采用您的第一个解决方案——实际上,这意味着在您的insert 之前执行select,以确定标签是否已经存在;并且,如果它存在,则使用其已经存在的TagID 来链接项目和标签之间的链接,在ItemTag 表中。

    其实这就是ItemTag存在的原因:它是一个关联表,存储了item和tag的对应关系:每个item可以有多个tag,每个tag可以有多个item .

    顺便说一句,这也将使获取附加到特定标签的项目列表变得更容易。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • -1:重复标签和使用标签表使用 item_ids 会使搜索真正消耗资源,因为搜索将通过比较字符串而不是整数来进行,这要慢得多。
      • @Eimantas:我不建议重复标签。我只是说 if 标记要重复,你可以删除一个表。
      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多