具有Int Clustered Identity& NVarChar主键 - 我加入哪一个?

时间:2014-04-30 13:57:01

标签: sql sql-server primary-key clustered-index

我的表格结构如下所示:

用户

UserId int - clustered index & identity
UserName nvarchar - PK
Name nvarchar
Location nvarchar

USER TYPE JOIN

UserName nvarchar - PK
UserTypeId int - PK

用户类型

UserTypeId int - PK
Name nvarchar

最初我的User表没有UserId,我使用UserName作为主键以及标识和聚簇索引列,但那是导致我出现碎片问题所以我添加了UserId并将其设置为聚集索引标识。

现在,我想知道是否需要将我的联接表UserName列更改为UserId,因为它是表格标识,我认为它可能提高效果,还是最好将其保留在UserName上,因为它是主键?

我已经尝试在Google上寻找答案,但我无法提出任何相关内容。

2 个答案:

答案 0 :(得分:1)

使用Int作为主键并基于该列执行所有联接将比使用UserName更快,特别是因为您在该列上有聚簇索引。

您可能应该更改所有联接以使用UserId并将该列作为主键。您可以在UserName字段上放置Unique Constraint以确保该列保持唯一。

答案 1 :(得分:0)

加入UserId可能会使某些查询更有效,但请注意,引用UserId而不是UserName也可能会产生相关费用。您可能最终需要在之前不必进行连接,因为UserName现在只驻留在User表中。此外,您可能还需要其他应用程序和数据层代码来处理UserNames和UserIds之间的映射和转换 - 假设UserName仍然是用户关心的内容以及您的业务逻辑所依赖的内容。我建议您在决定是否进行更改之前评估整体影响。

许多人总是将PRIMARY KEY约束放在其他表中外键引用的任何键列上;其他人更喜欢自然键"总是指定PRIMARY KEY。它主要归结为传统和美学,并不一定会产生任何实际差异。我当然没有注意到SQL Server中的查询性能受到使用PRIMARY KEY约束而不是UNIQUE约束的影响。