32

在我学习期间(大约 4 年前)所学的数据库课程中,我认为建议避免使用字符串作为主键的数据类型。

有人能告诉我在 SQL 中为主键选择字符变化数据类型的优缺点是什么,以及上述前提在多大程度上是正确的?

注意:(我使用的是PostgreSQL数据库)。当您需要从另一个表中引用这样的表时,我也在处理一种情况,从而将外键放在字符变化的数据类型上。请也考虑到这一点。

4

1 回答 1

29

选择字符数据类型作为主键字段的优点是您可以选择它可以显示的数据。例如,您可以将电子邮件地址作为用户表的键字段。这消除了对额外列的需要。另一个优点是,如果您有一个包含多个其他表的索引的公共数据表(想象一个带有对 FINANCE、CONTACT 和 ADMIN 表的外部引用的 NOTES 表),您可以轻松知道它来自哪个表(例如您的 FINANCE 表索引为 F00001,CONTACT 表的索引为 C00001,以此类推)。恐怕这个答复的缺点会更大,因为我反对这种方法。

缺点如下:

  1. 在 PostgreSQL 中正是因为这个原因而存在串行数据类型
  2. 将按顺序输入数字索引,并且需要进行最少的重新索引(即,如果您有一个带有 Apple、Carrot 键的表并且想要插入 Banana,则该表必须围绕索引移动,以便将 Banana 插入中间. 如果索引是数字,你很少会在索引中间插入数据)。
  3. 与数据取消链接的数字索引不会改变。
  4. 数字索引更短,并且它们的长度可以固定(4 个字节与您选择的任何 varchar 长度)。

在您的情况下,您仍然可以将外键放在数字索引上,所以我不确定您为什么要强制它成为 varchar 类型。理论上,在数字字段上搜索和过滤比文本字段更快,因为服务器将被迫首先转换数据。一般来说,您将拥有一个非聚集的数字主键,然后在您将要过滤的数据列上创建一个聚集键。

这些是编写 SQL 时的通用标准,但在进行基准测试时,您只会发现 varchar 列在连接和过滤方面比整数列慢一点。只要你的主键没有改变,那么你就没事。

于 2013-03-18T13:27:10.997 回答