在 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/