主键为文本

art*_*rxe 26 sql primary-key foreign-key-relationship sqldatatypes postgresql-9.1

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

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

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

DF_*_*DF_ 19

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

缺点如下:

  1. 在PostgreSQL中,串行数据类型正是出于这个原因
  2. 将按顺序输入数字索引,并且需要进行最小的重建索引(即如果您有一个带有Apple,Carrot键并且想插入Banana的表,则表必须在索引周围移动,以便将Banana插入到中间如果索引是数字的话,你很少会在索引中间插入数据.
  3. 从数据中取消链接的数字索引不会改变.
  4. 数字索引较短,其长度可以固定(4个字节与您选择的varchar长度相比).

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

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

  • *"表必须在索引周围移动,以便香蕉插入中间"*这个信息是错误的,特别是因为OP提到PostgreSQL,它不会**根据主键订购记录.请参阅:http://stackoverflow.com/a/13191075/517371 (8认同)
  • @Tobia正确,但海报特别说“移动索引”。索引中的条目显然是有序的。 (2认同)