2012-08-16 70 views
1

我仍然在努力研究如果使用PK的標識列,當你可以脫離使用現有的列時,是正確的選擇。IDENTITY列 - 好還是壞?

例子:

CREATE TABLE person_link 
(
    person_link_id INT NOT NULL IDENTITY(1,1) 
    ,owner_person_id INT NOT NULL 
    ,link_person_id INT NOT NULL 
    ,link_date_created DATETIME NOT NULL DEFAULT(GETDATE()) 
    ,deleted_person_id INT NULL 

    CONSTRAINT pk_person_link PRIMARY KEY(person_link_id) 
    ,CONSTRAINT fk_person_link_owner FOREIGN KEY (owner_person_id) REFERENCES person (person_id) 
    ,CONSTRAINT fk_person_link_link FOREIGN KEY (link_person_id) REFERENCES person (person_id) 
) 

或者,我應該刪除person_link_id,和相當把一個主鍵在我的兩列,這將永遠是獨一無二的。即:

CONSTRAINT pk_person_link PRIMARY KEY(owner_person_id, link_person_id) 

難道僅僅是個人的選擇,或者是有一個很好的理由不使用的身份(這,我是贊成的,純粹是因爲 - 我做這一切的時候)。

+0

可能重複:// stackoverflow.com/questions/63090/surrogate-vs-natural-business-keys) – RedFilter 2012-08-16 01:22:00

回答

3

使用標識列作爲聚集索引的一個優點是每個插入都將是最後一條記錄,因此不需要SQL Server使用索引。

加入時還有一個好處,你只需要在子表中有1個引用。

這取決於您要添加的數據,或者數據庫方案可能不相關(如果你需要使用這個別處)代孕與自然/業務鍵(HTTP的

2

我贊成身份專欄。反覆地,我發現找到確切的行是有用的。

舉例來說,我幾乎是本能地編寫以下查詢找到添加到表的最新行:

select t.* 
from t 
order by 1 desc 

這工作,因爲我總是有身份在表中的第一列。

此外,它有助於在進行表格連接時將主鍵設置爲單個字段。如果你想識別一個特定的實體,就沒有什麼特定的實體ID。

2

根據需要,我個人會在記錄中使用一個自然主鍵,這樣兩列將始終是唯一的。

所以該表將是:

table: 
owner_person_id int -- PK 
link_person_id int -- PK 

但它確實取決於你有表的計劃和選擇哪個選項數據庫設計。