8

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

我有 2 张桌子

  • 用户
  • 角色

我正在制作一张新桌子

  • 用户角色

其中有 2 个字段 RoleId 和 UserID

现在我应该

  1. 创建一个 UserRoleID 作为 PK,并使 UserID 和 RoleID 成为 FK
    • 制作 PK UserID AND RoleID 并将它们设置为 FK
    • 别的东西

我想知道每个选项的性能问题以及推荐的最佳实践是什么。

4

5 回答 5

10

这些情况的标准程序是有两个索引。唯一的PK是两个字段复合,基数大的字段在前,即UserID;第二个索引只有辅助字段(即 RoleID)。

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

于 2009-02-07T17:29:57.460 回答
2

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

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

运气好的话,您的 DBMS 将按该顺序为您提供 (UserID, RoleID) 的复合索引。

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

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

于 2009-02-07T18:09:26.320 回答
1

这取决于您是否希望对特定用户具有特定角色这一事实附加任何其他含义。如果不是,那么只需创建一个集群 PK 以跨越两个字段。

为两者添加 FK 并向第二个字段添加索引。考虑一下字段应该以什么顺序出现。您更有可能检索用户所属的一组角色还是特定角色中的一组用户?

于 2009-02-07T17:29:36.370 回答
0

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

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

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

于 2009-02-07T17:30:43.527 回答
0

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

于 2009-02-08T03:05:35.707 回答