一对多,但将其中一个识别为"默认"

Gav*_*vin 7 database-design

我有一个表人士地址.一个可以拥有多个地址记录,因此与Address的简单1 ..*关系具有引用"人员ID"的字段.

现在,对于给定的人,我希望识别他们的"默认"或"主要" 地址.

我想出了两个想法,但我也不相信.在我决定之前,任何人都可以提出任何关于潜在问题的评论我可以面对任何一个选项...

(一个).可以在Person上有一个"默认地址ID" ,它将存储默认地址记录的ID .这里可能存在的缺陷是可以在此处设置不属于此Person地址,因此需要额外的检查约束来防止这种情况.

(b)中.可以在地址表上有一个"默认"标志,但这有可能允许多个选择,因此需要进一步检查,以便在设置标志时,它也会在属于同一个人的所有记录上清除.

任何

Jon*_*son 2

我会选择(B),然后保护默认位的设置。

通过阅读您对问题的评论,我想补充一点,以强制始终至少有 1 个地址设置为默认位,您只需要在存储过程中处理该地址即可。

就像是:

对于插入:

DECLARE @IsDefault bit;
SET @IsDefault = 0;

IF NOT EXISTS (SELECT * from tblAddresses WHERE PersonID = @PersonID And Default = 1)
BEGIN
   SET @IsDefault = 1;
END

INSERT INTO tblAddress (.... Default ... )
       VALUES (... @IsDefault ... );
Run Code Online (Sandbox Code Playgroud)

更新:

IF (@Default = 1)
BEGIN
   Update tblAddress
   SET
   tblAddress.Default = 0
   FROM tblAddress
   WHERE tblAddress.PersonID = @PersonID;

   Update tblAddress
   SET
   tblAddress.Default = 1
   WHERE ID = @AddressID;
END
ELSE
BEGIN
   IF EXISTS (SELECT * FROM tblAddresses WHERE PersonID = @PersonID AND Default = 1 AND AddressID != @AddressID)
   BEGIN
      UPDATE tblAddresses 
      SET Default = 0
      WHERE AddressID = @AddressID;
   END
END
Run Code Online (Sandbox Code Playgroud)

此外,您也可以从用户界面中阻止这种情况,但在数据库中提供额外的保护层也没有坏处。