gpt4 book ai didi

mysql - 多对多关系..做一个中间表总是更好吗?

转载 作者:行者123 更新时间:2023-11-29 00:13:18 26 4
gpt4 key购买 nike

在 MySQL 中,我有一个名为“维护”的表和另一个名为“技术人员”的表,其中维护可以由一个或多个技术人员完成......为此,有创建表 Maintenance_Technician 的常用方法,包含记录这对夫妇 (mnt_id, tech_id).. 比起获取数据,我们必须进行双重内部连接...

这里是查询(MT_Mnt_Id 和 MT_Tech_Id)是中间表“Maintenance_Technicians”的字段SELECT * FROM Maintenance INNER JOIN Maintenance_Technicien ON Mnt_Id=MT_Mnt_Id INNER JOIN Technicians ON Tech_Id=MT_Tech_Id

我想知道这是否是最好的方法,如果我最多有 7 名技术人员进行每次维护!

还有许多其他非公共(public)方式,例如:1- 在“维护”表中有 7 个字段,每个技术人员一个,让未使用的字段为空(当少于 7 个技术人员进行干预时)在这种情况下,选择查询将是:SELECT * FROM Maintenance INNER JOIN Technicians ON(Mnt_Tech1_Id=Tech_Id OR Mnt_Tech2_Id=Tech_Id OR Mnt_Tech3_Id=Tech_Id OR Mnt_Tech4_Id=Tech_Id 等。)

2- 将技术人员的 ID 存储在一个字段中,每个 ID 都写在“;”之间例如“;5;10;25;”。选择查询将是这样的:SELECT * FROM Maintenance INNER JOIN Technicians ON (instr(Mnt_Tech_Ids, concat(';', Tech_Id , ';')))

我喜欢第二种非公共(public)方式,但我不确定那些是否比公共(public)方式更好..你能帮我做决定吗?有没有更好的解决方案?

提前致谢

最佳答案

一般来说,多对多的关系最好用额外的表来表示。

您显示的两个替代方案违反了 First Normal Form .但也存在实际问题。

如果您有 7 列,它会使您针对此数据执行的许多类型的查询变得复杂。例如,如果您想为给定的维护添加一名技术人员。您必须弄清楚哪些列(如果有的话)是“未占用”的。如果您使用标准的多对多表,您需要做的就是 INSERT 新技术人员。

7 列方法还意味着您不能设置 UNIQUE 或 FOREIGN KEY 等约束。此外,如果有一天您需要允许 8 名技术人员进行维护,那将变得很麻烦。

使用一串 id 的问题很多。我在这里发布了这个:Is storing a delimited list in a database column really that bad?

使用规范化数据设计的异常(exception)情况是,当您对数据运行过一组固定的查询,并且您想要优化这些查询时。然后你可以为了那些特定的查询小心地使用反规范化

但是如果你有各种各样的查询,你可能会针对相同的数据运行,或者无法预测 future 的需求,那么规范化的数据设计会更加灵活,同时也会给你带来很多数据完整性和查询的优势简单。

关于mysql - 多对多关系..做一个中间表总是更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896081/

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