在考虑我正在开发的 Web 应用程序的最佳 mysql 数据库结构时,需要使用标签进行项目分类,我决定选择最常见的方法:在项目之间使用 tag_map 数据库表表和标签表,例如我分别有一个客户表和一个标签表:
Example of Clients table:
id,name
0,jack
1,john
2,anna
Example of Tags table:
id,tag
0,likes_oranges
1,likes_cars
2,likes_vacations
Example of tag_map
id,client_id,tag_id
0,0,0 (jack likes oranges)
1,0,1 (jack likes cars)
2,0,2 (jack likes vacations)
3,1,0 (john likes oranges)
4,1,1 (john likes cars)
5,2,1 (anna likes cars)
考虑到这种分布,假设我们的客户表可以增长到 100 万行以上,我的问题是:查询所有没有“喜欢假期”标签的客户的最佳方法是什么?
我的第一选择是使用:
select name from clients where id not in (select client_id from tag_map where tags.tag = 'likes vacations')
但是当客户端和 tag_map 表超过数千条记录时,此查询非常慢。
我也尝试将 tag_map 左连接到客户端表,但是由于所有客户端都分配了多个标签,因此使用NOT NULL也不起作用,因为我只想计算那些没有特定标签 id 的人(喜欢假期)。
请就此类要求的最佳选择声明提出建议。
提前致谢!
ķ