主键为文本

时间:2013-03-18 12:36:02

标签: sql primary-key foreign-key-relationship postgresql-9.1 sqldatatypes

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

有人可以告诉我在SQL中为主键选择字符变化数据类型的优缺点是什么?以上前提是多少?

N.B。:(我正在使用 PostgreSQL 数据库)。我还在处理一种情况,当你需要从另一个表引用这样一个表时,因此将外键放在字符变化数据类型上。请同时考虑到这一点。

1 个答案:

答案 0 :(得分:15)

选择字符数据类型作为主键字段的优点是您可以选择它可以显示的数据。例如,您可以将电子邮件地址作为users表的关键字段。无需额外的色谱柱。另一个优点是如果你有一个公共数据表来保存多个其他表的索引(想想一个带有对FINANCE,CONTACT和ADMIN表的外部引用的NOTES表),你可以很容易地知道它来自哪个表(例如你的FINANCE表)索引为F00001,CONTACT表索引为C00001等。我担心这个答案中的缺点会更大,因为我反对这种做法。

缺点如下:

  1. 在PostgreSQL
  2. 中出现这种串行数据类型的原因正是如此
  3. 将按顺序输入数字索引,并且需要进行最少的重建索引(例如,如果您有一个带有Apple,Carrot键并希望插入Banana的表,则表必须在索引周围移动以便插入Banana如果索引是数字的话,你很少会在索引中间插入数据。
  4. 与数据无关的数字索引不会发生变化。
  5. 数字索引较短,长度可以固定(4个字节与您选择的varchar长度相比)。
  6. 在你的情况下你仍然可以在数字索引上放一个外键,所以我不确定你为什么要强制它成为一个varchar类型。理论上,搜索和过滤数字字段比文本字段更快,因为服务器将被强制首先转换数据。一般来说,您将拥有一个非群集的数字主键,然后在您要过滤的数据列上创建一个聚簇键。

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