如何建立外键关系

时间:2015-04-15 06:33:24

标签: sql sql-server database relational-database

我有三张桌子。

User
Project
WorkFlow
  

在工作流ProjectId中,UserId永远不应重复。那是我的   要求。我的意思是组合不应该重复。

     

ProjectId应该出现在Project表和UserId中   应存在于用户表中。

这是要求。

我试过的步骤:

我在workFlow中将ProjectId, UserId作为复合键。但由于单个表中没有两列可用,因此无法维护外键。

如何解决此问题。

我也愿意改变我的设计,因为这是我开发的初始阶段。

主要要求是

  

一个表来存储项目(项目表)相关的信息和   另一个(workFlow)保存分配项目的记录   哪个用户。

1 个答案:

答案 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),
);

是的,约束应该唯一命名,它将使架构比较和更新更容易。