Tom*_*han 7 language-agnostic database-design types primary-key database-agnostic
我意识到这个问题之前很可能已被问过,但我在StackOverflow上搜索了一些问题,我没有真正找到答案,所以这里有.如果您发现重复,请链接到它.
出于某种原因,我更喜欢在我的主键字段中使用Guids(uniqueidentifier在MsSql中),但我真的不知道为什么这会更好.在许多教程中,我最近走了一段时间,int使用了自动递增.我可以看到两者的专业和缺点:
Guid总是具有相同的大小和长度,并且没有理由担心耗尽它们,而在你用完一个数字之前,你可以拥有多少记录int.int (至少在C#中)是一个可空类型,在查询数据时会打开几个快捷方式.int更容易阅读.因此,就像标题所说的那样简单:数据库中ID(主键)列的推荐数据类型是什么?
编辑:收到几个简短的答案后,我还必须添加这个后续问题.没有它,你的答案既不引人注目也不教育...;)为什么你这么认为,另一种选择的缺点是什么让你不选择呢?
任何足以存储预期数据范围的整数类型.对于具有大量行或更改的表,通常将32位整数视为太小(正确或错误).一个64位的int就足够了.许多数据库不会或不会使用该整数类型,但会使用具有指定比例和精度的NUMBER类型.10-15位是一个相当常见的大小.
选择整数类型的原因有两个:
整数的大小是:
将其与GUID进行比较,后者是128位或普通字符串,每个字符至少有一个字节(某些字符编码更多)加上可能只有一个字节的开销(终止为空)或者可能更多在某些情况下.
对整数进行排序是微不足道的,并且假设它们是唯一的并且范围足够小,实际上可以在O(n)时间内完成,与最多O(n log n)相比.
同样重要的是,大多数数据库可以通过自动增量列和/或序列生成唯一ID.实际上,保证应用程序的唯一性实际上非常困难并且往往会导致密钥膨胀.
加上自动生成的整数键通常是松散或绝对有序的(取决于数据库和配置),这是一个有用的质量.随机生成的GUID基本上是无序的,这远没那么有用.
流行的数据库现在允许更大的自动增量字段,所以它不是一个问题.
至于使用什么,它总是一个选择.一个并不明显优于另一个,它们具有不同的特征,并且在不同的情况下各自都很好.随着时间的推移,我已经使用了两个,而我使用的下一个模式我将考虑两者.
GUID的优点:
自动增量的优点:
使用GUID密钥的一大缺点是难以手动执行"临时"查询.有时,您可以这样做非常有用:
SELECT*FROM User,其中UserID = 452245
使用GUID键,这会变得非常烦人.
我推荐64位整数