2015-04-15 37 views
1

我得到了三張表。如何建立外鍵關係

User 
Project 
WorkFlow 

在工作流程專案編號,用戶ID一起不應該重複。那就是我的 的要求。我的意思是這個組合不應該重複。

而ProjectId應出現在項目表中並且UserId 應出現在用戶表中。

這是要求。

步驟i嘗試:

我製成ProjectId, UserId如在工作流複合鍵。但無法維護外鍵,因爲兩列在單表中不可用。

如何解決這個問題。

我也願意改變我的設計,因爲這是我發展的初始階段。

主要reuirement是

一個表存儲項目(項目表)相關的信息和 另一個(工作流程)持有該項目分配給 該用戶的記錄。

+0

您還可以使用UNIQUE KEY CONSTRAINT或UNIQUE(集羣或非集羣)INDEX來強制執行非PK列的唯一性嗎? – StuartLC

+0

@StuartLC那麼可以刪除組合鍵並將這兩列作爲唯一鍵? – shanmugharaj

+1

是的,就像@羅傑的答案在下面(+1),儘管建議你命名UKC。 – StuartLC

回答

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

是的,約束應該唯一命名的,它將使模式比較和更新更加容易。

+0

嗨,感謝您的回覆..是的外鍵不會使唯一性我只需要它的參照完整性。很好,我會將這些變成獨特的密鑰 – shanmugharaj

+0

答案大部分是正確的,但是有一個錯誤,新來者使用**關聯表**。這裏'id'字段和索引是完全多餘的,它沒有任何用處。它是一個PK的概念是用'id'字段標記每個文件並將其聲明爲「PK」,這是錯誤的。刪除'id'字段和索引。然後使'(UserId,ProjectId)'主鍵。因爲它是。 – PerformanceDBA

+0

@ PerformanceDBA,通常你會是對的。然而,從主題領域來看,我決定OP很可能會在這一個下面有一些表格。而且因爲大多數人都有理解多列外鍵的問題,所以我決定添加代理PK。如果我的猜測是正確的,它也將解決「移動」問題(切換到另一個項目/用戶),否則將導致PK更新並需要'更新級聯',這通常是不合需要的。但是,這只是一個猜測。 –