2012-08-16 44 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 

但它确实取决于你有表的计划和选择哪个选项数据库设计。