具有多个连接的巨大查询与多个单个查询

Posted

技术标签:

【中文标题】具有多个连接的巨大查询与多个单个查询【英文标题】:Huge query with multiple joins vs Multiple single queries 【发布时间】:2017-05-25 19:33:49 【问题描述】:

假设有一个实体

public class Subject 

    private int id;
    private String name;
    private List<Teacher> teacher;
    private List<Book> books;
    public int getId() 
        return id;
    
    public void setId(int id) 
        this.id = id;
    
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public List<Teacher> getTeacher() 
        return teacher;
    
    public void setTeacher(List<Teacher> teacher) 
        this.teacher = teacher;
    
    public List<Book> getBooks() 
        return books;
    
    public void setBooks(List<Book> books) 
        this.books = books;
    


对于 Rest API,获取主题详细信息,其中我将提供主题 ID。

然后我需要获取教师列表和书籍列表 在性能方面和灵活性方面哪个更明智。

(1) 带连接的单个查询 (2) 1 次查询用户,1 次查询教师,以 subject_id 作为过滤器,1 次查询以 subject_id 作为过滤器的书籍

请务必考虑性能、实体构建逻辑和对更改的灵活性,例如。在同一个 API 中,用户可以提供一个标志来判断是否包含图书列表作为响应。 以及如何在企业项目中决定使用哪种方法。

【问题讨论】:

一般来说,到数据库的往返次数越少越好,但每当出现不确定性时,一个简单的测试就可以提供答案 唯一的答案是“视情况而定”。 【参考方案1】:

这取决于...

在最坏的情况下,Subject 有多少 Teacher? 在最坏的情况下有多少 BookSubject? 在最坏的情况下有多少Subject? 还有其他链接实体吗?

如果响应为10, 50, 1000, no,则结果可能返回 500 000 行 (10*50*1000)!

你应该考虑笛卡尔积

如果笛卡尔积不成问题,联接会更快。

【讨论】:

以上是关于具有多个连接的巨大查询与多个单个查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有多个连接的 SQL 查询并使用休眠计数

如何在单个 JDBC 连接中执行多个 JPA 查询

具有多个带有 AND 类型逻辑连接的 where IN 子句的配置单元查询

Rails 查询具有关联条件的多个主键

单个查询从具有不同列的多个表中获取记录

具有多个查询的NodeJS mysql连接池