我有一个“帖子”表.每个帖子记录可以有一个或多个标签.
如果我将标记存储到单个列中,作为逗号分隔的字符串,我可以轻松找到标记为“Abc”并标记为“Def”的帖子,甚至可以进行部分匹配.
如果我将标记存储到单个列中,作为逗号分隔的字符串,我可以轻松找到标记为“Abc”并标记为“Def”的帖子,甚至可以进行部分匹配.
我正在使用sqlite和这个方法的“FTS”表,它工作正常,但有人告诉我这是一个不好的做法,我应该将标签存储在不同的表中并使用JOIN.
如果我将标记存储在不同的表中并在这两个表之间创建关系,如何在单个查询中找到标记为“Abc”和标记为“Def”的帖子?可能吗?
这确实是糟糕的设计实践.
由于您需要对列值执行字符串操作以分隔标记,因此性能会降低.所以索引不能使用.这违反了数据库设计的规范化规则.
一个更好的设计
tags table ---------- id name posts table ----------- id title body ... post_tags table --------------- post_id tag_id
要获得所有帖子都有两个标签
select p.id,p.title,p.body from posts p join post_tags pt on pt.post_id = p.id join tags t on pt.tag_id = t.id where t.name in ('abc','def') group by p.id,p.body having count(distinct t.id) = 2