我正在尝试设计一个数据库,我将跟踪与出版社相关的不同对象。显而易见的是跟踪所有文章。我想为他们添加一个或多个“标签”。但我不知道如何处理它们。
首先想到的是我正在考虑的映射表包含标签和相应的子标签。另一个将文章映射到那些tad-combination id的映射表。
这是管理它们并用于搜索的最佳方式吗?这个stackoverflow标记问题的工作原理是什么?
答案 0 :(得分:1)
使用链接表解决这是一个经典的多对多情况。
如果标签和子标签相同,那么您有两个核心表Articles
和Tags
,以及一个链接表ArticleTags
。如果您迫切需要区分子标记,那么您有三个核心表和两个链接表,Articles
,Tags
和SubTags
由ArticleTags
和{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