【问题标题】:How to pick a primary key in a relational database when several columns are unique?当多个列是唯一的时,如何在关系数据库中选择一个主键?
【发布时间】:2014-07-10 15:34:12
【问题描述】:

如果一个表有两列充当复合候选键(唯一标识每一行),创建代理键并将其用作主键是否是一种好习惯?

原因是:引用它的外键更容易阅读(引用一列而不是两列)。

另外,如果使用代理键,我应该在前面提到的两列上创建唯一约束吗?

【问题讨论】:

  • 你的意思是在美国只有 1 个John Doe? SS应该是PK,句号。假设传统方面,人们可以更改名字,并且可能两个人有相同的名字——但没有两个人共享一个 SS(除非他们在 Target 进行圣诞购物......)
  • 我强烈反对 SS 应该是主键。这是敏感数据,绝不能以纯文本形式存储在任何系统中。它应该始终被加密。帮您自己和您的公司一个忙,立即加密该数据。
  • 您应该考虑的几件事。社会安全号码不是唯一的。有些人共享相同的社会安全号码。如果你不相信我查一下,你会发现很多文章。我有一个涉及这种情况的真实世界情况。
  • 主键应该是唯一的,不为空且稳定。 SSN 可能错误或缺失,并且:它不受您的控制,控制机构可以随时更改其定义/格式。由于 PK 可以作为另一个表中的 FK 的目标,因此您不应该使用任何不稳定的东西作为 PK(此外:它会导致可怕的级联)。而是:使用代理作为 PK。

标签: sql database primary-key composite-primary-key rdbms


【解决方案1】:

你实际上问了几个问题:

  1. 如果从逻辑角度来看,有多个列(或列集)是唯一的,我应该对所有列都设置一个键吗?
  2. 当有多个键时,我如何决定将哪个作为主键?
  3. 如果已经有一个(或多个)自然键,我可以替换它(它们)用代理键吗?
  4. 如果已经有一个(或多个)自然键,我应该添加一个代理键吗?

以下是答案:

  1. 是的。
  2. 从逻辑的角度来看,所有的键都是等效的。但是,可能有physical considerations 支持将其中一个设为优先于其他。
  3. 没有。
  4. 视情况而定。更多关于 here.

【讨论】:

  • 非常感谢,这回答了我的问题。我从中得到:如果我看到一个自然键,无论是简单的还是复杂的,我都会添加一个代理键(这似乎是一个品味问题)。然后我将它用作主键并应用自然键的唯一约束。谢谢!
  • 是的,这是解释它的一种方式。在一个更罕见但仍然现实的场景中,您可以轻松地创建一个自然主键和一个代理备用键 - 例如,如果您想在自然键上 cluster 并且您的 DBMS 不允许您在除了主键之外的任何其他内容。
猜你喜欢
  • 2011-09-16
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多