如何选择我的主键?

时间:2010-11-27 14:02:27

标签: sql mysql database primary-key

我在choosing a primary key上找到了这个阅读材料。

  • 是否有关于如何选择给定表的主键的指南/博客文章?
  • 我应该使用自动递增/生成的密钥,还是应该将主键建立在被建模的数据上(假设它有一个真正独特的字段)?
  • 为了性能,主键是否总是很长,或者我可以将外部唯一ID作为主键,即使它是一个字符串?

6 个答案:

答案 0 :(得分:11)

我认为在实践中使用natural key很少比surrogate key更好。

以下是使用自然键作为主键的主要缺点:

  • 您的键值可能不正确,或者您可能只想重命名键值。要编辑它,您必须更新将其用作外键的所有表。

  • 通常很难拥有真正的unique自然密钥。

  • 自然键通常是字符串。数字字段的索引将比字符串字段上的索引更紧凑。

主键的数据类型应该是什么硬性规则。数字键通常表现得更好,但你可以使用一个字符串,特别是如果表不大,并且引用它的表也不大。

答案 1 :(得分:1)

我使用代理键,通常称为非敏感键,由自动生成的int / bigint数据类型组成。

以下是我喜欢使用这些密钥的一些原因。

  • 从列表中删除多个项目(例如旧电子邮件)时,您可以提供以逗号分隔的整数列表,而不是guids或自然键
  • 我发现这使得编写自己的级联删除更容易
  • 我认为内部连接在整数字段上更快
  • 它可以使学习新系统,而无需更容易理解文档。

答案 2 :(得分:1)

键是一组具有两个基本特征的属性:唯一性和最小性。最小化意味着密钥只具有确保唯一性所需的最小属性数。

通常有三个标准用作选择好密钥的指南:

  • 熟悉 - 密钥应该对使用它们的人有意义和熟悉
  • 简洁 - 键应尽可能简洁明了
  • 稳定性 - 关键值应不经常更改

这些是很好的指导方针,但不是绝对的要求。在所有情况下,功能要求和数据完整性的需求应确定使用哪些密钥。

答案 3 :(得分:0)

答案 4 :(得分:0)

我在专业系统(主要是银行软件)中使用了很多不同的数据模型,并且有不同的解决方案。我看过GUID解决方案,似乎没有太多影响性能。我已经看到“服务提供的号码作为系统范围的唯一号码”。我已经看到了提供类似GUID“但更短”的算法。我还看到使用了业务密钥(如帐号),这是设计不佳并导致问题,我不推荐它。我已经看到每个表的自动递增键。

我最喜欢什么?服务作为系统范围提供的号码。它运作良好。使用简单的密钥转换表,可以使用用户密钥(如帐号)来查找唯一的数字和什么类型的数据对象(不一定是表,因为如果数据对象,相同的唯一键可能适用于多个表根据其类型分为不同的表格。

那么有博客还是其他什么?好吧,我有一本书推荐Graeme Simsion和Graham Witt称为“Data Modeling Essentials”。他们可能不会建议我的首选解决方案,但他们提供了许多真实的实例,并展示了可能的不同解决方案。

答案 5 :(得分:-4)

我总是选择uuid作为主键。与int / long键相比,有一点点开销,但是有很多好处:你不能遇到类型溢出,你可以在不更改主键的情况下稍后分片数据库,你可以与其他系统集成并确保你的主键总是唯一的,uuid不能猜到等。