我一直想知道在SQL Server的M2M表中设置PK的最佳做法或后果是什么。例如:
我有2张桌子
我正在制作新表
其中有2个字段 RoleId&用户ID
现在我应该
我想知道每个选项的性能问题以及推荐的最佳实践。
答案 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或其他类型的字段组成,则性能会受到影响。