gpt4 book ai didi

mysql - 多对多到多对多 : is there a need for the middle join?

转载 作者:行者123 更新时间:2023-11-30 21:34:40 25 4
gpt4 key购买 nike

将问题简化为基础,我们有三个表组件程序用户,它们以多对多关系关联两个中间表 program_componentsuser_programs

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 期望得到什么,以及从数据库的角度来看哪个查询有意义

为了可读性,我建议第一个版本带有额外的 JOIN,因为它促进了跨多个表的连接意图,遍历通用的 programs 表。然而,我经常被告知太多的连接往往是错误的处理方式。[1]

文档中是否有针对此类查询的任何建议?


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

最佳答案

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

在编写 SQL 查询时,检查检查了多少行总是有用的。通过加入程序表,您必须检查它的 ID 行,即使您不需要它的任何信息也是如此。

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

关于mysql - 多对多到多对多 : is there a need for the middle join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54570331/

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