多对多关系中的外键
Foreign keys in many-to-many relationships
下图是我正在设计的一个软件测试结果数据库的一部分:
design
我的问题与 table fault
有关。我是否需要与 table fault
中的 table configuration
相关的外键才能进行查询,例如 return与所有三个 table 相关的数据(configuration
与 software
相关,fault
与以下两者相关:software
和 configuration
).或者应该以不同的方式设计关系?
如果 table 之间存在一对多关系,MySQL Workbench 会自动在 table 中创建所需的外键。但这是我使用多对多关系时自动创建的 MySQL Workbench
提前致谢。
编辑:
我通过 phpmyadmin 手动添加了一些数据。但是,我正在尝试执行此查询:
SELECT software_version, configuration_name, actCritical
FROM software
LEFT JOIN configuration_has_software ON software.software_id = configuration_has_software.software_id
LEFT JOIN configuration ON configuration.configuration_id = configuration_has_software.configuration_id
LEFT JOIN software_has_fault ON fault.fault_id = software_has_fault.fault_id
LEFT JOIN software ON software.software_id = software_has_fault.software_id;
我收到一个错误:
1066 - 不唯一 table/alias:'software'
我走对了路吗?
编辑 2:
其实我开始质疑我的设计。我不认为我能够使用此设计将特定故障与特定配置相关联,因为配置和故障之间没有直接关系。我应该设计不同的吗?
不!它会破坏 3NF。如果您不知道它是什么 and/or 为什么您可能需要更多地研究 ER(实体关系模型)中的关系。这是一个非常复杂的话题,我无法在这里解释。但是互联网上有很多文档。
要修复您的错误,请尝试以下操作:
您两次加入table软件,但没有加入故障table。
SELECT software_version, configuration_name, actCritical
FROM software
LEFT JOIN configuration_has_software
ON software.software_id = configuration_has_software.software_id
LEFT JOIN configuration
ON configuration.configuration_id = configuration_has_software.configuration_id
LEFT JOIN software_has_fault
ON software.software_id = software_has_fault.software_id
LEFT JOIN fault
ON software_has_fault.fault_id = fault.fault_id ;
我假设您已经使用 LEFT JOIN 来列出软件,即使这些软件没有配置(或)存在故障(如果不是这种情况,您可以用 INNER JOIN 替换)
下图是我正在设计的一个软件测试结果数据库的一部分: design
我的问题与 table fault
有关。我是否需要与 table fault
中的 table configuration
相关的外键才能进行查询,例如 return与所有三个 table 相关的数据(configuration
与 software
相关,fault
与以下两者相关:software
和 configuration
).或者应该以不同的方式设计关系?
如果 table 之间存在一对多关系,MySQL Workbench 会自动在 table 中创建所需的外键。但这是我使用多对多关系时自动创建的 MySQL Workbench
提前致谢。
编辑:
我通过 phpmyadmin 手动添加了一些数据。但是,我正在尝试执行此查询:
SELECT software_version, configuration_name, actCritical
FROM software
LEFT JOIN configuration_has_software ON software.software_id = configuration_has_software.software_id
LEFT JOIN configuration ON configuration.configuration_id = configuration_has_software.configuration_id
LEFT JOIN software_has_fault ON fault.fault_id = software_has_fault.fault_id
LEFT JOIN software ON software.software_id = software_has_fault.software_id;
我收到一个错误:
1066 - 不唯一 table/alias:'software'
我走对了路吗?
编辑 2:
其实我开始质疑我的设计。我不认为我能够使用此设计将特定故障与特定配置相关联,因为配置和故障之间没有直接关系。我应该设计不同的吗?
不!它会破坏 3NF。如果您不知道它是什么 and/or 为什么您可能需要更多地研究 ER(实体关系模型)中的关系。这是一个非常复杂的话题,我无法在这里解释。但是互联网上有很多文档。
要修复您的错误,请尝试以下操作: 您两次加入table软件,但没有加入故障table。
SELECT software_version, configuration_name, actCritical
FROM software
LEFT JOIN configuration_has_software
ON software.software_id = configuration_has_software.software_id
LEFT JOIN configuration
ON configuration.configuration_id = configuration_has_software.configuration_id
LEFT JOIN software_has_fault
ON software.software_id = software_has_fault.software_id
LEFT JOIN fault
ON software_has_fault.fault_id = fault.fault_id ;
我假设您已经使用 LEFT JOIN 来列出软件,即使这些软件没有配置(或)存在故障(如果不是这种情况,您可以用 INNER JOIN 替换)