在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 , ';')))
我喜欢第二种非共同的方式,但我不确定这些方式是否比共同方式更好..你能帮我做决定吗?有没有更好的解决方案?
提前致谢
答案 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)
有链接表
虽然您可以按照您希望的方式存储值,但您可能希望在未来一段时间内更改这些值。在您的具体示例中,我可以看到可能有更多信息特定于处理任务的技术人员,例如花费的总时间(仅作为示例,可能希望在其他地方存储日志)
希望这会有所帮助