Mysql 多对多到多对多:是否需要中间连接?

Mysql 多对多到多对多:是否需要中间连接?,mysql,many-to-many,Mysql,Many To Many,将问题简化为基本问题,我们有三个表组件、程序和用户,它们与两个中间表程序_组件和用户_程序存在多对多关系 simplified table structure users - id (primary key) - (...) user_programs - user_id (foreign key to users id) - program_id (foreign key to programs id) programs - id (primary key) - (...) progr

将问题简化为基本问题,我们有三个表组件程序用户,它们与两个中间表程序_组件用户_程序存在多对多关系

simplified table structure

users
- id (primary key)
- (...)

user_programs
- user_id (foreign key to users id)
- program_id (foreign key to programs id)

programs
- id (primary key)
- (...)

program_components
- program_id (foreign key to programs id)
- component_id (foreign key to components id)

components
- id (primary key)
- (...)
我们正在云管理系统中集成程序组件的用户权限。我无意中发现了一个又一个包含许多连接的查询,我想知道是否需要中间表

SELECT users.id, components.id FROM components
JOIN program_components ON c.id = program_components.component_id
JOIN programs ON program_components.program_id = programs.id
JOIN user_programs ON programs.id = user_programs.program_id
JOIN users ON user_programs.user_id = users.id
WHERE (...)
中间连接是必要的,还是可以简化为

SELECT users.id, components.id FROM components
JOIN program_components ON c.id = program_components.component_id
JOIN user_programs ON program_components.programId = user_programs.programId
JOIN users ON user_programs.user_id = users.id
WHERE (...)
从我的测试中,它们都产生了相同的数据集,这是我完全期待的。 问题更多的是MySQL希望得到什么,以及从数据库的角度来看,哪个查询是有意义的

为了可读性,我建议第一个版本使用额外的连接,因为它促进了跨多个表连接的意图,通过公共程序表。然而,我经常被告知,过多的连接往往是错误的方式

文档中是否有关于此类查询的建议



[1] 我们正在进行重构,以包括一个适当的user_components表,这将免除我们的这些查询,并为我们提供更多的灵活性,但这超出了问题的范围。

因为您只需要用户和组件表的ID,所以没有理由加入programs表。实际上,这样做是不可取的,因为这可能会导致明显的性能下降

在编写SQL查询时,检查检查了多少行总是很有用的。通过加入programs表,您必须检查它的ID行,即使您不需要从中获取任何信息


有关更多信息,您可能有兴趣阅读,其中解释了一些提高查询性能的方法

,因为您只需要来自用户和组件表的ID,因此没有理由加入程序表。实际上,这样做是不可取的,因为这可能会导致明显的性能下降

在编写SQL查询时,检查检查了多少行总是很有用的。通过加入programs表,您必须检查它的ID行,即使您不需要从中获取任何信息


有关更多信息,您可能有兴趣阅读,其中解释了一些提高查询性能的方法

仅对有助于结果或结果筛选的表进行联接。仅对有助于结果或结果筛选的表进行联接。