【问题标题】:Sql table design - Choosing primary key from unique key vs business key [closed]Sql表设计-从唯一键与业务键中选择主键[关闭]
【发布时间】:2014-06-06 17:51:30
【问题描述】:

我需要设计一个表,并且对选择主键字段有点困惑。例如,我正在创建一个表 Student,其中包含以下列

  • ID - 唯一键和自动递增 1。
  • RegistrationNumber - 数字在表格中是唯一的
  • 姓名
  • 注册日期

现在我的问题是:从上表我们可以看到 ID 和 RegistrationNumber 都是唯一的,RegistrationNumber 服务于业务目的,但 ID 用于与其他人引用此表。因此,在这两列中,我可以将哪一列作为主键。

从业务上下文注册号应该是表的主键,但由于我在其他表事件中引用 Id,我可以选择 ID 作为 PK..

请给我建议哪一个应该是合适的。

提前致谢。

【问题讨论】:

    标签: sql sql-server database-design


    【解决方案1】:

    您应该为您的 PK 使用代理键。我建议您将ID 列作为PK。

    如果RegistrationNumber 列必须是唯一的,您可以随时在其上添加unique constraint

    在此处阅读代理键:Surrogate vs. natural/business keys

    也在这里:https://en.wikipedia.org/wiki/Surrogate_key

    【讨论】:

    • 谢谢你的建议,我有什么强有力的理由选择ID作为PK吗?
    • @classic_vmk 我添加了几个链接供您阅读。
    • @classic_vmk:通常 ID 是整数,而 registrationNumber 是字母数字。这使得 ID 更适合作为参考,因为它应该允许稍微更快的查找。
    • @popovitsj,您可以在两者之间的任意列组合上连接两个表,甚至可以在生成的列(行号等)上连接。但我们在这里讨论的是设计使用 Id 和 PK 的最佳方式。
    • @popovitsj : 我应该这样接受你的评论吗?如果我们将 Id(如其他表中提到的)作为 PK,将在 ID 列上创建聚集索引,这将有助于加快查找速度何时加入。
    【解决方案2】:

    如果RegistrationNumber 在逻辑级别是唯一的,您必须在数据库级别对其施加适当的约束,无论您如何处理@987654325 @。

    您需要做出以下设计决策:

    • 你需要ID吗?从逻辑角度来看,您也可以从其他表中引用RegistrationNumber,尽管从物理角度来看这不一定是一个好主意。如需详细了解您可以选择另一种方式的原因,请参阅here
    • 如果您确定确实需要 ID,请确定它应该是 PRIMARY KEY 还是 UNIQUE(RegistrationNumber 则相反)。从逻辑上讲,它不会生成difference,但请注意,MS SQL Server 在物理级别上会自动clusters PRIMARY KEY 上的表,除非使用了 NONCLUSTERED 关键字。1

    1 MS SQL Server 将允许您使用特殊语法在任何列上进行集群,而不仅仅是 PRIMARY KEY。我上面描述的只是一个默认值。

    【讨论】:

      【解决方案3】:

      问题被标记为 SQL Server。就 SQL Server 而言,哪个被指定为 PRIMARY KEY 和哪个 UNIQUE 没有区别。 SQL Server 对它们的处理方式相同。重要的是你如何使用它们。

      将一把钥匙设为“主要”的区别本质上是一种惯例和美学问题,而不是任何具有基本或实际意义的东西。有些人选择将“首选”或最重要的业务键指定为主键,而另一些人则始终将其作为其他表(如果有)引用的键。

      【讨论】:

      • 仅供参考:除非使用 NONCLUSTERED 关键字,否则 MS SQL Server 会自动使用主键作为聚集索引,因此它不完全等同于物理级别的唯一约束。 IMO,这种默认设置很不幸,因为许多人似乎没有意识到它,因此过度使用集群。
      • 指定非集群/集群与使用默认值的问题实际上只是语法糖。语义上没有区别:聚集索引位于您选择的位置,无论您碰巧使用哪种替代语法来定义它。
      • 当然,但是当一个不知道这一点的人读到:“就 SQL Server 而言,指定主键和唯一键没有区别。” ,他们可能会有不同的想法。
      【解决方案4】:

      不要使用reitration number作为主键。

      为什么?

      因为在某些年里有人可能会决定改变它——添加一些数字等等——然后你就会陷入痛苦的世界。

      因此,注册码按标准是 varchar 列,因此不适合主键。它不是绝对独特和不变的,因为人们在业务中做出各种会改变事物的决策。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 2011-01-16
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多