【发布时间】:2018-09-27 17:04:45
【问题描述】:
我正在尝试对 item 和 tag 表之间的多对多关系建模。我有一个连接表tagitemjoin 来完成它。例如:
id | tag_id | item_id
-----------------------
1 | 1 | 1
2 | 2 | 1
3 | 2 | 2
4 | 3 | 1
5 | 3 | 2
6 | 3 | 3
7 | 4 | 2
8 | 4 | 3
9 | 5 | 3
代表以下连接
| item: 1 | item: 2 | item: 3
-------------------------------------
tag: 1 | * | |
tag: 2 | * | * |
tag: 3 | * | * | *
tag: 4 | | * | *
tag: 5 | | | *
我希望根据涉及tags 的任意布尔表达式查询items 的列表,例如:
tag1 OR ((NOT tag2) AND tag3)
由于我需要实现 3 个基本运算符,因此我能够实现 OR,如下所示:
SELECT i.* FROM item i
INNER JOIN tagitemjoin j
ON (j.item_id = i.id)
WHERE (j.tag_id = 3) OR (j.tag_id = 4) GROUP BY i.id
而且我确信我也可以以某种方式使用COUNT 实现NOT 和AND 运算符。不过……
如何扩展此定义以处理任意布尔表达式?使用这种连接表方法可以做到这一点吗?
如果没有,我可能会使用 NoSQL 方法将 tags 作为集合存储在 items 字典本身中,因为该方法更直接。
【问题讨论】: