外键循环引用困境
Foreign Key cyclic reference Dilemma
考虑一个简单的情况,其中有 2 个 table、 命名用户和工作组。
- 用户的电子邮件地址是用户 table 中的主键。
- 一个Workgroup_id是工作组table中的主键。
- 一个用户可以创建多个工作组。
- 一个用户只能属于 1 个工作组。
在这个给定的场景下,我需要跟踪哪个用户创建了一个工作组。
我已经做过的事情:
- 在用户table中有一个名为workgroup_id的变量,可以知道用户属于哪个工作组。这是工作组 table.
中 workgroup_id 的外键
- 在工作组 table 中有一个名为 user_email 的变量来跟踪哪个用户创建了工作组。这是用户 table.
中 user_email 的外键
我在这里面临的问题是,这会导致用户和工作组 table 之间出现 循环引用 。因为循环引用在编程中的任何地方都是一个很大的禁忌。
我该如何解决这个问题?有没有更好的设计模式我在这里错过了?
编辑:
至于 "circular references are a big no no" 与否,从概念上讲它们可能不是,但由于在不同数据库中的实现不通用,它们仍然是一个有效的问题。当您使用 ORM 时,这种情况会更加严重,因为 ORM 对数据库的支持限制了您可以拥有的数据库设计类型。
您需要允许至少一个外键为NULL
。这将允许您在 table 中创建第一行,将外键留空作为占位符。在另一行上创建相应的行后 table,更新第一行中的外键。
您也可以认为这可以作为永久性条件。如果您在创建任何用户之前自动创建第一个工作组,那么第一个工作组实际上并没有创建者,因此您可以将其设置为 NULL
.
考虑一个简单的情况,其中有 2 个 table、 命名用户和工作组。
- 用户的电子邮件地址是用户 table 中的主键。
- 一个Workgroup_id是工作组table中的主键。
- 一个用户可以创建多个工作组。
- 一个用户只能属于 1 个工作组。
在这个给定的场景下,我需要跟踪哪个用户创建了一个工作组。
我已经做过的事情:
- 在用户table中有一个名为workgroup_id的变量,可以知道用户属于哪个工作组。这是工作组 table. 中 workgroup_id 的外键
- 在工作组 table 中有一个名为 user_email 的变量来跟踪哪个用户创建了工作组。这是用户 table. 中 user_email 的外键
我在这里面临的问题是,这会导致用户和工作组 table 之间出现 循环引用 。因为循环引用在编程中的任何地方都是一个很大的禁忌。
我该如何解决这个问题?有没有更好的设计模式我在这里错过了?
编辑: 至于 "circular references are a big no no" 与否,从概念上讲它们可能不是,但由于在不同数据库中的实现不通用,它们仍然是一个有效的问题。当您使用 ORM 时,这种情况会更加严重,因为 ORM 对数据库的支持限制了您可以拥有的数据库设计类型。
您需要允许至少一个外键为NULL
。这将允许您在 table 中创建第一行,将外键留空作为占位符。在另一行上创建相应的行后 table,更新第一行中的外键。
您也可以认为这可以作为永久性条件。如果您在创建任何用户之前自动创建第一个工作组,那么第一个工作组实际上并没有创建者,因此您可以将其设置为 NULL
.