MySQL 连接表外键
Posted
技术标签:
【中文标题】MySQL 连接表外键【英文标题】:MySQL Junction Table Foreign Keys 【发布时间】:2014-09-12 21:42:21 【问题描述】:我有几张桌子:company
、customer
、company_has_customer
和 transaction
。
company_has_customer
是一个多对多连接表,使用 company
和 customer
的 PK 作为其 PK。
在整个数据库的几乎所有情况下,company
和customer
都用于标识记录(例如在transaction
表中)。
我的问题是我是否应该在transaction
表中创建外键以分别指向company_has_customer
或两个表(company
、customer
)?
我认为通过company_has_customer
发送这些FK 以确保仅在公司和客户之间存在关系时才插入transaction
记录,这对参照完整性来说是最好的。是否有任何标准或约定可以支持我的预感?
【问题讨论】:
SO 并不适合自以为是的设计讨论。 感谢 Barmar,我修改了这个问题以减少固执己见。在这种情况下,我真的在寻找最佳实践,但我有强烈的预感。 也许你在 dba.stackexchange.com 上会有更好的运气。 我知道 *** 感觉有点不对劲,我忘记了这些东西有一个庞大的网站网络。 【参考方案1】:这是思考问题的方法。交易是否与公司和客户有单独的关系?或者,交易是否永远特定于公司/客户关系?
我猜第一个是这样的。
要考虑的具体情况是:如果客户和公司之间的关系在交易发生后发生变化,会发生什么?交易是保留原公司还是切换到新公司?还是失效了?
如果您引用company_has_customer
表,则关系可能会消失。事实上,您可能希望关系保持交易发生时的状态,因此请使用两个外键关系。
【讨论】:
公司和客户之间的关系存在于许多建议表中。本质上,客户和公司之间的数据将始终属于该公司/客户组合。足够了,甚至可以更简单地将 FK 添加到具有所属公司 ID 的客户表中。 M2M 只是确保一定程度的未来选择。 @KyleJohnson 。 . .在这种情况下,关系是customer
,您可以从那里查找公司。
是的,它就在真正的边界所在的空中。我设想一些客户可能属于多家公司,或者多家公司可能管理同一个客户。像这样的所有小细节都很难工作。以上是关于MySQL 连接表外键的主要内容,如果未能解决你的问题,请参考以下文章