【问题标题】:Foreign keys in many-to-many relationships多对多关系中的外键
【发布时间】:2016-12-30 16:35:23
【问题描述】:

下图是我正在设计的软件测试结果数据库的一部分: design

我的问题与fault 表有关。我是否需要一个与我的表 fault 中的表 configuration 相关的外键,以便进行查询,例如,将返回与所有三个表相关的数据(configurationsoftwarefault 与两者相关:softwareconfiguration)。还是应该以不同的方式设计关系?

如果表之间存在一对多关系,MySQL Workbench 会自动在需要的表中创建外键。但这都是我使用多对多关系时自动创建的 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 - 不是唯一的表/别名:“软件”

我走对了吗?

EDIT2:

实际上我开始质疑我的设计。我认为我无法将特定故障与此设计的特定配置联系起来,因为配置和故障之间没有直接关系。我应该设计不同的吗?

【问题讨论】:

  • 当你有这样的间接关系时,你在查询中使用多个连接来获取相关数据。
  • @Barmar 我又添加了一个问题,有时间请查看
  • 当一个表出现在多个FROMJOIN子句中时,需要给它们起别名以便区分。

标签: mysql sql database many-to-many data-modeling


【解决方案1】:

要修复您的错误,请尝试以下操作: 您加入了两次表软件,但没有加入故障表。

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 替换)

【讨论】:

  • 这行得通,谢谢!我在尝试不同的方法时多次检查了我的 SELECT 查询,但我没有发现错误。我想我对自己的写作视而不见:)。我猜在对同一张表进行 INSERT 时可以使用这种相同的方法?
  • 一次插入所有表格?没有。看到这些帖子MySQL insertsMySQL inserts 2
【解决方案2】:

不!它会破坏 3NF。如果您不知道它是什么和/或为什么您可能需要更多地研究 ER(实体关系模型)中的关系。这是一个非常复杂的话题,我在这里无法解释。但是互联网上有大量的文档。

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2019-08-25
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2012-07-22
    • 2020-05-01
    相关资源
    最近更新 更多