考虑此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] 删除。
我来说两句