外键循环参考困境

时间:2017-09-13 21:18:25

标签: mysql sql-server database foreign-keys cyclic-reference

考虑一个简单的情况,其中有2个表,名为Users和WorkGroups。

  1. 用户的电子邮件地址是users表中的主键。
  2. Workgroup_id是WorkGroup表中的主键。
  3. 用户可以创建多个工作组。
  4. 用户可以只是一个工作组的一部分。
  5. 在这个给定的情况下,我需要跟踪哪个用户创建了一个工作组。

    我已经做过的事情:

    1. 在users表中有一个名为workgroup_id的变量,以了解用户所属的工作组。这是Workgroup表中workgroup_id的外键。
    2. 在工作组表中有一个名为user_email的变量,用于跟踪创建工作组的用户。这是users表中user_email的外键。
    3. 我在这里面临的问题是,这会在用户和工作组表之间产生循环引用。由于编程中的任何地方的循环引用都是不可能的。

      我该如何解决这个问题?我有没有更好的设计模式?

      修改 至于“循环引用是否大而不是”,概念上它们可能不是,但由于实现在不同的数据库中是非通用的,它们仍然是一个有效的问题。当您使用ORM时,情况会更加严重,因为ORM对数据库的支持限制了您可以拥有的数据库设计类型。

1 个答案:

答案 0 :(得分:2)

您需要允许至少一个外键为NULL。这将允许您在该表中创建第一行,将外键保留为占位符。在另一个表上创建相应的行后,您将更新第一行中的外键。

你也可以认为这是一个永久的条件。如果您在创建任何用户之前自动创建第一个工作组,则该第一个工作组实际上没有创建者,因此您可以将其设置为NULL