如何设计此数据库以避免循环依赖?


12

有两个表:

  1. 用户
  2. 地址

用户包含对地址的引用。

地址包含列CreatedBy和ModifiedBy,这是对User的引用。

如何设计该数据库以避免循环依赖?


4
您确定ModifiedBy不是对进行更改的数据库用户的引用,而不是对应用程序用户(将驻留在User表中)的引用吗?无论哪种方式,都没有关系。我看不出为什么有实际问题?
Philᵀᴹ

首先创建哪个。由于CreatedBy和Moddby是必须数据。并且用户表不应将addressid设置为null。当我通过创建一个新表UserAddress来解决此问题时,该表包含userid和addressid的引用
Shashi

2
如果您的DBMS支持延迟约束,则始终可以使用它们。
Hart

注意:关系模型支持将两个插入或更新作为一个原子操作进行,这实在令人遗憾,SQL不支持这种情况(因为延迟的约束(即使我建议了它们,也很可怕))。
科林·哈特

Answers:


7

建议您不要简单地设计出此“引用锁定”的方法,而不必搜索提示和技巧(包括延迟的约束),因此请尝试如下操作:


事实

  • 用户(UserID)存在。
  • 地址(AddressID)是由User创建的(UserID)
  • 地址(AddressID)创建于日期(DateCreated)
  • 地址(AddressID)最后一次由User修改(UserID)Date(ModifiedOn)
  • Date以来,用户(UserID)居住在Address处(AddressID)(ValidFrom)

约束条件

  • Each 地址是由exactly one User创建的。It is possible that more than one 地址是由the same User创建的。

  • Each 地址创建于exactly one 日期It is possible that more than one 地址创建于the same 日期

  • For each 地址 and 日期用户日期修改that 地址at most one that

  • For each 用户 and 日期,自日期that 用户居住的at most one 地址that


逻辑上

在此处输入图片说明


就强制性地址而言,请在应用程序层上进行验证,并将装入语句包装到事务中-这样一来,您将获得全部或全部信息。


5

您别无选择,只能在以下两个操作中创建循环依赖关系,因为创建第一个表时一个表不存在。

CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));

ALTER TABLE A ADD B_FK INT;

如果您希望避免循环依赖。然后,您需要删除一个REFERENCES约束,或者可以通过一种方式添加DELETE和UPDATE CASCADE引用。如果您的逻辑有些复杂,也可以实现TRIGGER。


1
删除约束会从定义中删除循环依赖性,但不会从设计中删除。您可以添加一个事件表来记录最后创建或修改该地址的UserID和AddressID,但这只是使依赖关系更进一步了。反之,如果User表具有CreatedBy和ModifiedBy列,则循环依赖性将存在于一个表中。这类似于带有主管列的employee表,其中主管也是雇员。正如Phil指出的-没问题。
Leigh Riffel

@LeighRiffel我同意。但是您建议的事件表实际上确实删除了所有循环依赖项。
ypercubeᵀᴹ

@ypercube确实可以;不知道我怎么把那根电线交叉了。需要明确的是,即使它确实删除了循环依赖关系,您也可能不应该创建事件表。
Leigh Riffel

无论如何,我认为这个答案不能解决问题。问题(我认为)是关于如何完全避免循环路径,而不是如何首先使用循环路径创建FK。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.