MySQL 连接表外键

Posted

技术标签:

【中文标题】MySQL 连接表外键【英文标题】:MySQL Junction Table Foreign Keys 【发布时间】:2014-09-12 21:42:21 【问题描述】:

我有几张桌子:companycustomercompany_has_customertransaction

company_has_customer 是一个多对多连接表,使用 companycustomer 的 PK 作为其 PK。

在整个数据库的几乎所有情况下,companycustomer 都用于标识记录(例如在transaction 表中)。

我的问题是我是否应该在transaction 表中创建外键以分别指向company_has_customer 或两个表(companycustomer)?

我认为通过company_has_customer 发送这些FK 以确保仅在公司和客户之间存在关系时才插入transaction 记录,这对参照完整性来说是最好的。是否有任何标准或约定可以支持我的预感?

【问题讨论】:

SO 并不适合自以为是的设计讨论。 感谢 Barmar,我修改了这个问题以减少固执己见。在这种情况下,我真的在寻找最佳实践,但我有强烈的预感。 也许你在 dba.stackexchange.com 上会有更好的运气。 我知道 *** 感觉有点不对劲,我忘记了这些东西有一个庞大的网站网络。 【参考方案1】:

这是思考问题的方法。交易是否与公司和客户有单独的关系?或者,交易是否永远特定于公司/客户关系?

我猜第一个是这样的。

要考虑的具体情况是:如果客户和公司之间的关系在交易发生后发生变化,会发生什么?交易是保留原公司还是切换到新公司?还是失效了?

如果您引用company_has_customer 表,则关系可能会消失。事实上,您可能希望关系保持交易发生时的状态,因此请使用两个外键关系。

【讨论】:

公司和客户之间的关系存在于许多建议表中。本质上,客户和公司之间的数据将始终属于该公司/客户组合。足够了,甚至可以更简单地将 FK 添加到具有所属公司 ID 的客户表中。 M2M 只是确保一定程度的未来选择。 @KyleJohnson 。 . .在这种情况下,关系是customer,您可以从那里查找公司。 是的,它就在真正的边界所在的空中。我设想一些客户可能属于多家公司,或者多家公司可能管理同一个客户。像这样的所有小细节都很难工作。

以上是关于MySQL 连接表外键的主要内容,如果未能解决你的问题,请参考以下文章

主索引列上的 MySQL 表外键索引

mysql多表外键? - 初学者

mysql怎么设置外键?

MySQL---案例实战{拆分多表外键创建等}

mysql外键使用

第二百八十节,MySQL数据库-外键链表之一对多