mysql - 如何解决两个表之间的循环引用?

标签 mysql entity-relationship circular-dependency database-normalization circular-reference

非常简单的例子:

一个公司可以有N个地点,其中一个地点是主要地点。我们可以用 MySQL 外键解决这个问题吗?

我们目前的做法是在每个 Location (company_id) 中有一个指向 Company 的指针,并在 Company (main_location_id) 中有一个指向 Location 的指针。

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

有什么想法吗?

谢谢!

编辑1

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

编辑2

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

结论:

如果不放宽其中一个约束,就无法使用 MySQL 来实现。我们将在公司中使用插入前检查来检查位置引用是否为空。

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

最佳答案

您必须有三个表。

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

第二个是带有 Location 的表格,但没有指向贵公司的链接。在此表中,即您有以下行:

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

等等

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

就这样

关于mysql - 如何解决两个表之间的循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208078/

相关文章:

mysql - 在mysql中使用join连接两个查询

PHP 从 MySQL 查询返回结果

iOS 核心数据一对一自反关系谓词

domain-driven-design - 您如何使用领域驱动设计为角色/关系建模?

Java - 在 MVC 模式应用程序中检测循环引用的方法

php - MYSQL php数据库插入包括图像上传

xinetd 中使用的 clustercheck 脚本的 MySQL 登录路径问题

.net - 将 Entity Framework 与历史数据一起使用

c# - 如何打破存储库之间的循环依赖

c++ - C++ header 中的循环依赖。怎么找?