我的表格结构如下所示:
用户:
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上寻找答案,但我无法提出任何相关内容。
答案 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约束的影响。