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

问题描述 投票:0回答:1

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

mysql database-design
1个回答
0
投票

我写了数百张桌子。其中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')

© www.soinside.com 2019 - 2024. All rights reserved.