联接多个可能的表

马克·哈迪

考虑此SQL Fiddle上的以下架构如您所见,它遵循用于对多态关联进行建模的超表架构。请记住,foo,bar和baz表在实际实现中彼此非常不同。

我面临的问题是我需要检索给定所有者及其相应目标的所有活动,我的第一个想法是使用多个LEFT OUTER JOINS:

SELECT *
FROM activities
LEFT OUTER JOIN foo ON activities.target_id = foo.activitable_id
LEFT OUTER JOIN bar ON activities.target_id = bar.activitable_id
LEFT OUTER JOIN baz ON activities.target_id = baz.activitable_id
WHERE activities.owner_id = 1

考虑到我只联接3个表,每个表只有一行,所以此查询很好,但是当架构增长到8个联接(每个表有1万行)时,会对性能产生巨大影响。

所以我的问题是,有什么方法可以通过更快的查询实现我想要的?

戈登·利诺夫

不必对性能产生巨大影响。您已经定义了数据结构,每个表只有一个索引,一个在主键上。这意味着联接的效率不如预期。

同样,鉴于您的结构,我认为您不希望activitable_id在任何表中重复因此,应该定义每个表,如下所示:

CREATE TABLE foo (
  id serial primary key,
  name varchar(20),
  activitable_id int UNIQUE,
  FOREIGN KEY (activitable_id) REFERENCES activitables(id)
);

声明activitable_id为唯一解决了这两个问题,因为它在列上创建了唯一索引,该索引既增强了唯一性又应提高了性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章