首页 > 解决方案 > 如何解决两个表之间的循环引用?

问题描述

很简单的例子:

一家公司可以有 N个Locations,其中一个Locations是 Main Location。我们可以用 MySQL 外键解决这个问题吗?

我们目前的方法是在每个位置 (company_id) 中都有一个指向公司的指针,在公司中拥有一个指向位置的指针 (main_location_id)。

假设我们不允许空引用,这种方法显然是错误的,因为它禁止创建:您无法创建公司,因为它没有 main_location_id,您无法创建位置,因为 if 没有 company_id。鉴于验证仍在交易的每个步骤中运行,交易无济于事。

有任何想法吗?

谢谢!

编辑 1

有些人建议在 Location 或中间表中使用具有唯一索引的标志来解决问题。我们已经考虑过它,但它有一个主要问题:它增加了开销,因为添加一个新的主要位置需要遍历所有其他位置以将它们的标志设置为 false。

编辑 2

我们首选的解决方案(在理想情况下)是在交易结束时检查验证,而不是在每个步骤中。这可以通过禁用外键检查来完成,正如评论中所建议的那样,但这当然是一个次优的解决方案。

结论:

如果不放松其中一个约束,就无法使用 MySQL 来做到这一点。我们将在公司中使用插入前检查来检查位置参考是否为空。

尽管如此,我仍然很好奇为什么 MySQL 不允许在事务结束时通过验证,而不是在每一步都这样做。

标签: mysqlentity-relationshipcircular-dependencydatabase-normalizationcircular-reference

解决方案


你必须有三张桌子。

第一个是您的Company表,其中包含有关您的公司的标量信息(如名称、财务代码等)

第二个,Location没有链接到贵公司的表。在此表中,即您的行为:

  • 特拉法加广场
  • 翁贝托街

等等

第三个是中间表,CompanyLocation其中有一个双外键 companyId 和 locationId,第三列由标志 (isPrimary) 表示

就这样


推荐阅读