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

标签 mysql join

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

相关文章:

apache-spark - Python Spark 连接两个数据帧并填充列

MySQL 连接和内部选择

MySQL JOIN 独立于 WHERE 子句

php - 在重复用户名末尾连接增量 INT

php - 查询两个表,选择两个字段匹配的数据

mysql - 我可以将 2 个不同的查询(返回单个记录)合并到一个返回单个记录的查询中吗?

sql - 如何从 CSV 获取 SQL LOAD DATA 以在加载时遵循列类型?

mysql - ORA-02070 : database [MySQL] does not support subqueries in this context. - 甲骨文

select - MySql - 选择查询 - 连接

mysql - 基于另一个计数的计数 - MySQL