在SQL中选择使用字符变量数据类型作为主键的优缺点是什么?

41

在我接受教育期间学习数据库课程(大约4年前),我认为推荐避免使用字符串作为主键数据类型。

有人能告诉我选择在SQL中将字符变量数据类型作为主键的利弊如何,以及上述前提有多真实吗?

N.B.:(我正在使用PostgreSQL数据库)。我也遇到了需要引用另一个表中的这种表的情况,因此需要在字符变量数据类型上放置外键。请考虑这一点。


2
可以从这里找到一些见解:https://dev59.com/WnRC5IYBdhLWcg3wUvQS - Sami N
https://dev59.com/1HRC5IYBdhLWcg3wG9Xp - Damir Sudarevic
1个回答

35
选择字符数据类型作为主键字段的优点是可以选择它可以显示的数据。例如,您可以将电子邮件地址作为用户表的关键字字段。这消除了额外列的需要。另一个优点是,如果您有一个常见的数据表,其中包含多个其他表的索引(例如,具有对FINANCE、CONTACT和ADMIN表的外部引用的NOTES表),则可以轻松知道这来自哪个表(例如,您的FINANCE表具有F00001的索引,CONTACT表具有C00001的索引等)。不过我反对这种方法,因此缺点可能会更大。
以下是缺点:
  1. 在PostgreSQL中,序列数据类型正是为此而存在
  2. 数字索引将按顺序输入,并且需要进行最少的重新索引(即,如果您有一个键为Apple、Carrot的表并想要插入Banana,则该表必须移动索引,以便将Banana插入中间。如果索引是数字,您很少会在索引的中间插入数据)。
  3. 与数据无关的数字索引不会发生更改。
  4. 数字索引较短,其长度可以固定(4个字节与您选择的varchar长度相比)。
在您的情况下,仍然可以在数字索引上放置外键,因此我不确定为什么要强制将其设为varchar类型。在服务器强制转换数据之前,数字字段的搜索和过滤理论上比文本字段更快。一般来说,您将具有非聚集的数字主键,并在您要经常过滤的数据列上创建一个聚集键。
这些是编写SQL的一般标准,但是当涉及基准测试时,您只会发现varchar列在连接和过滤方面比整数列略慢一点。只要您的主键永远不会更改,那么您就没问题了。

16
“这个表格将不得不在索引中移动,以便将香蕉插入到中间。” 这个信息是错误的,特别是因为原帖提到了PostgreSQL,它不会根据主键对记录进行排序。请参考:https://dev59.com/NWYs5IYBdhLWcg3wDPit#13191075 - Tobia
2
@Tobia 正确,但海报明确表示“在索引中移动”。索引中的条目显然是有序的。 - enobayram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接