假设您为电视节目创建imdb类型的网站。您有Show
个附加episodes
和一堆people
现在我通过people
表格将episodes
与contribution
相关联 - 但如果我想列出所有节目的列表,我必须经历剧集。
由于此查询需要很长时间,因此我考虑将show_id
添加到contributions
表中。这种常见的做法是提高性能还是我还没有想到的其他方法?
答案 0 :(得分:2)
由于此查询需要很长时间
您是否运行过SQL解释计划来说明为何会出现这种情况?什么是正在运行的实际SQL查询,您是在做其中的订购或运行子查询等事情吗?
如果我理解你的结构,那就是这样的:
|people| n---1 |contribution| 1---n |episodes| n---1 |shows|
sql select of sort:
select distinct s.name
from shows s,
episodes e,
contribution c
where c.people_id = <id>
and c.episode_id = e.id
and e.show_id = s.id
除非表上没有索引或表格很大,否则应该没有性能问题。
答案 1 :(得分:0)
以下是使用where id in ( ... )
选择特定人物出现的所有节目的方式
Shows.where(id: Contribution.select("show_id")
.join(:episodes)
.where(person_id: personId)
.group("episodes.show_id"))
您可能还想尝试exists
Shows.where("EXISTS(SELECT 1 from contributions c
join episodes e on e.id = c.episode_id
where c.person_id = ? and e.show_id = shows.id)")