我有一个“帖子”表。每个帖子记录可以有一个或多个标签。 如果我将标签存储到单个列中,作为逗号分隔的字符串,我可以轻松找到标签为“Abc”并标记为“Def”的帖子,甚至可以进行部分匹配。
我正在使用sqlite和这个方法的“FTS”表,它运行正常,但是有人告诉我这是一个不好的做法,我应该将标签存储在另一个表中并使用JOIN。 如果我将标记存储在不同的表中并在这两个表之间创建关系,如何在单个查询中找到标记为“Abc”和标记为“Def”的帖子?有可能吗?
答案 0 :(得分:0)
如果您想对数据库进行规范化,我肯定会将此信息拆分为多个表。我已经编写了一个架构和一些示例查询,展示了如何将数据拉出来。您可以在此处查看:http://sqlfiddle.com/#!9/48ebb/15
基本上你会有3个表:
通过这种方式,您永远不会存储两次相同的标记信息。
最后,这是来自上面发布的sqlfiddle的示例查询:
-- find all posts with the tags associated with them
SELECT DISTINCT POST.*, GROUP_CONCAT(tagName SEPARATOR ', ') AS associatedTags
FROM POST
INNER JOIN POSTTAGS ON POST.postId = POSTTAGS.postId
INNER JOIN TAG ON TAG.tagId = POSTTAGS.tagId