我觉得我在这里遗漏了一些明显的东西......
我有一个主表(我们称之为People
)和一个辅助表(我们称之为Groups
)的情况,人们可能会扮演两个不同的角色(Secretary
& Treasurer
)。这两列都是int
FK 回到People.ID
.
CREATE TABLE People(
ID int NOT NULL,
FullName varchar(50) NOT NULL,
CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED (ID ASC))
CREATE TABLE Groups(
ID int NOT NULL,
Treasurer int NULL,
Secretary int NULL,
CONSTRAINT PK_Groups PRIMARY KEY CLUSTERED (ID ASC))
到目前为止,一切都很好。但是角色是可选的(可以为空),所以我希望能够删除一个人并将组中的 FK 值设置为 NULL。
ALTER TABLE dbo.Groups ADD CONSTRAINT FK_Groups_Treasurer FOREIGN KEY (Treasurer) REFERENCES dbo.People (ID) ON DELETE SET NULL
ALTER TABLE dbo.Groups ADD CONSTRAINT FK_Groups_Secretary FOREIGN KEY (Secretary) REFERENCES dbo.People (ID) ON DELETE SET NULL
现在我们有一个问题:
在表 'Groups' 上引入 FOREIGN KEY 约束 'FK_Groups_Secretary' 可能会导致循环或多个级联路径。
这里有什么问题,为什么 SQL Server 会关心?可能的级联冲突是什么?如果我删除一个Person
,请将任何相关表中的 FK 值设置为 NULL。这对两个不同的表来说没有问题,每个表都有一个 FK。但是在同一张表中有两个 FK 值似乎是被禁止的。
我错过了什么吗?这是某种糟糕的设计吗?处理这种情况的正确方法是什么?这似乎是一个常见的用例。
看起来你有级联删除,你最终会删除一个理论上可以在另一个组中被引用为财务主管或秘书的人。
组表违反了第一范式。这类似于表中有 address1、address2。
您需要第三个表 GroupPersonRole,其中包含组 ID、人员 ID 和角色 ID。
在一张表中定义您的人。在另一个表中定义您的组。并在另一个表中定义您的角色。然后在第四个中,比如 GroupPersonRole,您可以将它们组合起来并根据需要绘制 FK。
如果有人想添加更多组角色怎么办?您不希望每次有人有新想法时都修改架构。