【问题标题】:SQL Server - Selecting a Primary Key for my tableSQL Server - 为我的表选择主键
【发布时间】:2011-09-21 16:10:44
【问题描述】:

我有一个存储用户信息的表。
在用户表中,用户名是唯一的。您认为我应该将用户名作为主键还是应该使用 int 的代理键?
使用字符串键会影响性能吗?

【问题讨论】:

  • 这是引发宗教战争的问题。如果username 是逻辑模型中的一个键,它们会将其作为实现中的一个键,即至少是一个UNIQUE,也许是PRIMARY KEY。如果您有多个候选键,则应该实现所有候选键,并且选择哪个提升为“主要”是任意的。如果你选择添加一个代理,你首先需要一个自然键(username 听起来很合理),但一定要知道为什么你认为你需要一个代理:)

标签: sql-server performance database-design indexing primary-key


【解决方案1】:

使用代理整数键。

用户名不会经常更改,但可以。

至于性能,在您知道自己有问题之前不要担心。

默认情况下,SQL Server 将在主键列上创建聚集索引。如果您在聚集索引中使用宽键,则所有非聚集索引也将包含该宽键。

【讨论】:

  • 就我而言,我想不要让用户更改他们的登录名。他们的名字和姓氏可以更改,但注册名称不能。我还应该使用 int pk 吗?
  • 澄清一下:在那种情况下,你不认为我会增加一个专栏吗?这不会影响性能吗?或者可能是我过于关注性能而忽略了其他重要方面!你能解释一下我可能会错过什么吗?谢谢!
  • 哦,我年轻的自己的诞生!
【解决方案2】:

一般使用 int 作为主键。这部分是由于约定以及在将它们用作其他表中的外键时节省空间。实际上,使用您的用户名字段作为主要字段不会影响性能,除非您最终在使用它的多个表中拥有数千条记录。如果您认为您的桌子仍然很小,这取决于您的喜好。

【讨论】:

    【解决方案3】:

    我会使用一个身份代理主键和集群。聚集索引包含在所有索引中,应该是窄的、静态的、递增的。

    就主键而言,您可以将用户名设为主键,但由于外键会引用它,您还希望它是静态的(用户名不是)。所以我会在用户名上创建一个非聚集唯一索引。身份 PK 将自动包含在 NCI 中。

    我会在同一个索引中包含任何其他列(作为包含的列),具体取决于主要通过用户名访问的使用模式 - 例如,密码哈希,可能是名称。但我会检查执行计划,使用分析器和/或索引调整向导来处理预期的工作负载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2015-10-14
      • 2014-12-20
      • 1970-01-01
      • 2022-12-03
      • 2011-05-16
      相关资源
      最近更新 更多