和多对多关系中的条件

时间:2012-07-04 17:38:19

标签: sql postgresql indexing many-to-many relational-division

假设我有三个表,一个用户表,一个包含大约500个不同项的表,以及相应的连接表。我想做的是:

select * from users u join items_users iu on iu.user_id = u.id
where iu.item_id in (1,2,3,4,5)
and u.city_id = 1 limit 10;

除了IN条件之外,我想找到 all 相应项目的用户。如果它有帮助,假设一次搜索的项目的最大数量将是5.此外,我正在使用Postgres,并且不介意去标准化它是否有帮助因为它是一个只读系统并且速度最高优先级。

1 个答案:

答案 0 :(得分:0)

这是关系分裂的另一个案例。我们已经汇集了大量的查询来处理这类问题here

在这种情况下,有5个或更多项目,我可能会尝试:

SELECT u.*
FROM   users AS u
WHERE  u.city_id = 1
AND EXISTS (
   SELECT *
   FROM   items_users AS a
   JOIN   items_users AS b USING (user_id)
   JOIN   items_users AS c USING (user_id)
   ...
   WHERE  a.user_id = u.user_id
   AND    a.item_id = 1
   AND    b.item_id = 2
   AND    c.item_id = 3
   ...
   )
LIMIT 10;

这是我测试中最快的,它符合items_users上多个条件的要求,只返回user中的列。

了解indexes at the linked answer。这些对性能至关重要。 由于您的表是只读的,我还会CLUSTER两个表,以最小化必须访问的页面数。如果没有别的,CLUSTER items_users(user_id, item_id)上使用多列索引。