gpt4 book ai didi

sql - 加入多个可能的表

转载 作者:行者123 更新时间:2023-11-29 12:12:49 25 4
gpt4 key购买 nike

考虑关于此 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 个连接,每个表有 10k 行时,会对性能产生巨大影响。

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

最佳答案

不需要对性能产生巨大影响。你已经定义了你的数据结构,每个表只有一个索引,一个在主键上。这意味着联接的效率低于它们应有的效率。

此外,考虑到您的结构,我认为您不希望在任何表中出现重复的 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 声明为唯一可以解决这两个问题,因为它会在列上创建一个唯一索引,既强制唯一性又应该提高性能。

关于sql - 加入多个可能的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23888435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com