使用代理主键是一个好习惯,即使表只包含一列并且它本身包含唯一值吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用代理主键是一个好习惯,即使表只包含一列并且它本身包含唯一值吗?相关的知识,希望对你有一定的参考价值。

我有一张gender表:gender_id | gender_label 如果我删除gender_id列,这是一个不好的做法,因为gender_label也是唯一的并且可以用作主键吗? 我知道应该尽可能使用代理键,因为它们有效且快速搜索。但它会对上述情况产生任何影响吗?怎么样?

答案

我写了数百张桌子。其中2/3有一个“自然”键; 1/3有一个“代理键”。

从那以后,我推断出你的问题的答案是“它取决于”。

好的,那又取决于什么?

  • 有一个可靠的自然键 - 一个真正的UNIQUE?如果是这样,可能你应该使用它。
  • 性能是一个问题 - 嗯,这是双向的。
  • 自然键是“小”吗?在我看来,取自国际标准的2个字符的country_code比4字节的INT更好。
  • 如果自然键是“大”并且有多个辅助键,则请记住PK包含在每个辅助键中。 (在InnoDB中)
  • 通过辅助密钥查找(在InnoDB中)首先在二级密钥的BTree中进行深入分析,然后在PK的BTree中进行深入分析。因此,拥有一个你经常使用的PK有一个从轻微到大的性能优势。 (这可能是代理,也可能是自然的。)

在你的简单情况下,gender_id字符串像M / F /等?这就是我要用的东西。实际上,我可能根本没有桌子;而在其他表中有gender作为ENUM('unknown', 'male', 'female', 'other')

以上是关于使用代理主键是一个好习惯,即使表只包含一列并且它本身包含唯一值吗?的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库系列3-键

定义主键

怎么在oracle数据库中查询一个表的主键是哪一列

约束 CONSTRAINT

使用主键约束

MySQL准备