我有三张桌子。
User
Project
WorkFlow
在工作流ProjectId中,UserId永远不应重复。那是我的 要求。我的意思是组合不应该重复。
ProjectId应该出现在Project表和UserId中 应存在于用户表中。
这是要求。
我试过的步骤:
我在workFlow中将ProjectId, UserId
作为复合键。但由于单个表中没有两列可用,因此无法维护外键。
如何解决此问题。
我也愿意改变我的设计,因为这是我开发的初始阶段。
主要要求是
一个表来存储项目(项目表)相关的信息和 另一个(workFlow)保存分配项目的记录 哪个用户。
答案 0 :(得分:2)
外键不控制唯一性;他们只控制参照完整性。为了唯一性,您需要独特的约束:
create table dbo.Workflow (
Id int identity(1,1) primary key,
ProjectId int not null,
UserId int not null,
foreign key (ProjectId) references dbo.Project (Id),
foreign key (UserId) references dbo.[User] (Id),
unique (UserId, ProjectId)
);
编辑:如果您不需要此表中的代理键,并且不太关心其可能的孩子,您可以通过切换代理主要来简化结构自然的关键。随着表变得越来越窄,它将通过减少磁盘占用空间来提高高负载情况下的性能:
create table dbo.Workflow (
ProjectId int not null,
UserId int not null,
primary key (UserId, ProjectId)
foreign key (ProjectId) references dbo.Project (Id),
foreign key (UserId) references dbo.[User] (Id),
);
是的,约束应该唯一命名,它将使架构比较和更新更容易。