多对多的关系..做中间表总是更好吗?

时间:2014-05-27 18:05:16

标签: mysql join

在MySQL中,我有一个名为" maintenance"另一个叫做技术人员"维护可以由一个或多个技术人员完成...为此,有一种创建表维护技术人员的通用方式,包含与这对夫妇的记录(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名技术人员来进行每次维护!

还有许多其他非共同方式,例如: 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 etc..)

2-将技术人员的ID存储在一个字段中,每个字段写在';'例如&#34 ;; 5; 10; 25;"。选择查询将如下所示: SELECT * FROM Maintenance INNER JOIN Technicians ON (instr(Mnt_Tech_Ids, concat(';', Tech_Id , ';')))

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

提前致谢

2 个答案:

答案 0 :(得分:1)

通常,最好使用额外表来表示多对多关系。

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

如果您有7列,则会对您对此数据执行的许多类型的查询造成复杂化。例如,如果要将技术人员添加到给定的维护中。你必须弄清楚哪些列(如果有的话)是“未被占用的”。如果您使用标准的多对多表格,那么您需要做的就是INSERT新技术人员。

7列方法还意味着您无法设置UNIQUE或FOREIGN KEY等约束。此外,如果有一天你需要让8位技术人员进行维护,那就麻烦了。

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

使用规范化数据设计的例外情况是,您有一组固定的查询,您曾经对数据运行过,并且您希望优化这些查询。然后,您可以谨慎使用非规范化以进行某些查询。

但是如果你有各种各样的查询可能会针对相同的数据运行,或者无法预测未来的需求,那么标准化的数据设计会更加灵活,同时也会为您提供数据完整性和查询的诸多优势简单。

答案 1 :(得分:0)

在我看来,拥有链接表要好得多。稍后您可能想要添加特定于链接的其他信息,然后必须重新设计所有内容。

有链接表

  1. 明确表示有一对多
  2. 让您轻松强制执行/验证关系
  3. 稍后留出增长空间
  4. 虽然您可以按照您希望的方式存储值,但您可能希望在未来一段时间内更改这些值。在您的具体示例中,我可以看到可能有更多信息特定于处理任务的技术人员,例如花费的总时间(仅作为示例,可能希望在其他地方存储日志)

    希望这会有所帮助