数据库中的标签管理

时间:2015-03-27 09:10:07

标签: database-design tags

我正在尝试设计一个数据库,我将跟踪与出版社相关的不同对象。显而易见的是跟踪所有文章。我想为他们添加一个或多个“标签”。但我不知道如何处理它们。

首先想到的是我正在考虑的映射表包含标签和相应的子标签。另一个将文章映射到那些tad-combination id的映射表。

这是管理它们并用于搜索的最佳方式吗?这个stackoverflow标记问题的工作原理是什么?

2 个答案:

答案 0 :(得分:1)

使用链接表解决这是一个经典的多对多情况。

如果标签和子标签相同,那么您有两个核心表ArticlesTags,以及一个链接表ArticleTags。如果您迫切需要区分子标记,那么您有三个核心表和两个链接表,ArticlesTagsSubTagsArticleTags和{TagSubTags链接{1}}。

单一级别的标签更易于管理,并且性能更高,不管它是否真正重要将取决于多种因素。如果子标签的命名非常相似,那么如果所有标签都在一个表中,like搜索仍会检索它们。

要按标签搜索文章,您可能会使用这样的SQL:

SELECT a.* FROM Articles a JOIN ArticleTags at ON a.Id = at.ArticleId JOIN
Tags t ON at.TagId = t.Id WHERE t.TagName Like '%your search criteria%'

如果您在任何公共环境中构建这样的SQL,请 非常 小心确保正确绑定参数以避免SQL注入攻击link1 {{ 3}} link2

如果你有不同的子标签,那么你的SQL需要是这样的

SELECT a.* FROM Articles a JOIN ArticleTags at ON a.Id = at.ArticleId 
JOIN Tags t ON at.TagId = t.Id JOIN TagSubTags tst ON t.Id= tst.TagId
JOIN SubTags st ON tst.SubTagId = st.Id
WHERE t.TagName Like '%your search criteria%'
OR st.SubTagName Like '%your search criteria%'

答案 1 :(得分:-1)

如果您使用PostgreSQL作为数据库,则可以使用Array类型在一列中存储多个值。我在其中一个演讲中介绍了这一点,请参阅此处的幻灯片:https://talks.bitexpert.de/phpuk15-postgres-nosql/#/12