作为主键的字符串与数值数据类型
欢迎回到这个为关系数据库选择主键的系列。在第 1 部分中,我们介绍了自然主键和代理主键,并考虑了什么因素决定选择哪一种。今天的部分将探讨字符串和数值数据类型,看看哪种更适合作为主键。
关系数据库中的字符串和数值数据类型
字符串和数值实际上都是包含了几种不同数据类型的总称。对于初学者来说,字符串数据类型是一个通用的 IT 术语,传统上指的是一组字符序列,可以是文字常量,也可以是某种变量。在数据库方面,以 CHAR 类型表示的单个字符也归类为字符串。其他数据库字符串数据类型包括 VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET。而数值数据类型既包括精确数值数据类型,例如 INTEGER、SMALLINT、DECIMAL 和 NUMERIC,也包括近似数值数据类型,例如 FLOAT、REAL 和 DOUBLE PRECISION。
辩论
关于哪种数据类型最适合做主键(PK)的建议在互联网上比比皆是。一些网站直接表示数值键几乎总是优于基于字符的键,而同等数量的网站则提倡使用字符串类型。同时,数据库供应商本身也不会建议使用哪种类型。他们只提供关于 PRIMARY KEY 约束的说明。它可唯一标识表中的每条记录并规定:
- 主键必须是唯一值,不能含有 NULL 值。
- 一个表只能有一个主键;在表中,主键可以由单个或多个列(字段)组成。
- 主键值不应随时间而改变。
就数据库供应商而言,只要你的主键满足上述标准,那么您就可以开始了。但这并不意味着一种类型可能比另一种优越。现在,让我们深入研究这些类型。
支持数值类型
当我第一次学习数据库开发时,有人告诉我,数值类型最适合作为主键,因为它们速度更快,又节约内存。我的第一个雇主联邦政府证实了这种观点,他们使用了数值主鍵,即使这意味着添加一个代理键
有很多知名的参考网站都回应了这种观点。Mysqltutorial.org 在谈到 MySQL 时指出:
因为 MySQL 处理整数速度更快,所以主键列的数据类型应该是整数,例如 INT、BIGINT。并且你应该确保主键的整数类型的值范围足以存储表可能有的行数。
MySQL 在处理数字数据方面远非独一无二。关于 Oracle 主键的”另一页指出“主键通常是数字,因为 Oracle 处理数字的速度通常比任何其他数据类型更快。”
他们甚至说主键中的数据应该是“无意义的”:
有时,你可能希望对主键使用被认为是唯一的有意义的数据,例如社会安全号码(SSN)、车辆识别号码(VIN)、电子邮件和电话号码。但是,你不知道电子邮件或电话号码何时会更改或被其他人重复使用。在这种情况下,会产生很多数据问题。在数据库世界中,人工键被称为代理键,与自然主键相反。
下周预告...
到目前为止,数值主键似乎是最好的主键。但是,我们还没有听取支持字符串一方的意见。也许他们有一些使用字符串代替数值的充分理由。