1

我仍在努力确定是否将标识列用于 PK,当您可以使用现有列时,是否是正确的方法。

例子:

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,而是在我的两列中放置一个主键,这将始终是唯一的。IE:

CONSTRAINT pk_person_link PRIMARY KEY(owner_person_id, link_person_id)

这只是个人选择,还是有充分的理由不使用身份(我赞成,纯粹是因为 - 我一直这样做)。

4

3 回答 3

3

使用标识列作为聚集索引的一个优点是每次插入都会是最后一条记录,因此 SQL Server 不需要使用索引。

加入的时候还有一个好处,你只需要在子表中有1个引用。

这些可能不相关,具体取决于您添加的数据或数据库架构(如果您需要在其他地方使用它)

于 2012-08-16T01:25:56.733 回答
2

我赞成身份列。反复地,我发现找到某物所在的确切行很有用。

例如,我几乎本能地编写以下查询来查找添加到表中的最新行:

select t.*
from t
order by 1 desc

这行得通,因为我总是让身份成为表中的第一列。

此外,在对表进行连接时,将主键设置为单个字段也很有帮助。如果你想识别一个特定的实体,没有什么比拥有一个特定的实体 id 更好的了。

于 2012-08-16T01:17:10.507 回答
2

根据需要,我个人会在记录上使用自然主键,因此两列将始终是唯一的。

所以表格将是:

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

但这实际上取决于您对表的计划以及选择哪个选项的数据库设计。

于 2012-08-16T01:17:16.020 回答