ID列的推荐数据类型是什么?

Tom*_*han 7 language-agnostic database-design types primary-key database-agnostic

我意识到这个问题之前很可能已被问过,但我在StackOverflow上搜索了一些问题,我没有真正找到答案,所以这里有.如果您发现重复,请链接到它.

出于某种原因,我更喜欢在我的主键字段中使用Guids(uniqueidentifier在MsSql中),但我真的不知道为什么这会更好.在许多教程中,我最近走了一段时间,int使用了自动递增.我可以看到两者的专业和缺点:

  • A Guid总是具有相同的大小和长度,并且没有理由担心耗尽它们,而在你用完一个数字之前,你可以拥有多少记录int.
  • int (至少在C#中)是一个可空类型,在查询数据时会打开几个快捷方式.
  • 而且int更容易阅读.
  • 我打赌你可以在这里提出至少几件事.

因此,就像标题所说的那样简单:数据库中ID(主键)列的推荐数据类型是什么?

编辑:收到几个简短的答案后,我还必须添加这个后续问题.没有它,你的答案既不引人注目也不教育...;)为什么你这么认为,另一种选择的缺点是什么让你选择呢?

cle*_*tus 8

任何足以存储预期数据范围的整数类型.对于具有大量行或更改的表,通常将32位整数视为太小(正确或错误).一个64位的int就足够了.许多数据库不会或不会使用该整数类型,但会使用具有指定比例和精度的NUMBER类型.10-15位是一个相当常见的大小.

选择整数类型的原因有两个:

  1. 尺寸; 和
  2. 速度.

整数的大小是:

  • 32位:4个字节;
  • 64位:8个字节;
  • 二进制编码的十进制:每个字节两位数加上符号,比例和/或精度的字节数.

将其与GUID进行比较,后者是128位或普通字符串,每个字符至少有一个字节(某些字符编码更多)加上可能只有一个字节的开销(终止为空)或者可能更多在某些情况下.

对整数进行排序是微不足道的,并且假设它们是唯一的并且范围足够小,实际上可以在O(n)时间内完成,与最多O(n log n)相比.

同样重要的是,大多数数据库可以通过自动增量列和/或序列生成唯一ID.实际上,保证应用程序的唯一性实际上非常困难并且往往会导致密钥膨胀.

加上自动生成的整数键通常是松散或绝对有序的(取决于数据库和配置),这是一个有用的质量.随机生成的GUID基本上是无序的,这远没那么有用.


dwc*_*dwc 6

流行的数据库现在允许更大的自动增量字段,所以它不是一个问题.

至于使用什么,它总是一个选择.一个并不明显优于另一个,它们具有不同的特征,并且在不同的情况下各自都很好.随着时间的推移,我已经使用了两个,而我使用的下一个模式我将考虑两者.

GUID的优点:

  • 在计算机上应该是唯一的.
  • 随机,不可取的粘性意味着人们可能将其用于不透明标识符的预期目的.

自动增量的优点:

  • 人类可以理解.
  • 顺序分配意味着您可以使用聚簇索引和影响性能.
  • 适用于数据分区.


Phi*_*ert 5

使用GUID密钥的一大缺点是难以手动执行"临时"查询.有时,您可以这样做非常有用:

SELECT*FROM User,其中UserID = 452245

使用GUID键,这会变得非常烦人.

我推荐64位整数