考虑下面关于这个SQL Fiddle的模式。如您所见,它遵循用于建模多态关联的超表模式。请记住,在实际实现中,foo、bar和baz表是非常不同的。
我面临的问题是,我需要检索给定所有者及其对应目标的所有活动,我的第一个想法是使用多个左外部联接:
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个表与每个表上的10k行连接时,会对性能产生巨大的影响。
所以我的问题是,有什么方法可以通过更快的查询来实现我的目标?
最佳答案
不需要有巨大的性能影响。您定义的数据结构中,每个表只有一个索引,即主键上的索引。这意味着连接的效率比它们可能的要低。
另外,考虑到您的结构,我认为您不希望在任何表中重复activitable_id
s。因此,每个表都应该定义如下:
CREATE TABLE foo (
id serial primary key,
name varchar(20),
activitable_id int UNIQUE,
FOREIGN KEY (activitable_id) REFERENCES activitables(id)
);
声明
activitable_id
是唯一的可以解决这两个问题,因为它在列上创建了一个唯一的索引,这两个索引都可以实现唯一性,并且应该提高性能。关于sql - 联接多个可能的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23888435/