SQL Server中PK的最佳实践

时间:2009-02-07 17:22:28

标签: sql sql-server sql-server-2005 database-design primary-key

我一直想知道在SQL Server的M2M表中设置PK的最佳做法或后果是什么。例如:

我有2张桌子

  • 用户
  • 角色

我正在制作新表

  • 的UserRole

其中有2个字段  RoleId&用户ID

现在我应该

  1. 创建一个UserRoleID作为PK,并将UserID和RoleID设为FK
    • 制作PK用户ID和角色ID并将其设置为FK
    • 别的东西
  2. 我想知道每个选项的性能问题以及推荐的最佳实践。

5 个答案:

答案 0 :(得分:10)

这些案例的标准程序是有两个索引。唯一的PK是两个字段复合,首先是具有更大基数的字段,即UserID;第二个索引只包含辅助字段(即RoleID)。

然后聚集在更多多记录结果集中可能涉及的任何一个(即,如果查询每个用户的多个角色,或每个角色多个用户)。

答案 1 :(得分:2)

将PK声明为(UserID,RoleID)。 (注意:顺序很重要)

使用对Users表的引用将UserID声明为FK。 将RoleID声明为FK,并引用Roles表。

幸运的是,您的DBMS将按顺序为您提供(UserID,RoleID)的综合索引。

如果幸运的话,这将加速用户和角色之间的联接。一个好的DBMS将为连接提供合并连接,除了连接条件之外没有任何限制。假设角色数量很少,三向连接也应该运行得非常快。

当您加入UserRoles和Roles时,如果不加入用户,您可能会发现它的速度令人失望。你经常这样做,在这种情况下速度有多重要?如果它很重要,您可以仅在RoleID上创建索引。

答案 2 :(得分:1)

这取决于您是否希望将特定用户具有特定角色的任何其他含义挂起。如果没有,那么只需创建一个跨越两个字段的聚集PK。

为两者添加FK并向第二个字段添加索引。考虑字段应该出现在哪个顺序。您是否更有可能检索用户所属的角色集或特定角色的用户集?

答案 3 :(得分:0)

这取决于您如何使用它们。大多数时候,我将主键作为UserId和RoleId来确保它们是唯一的。意味着同一个用户不能拥有相同的角色。

现在这就是“依赖”发挥作用的地方。如果要将UserRole表链接到另一个表,那就是我创建UserRoleId主键的位置。并将UserId和RoleId变为唯一约束。

原因是在引用UserRole的表上没有不需要UserId和RoleId的表,因为您分别链接到UserRoleId而不是User表和角色表。

答案 4 :(得分:0)

避免使用复合PK并在两个FK上放置一个唯一索引(在本例中似乎是合适的)。在这种情况下不是问题,但要保持一致。在编写查询时必须记住要处理要加入的多个字段是一件痛苦的事。如果您的复合键必须由datetime,char或其他类型的字段组成,则性能会受到影响。