2009-12-23 142 views
0

這對我來說很重要。在SQL Server 2008中,我有3個表。 2與唯一鍵和1是它們之間的映射。例如:複合外鍵

People Events Schedule 
------ ------ -------- 
PersonId EventId ScheduleId 
Name  Place PersonId 
        EventId 
        Rsvp 

ScheduleId是不需要的,如果我做一個組合鍵。我知道如何使這樣一個複合鍵

ALTER TABLE Schedule ADD CONSTRAINT CK_Schedule_PersonId_EventId 
UNIQUE NONCLUSTERED (PersonId, EventId) 

但我不知道如何使一個也正確映射到外鍵。我怎樣才能做到這一點?另外,如果我錯了,並且首選方式是ScheduleId,請說明原因。

回答

4

ScheduleId通常是ORM的首選,它提供了一個絕對唯一且不可更改的主鍵,代表一條記錄。主鍵不應該改變。它也使處理記錄更容易一些。你只需要給id一個更新或刪除,而不是傳入一個複合標識符。

您可以創建,當你正在做的定義日程安排外鍵:

PersonId int FOREIGN KEY REFERENCES People(PersonId) 

CONSTRAINT fk_PersonId FOREIGN KEY (PersonId) REFERENCES People(PersonId) 

,或者如果你正在改變現有的表

ALTER TABLE Schedule ADD CONSTRAINT fk_PersonId 
FOREIGN KEY (PersonId) REFERENCES People(PersonId) 

而且我會提到,如果你做了一個複合fk,那麼你應該把它作爲確保我的主要關鍵t不僅是唯一的,而且不是空的。

CONSTRAINT pk_Person_Event PRIMARY KEY (PersonId, EventId) 
+0

您是否認爲我應該使用帶約束的單個主鍵來防止重複配對,還是應該讓我的業務邏輯強制執行? – Dinah 2009-12-23 17:51:27

+1

+1:'scheduleid'也被懶惰的程序員使用,懶惰的程序員根本不想爲主鍵引用2+列的麻煩。另外,組合鍵不一定是主鍵,但是這個例子就是這種情況。 – 2009-12-23 17:51:36

+1

@Dinah:單列主鍵和伴隨的唯一約束是過度複雜的情況。如果沒有使用單列主鍵,則將組合鍵設爲主鍵。 – 2009-12-23 17:53:12

1

由於數據庫的可伸縮性,在這種情況下我不會使用組合鍵。 假設您的表(Schedule)中有6個外鍵,並且在其他一些表中使用了ScheduleId,我將不會在即將使用的表中使用所有6個外鍵。我將嘗試使用ScheduleId作爲我的外鍵。