在数据库中存储标签的最有效方法是什么?

Log*_*man 132 database tags tagging database-design

我在我的网站上实现了一个类似于stackoverflow使用的标记系统,我的问题是 - 什么是存储标记的最有效方法,以便可以搜索和过滤它们?

我的想法是这样的:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID
Run Code Online (Sandbox Code Playgroud)

这太慢了吗?有没有更好的办法?

Sim*_*rfe 185

一个项目将有许多标签.一个标签将属于许多项目.这对我来说意味着你很可能需要一个中间表来克服多对多的障碍.

就像是:

表:项目
列:Item_ID,Item_Title,Content

表:标签
列:Tag_ID,Tag_Title

表:Items_Tags
列:Item_ID,Tag_ID

可能是你的网络应用程序非常受欢迎,并且需要在路上进行非规范性处理,但是过早地混淆海水是毫无意义的.

  • @Thunder:假设一个标签可能只属于一个类别,我会创建一个由category_id和category_name组成的TagCategory表.从那里,我会将一个category_id字段附加到Tags表并对其执行连接. (3认同)
  • 相关:http://stackoverflow.com/questions/20856/how-do-you-recommend-implementing-tags-or-tagging/20871#20871 (2认同)

Rob*_*edy 107

您应该阅读Philipp Keller关于标记数据库模式的博客文章.他尝试了几个,他报告的结果,无论是在轻松构建常用查询的条件,并在性能方面.标签数量,标记项目数量和每个项目的标签数量都是因素.这些职位来自2005年; 从那时起我就不知道有任何更新.

  • 我认为这是最好的答案.它基于实际测试和研究,而不是像大多数其他答案一样的假设. (19认同)
  • 答案中的链接似乎不起作用.在http://vtidter.blogspot.be/2014/02/database-schema-for-tags.html上找到了一份副本 (2认同)

Nei*_*ell 7

实际上我认为对标签表进行去标准化可能是更好的前进方式,具体取决于规模.

这样,tags表只有tagid,itemid,tagname.

您将获得重复的标记名,但它使得为特定项添加/删除/编辑标记更加简单.您不必创建新标记,删除旧标记的分配并重新分配新标记,只需编辑标记名即可.

要显示标签列表,您只需使用DISTINCT或GROUP BY,当然您也可以计算标签的易用次数.


Dmi*_*dov 6

如果您不介意使用一些非标准的东西,Postgres 9.4 及更高版本可以选择存储 JSON 文本数组类型的记录。

您的架构将是:

Table: Items
Columns: Item_ID:int, Title:text, Content:text

Table: Tags
Columns: Item_ID:int, Tag_Title:text[]
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅 Josh Berkus 的这篇精彩文章: http://www.databasesoup.com/2015/01/tag-all-things.html

还有更多不同的选项,对性能进行了彻底的比较,上面建议的选项总体来说是最好的。