为什么数据库设计者不会使IDENTITY列从最小值而不是1开始?

hou*_*sam 40 sql database sql-server database-design

我们知道,在Sql Server中,IDENTITY (n,m)意味着值将从n,并且增量值是m,但我注意到所有数据库设计者都将Identity列设为IDENTITY(1,1),而不利用来自的所有int数据类型的值(-2,147,483,648) to (2,147,483,647),

我打算将所有标识列设为IDENTITY (-2,147,483,648, 1),(标识列对应用程序用户是隐藏的).

这是一个好主意吗 ?

Jon*_*nna 55

如果您发现20亿个价值是不够的,你会发现,40亿是不够的是(需要多一倍的更多的东西在一个项目的生命周期,比它最早是专为,是很难罕见的*),所以你需要完全采取不同的方法(可能是长值,可能是完全不同的东西).

否则你只是变得奇怪而且无法获得.

此外,谁没有数据库,他们知道例如项目312是具有测试特定事物的一些很好特征的数据库?我知道我脑子里有一些任意的ids.他们可能会称之为"他们两次命名这么好",但我总是将纽约称为"657城市,涵盖了我们的大部分测试案例".这只是一个速记,但-2147482991不会那么方便.

*添加一点.有些事情,你可能会说"啊约100",发现它实际上是110,好吧.与其他人一起,实际上你会发现它实际上只有10万 - 你已经达到了数量级.数字越大,这种错误就越频繁,因为这种问题最终导致数十亿的估计数与最终数十亿的答案结果不同.如果您估计在给定的情况下200是您的最大值,那么您应该留出可能还有几百个空间.如果你估计在特定情况下有20亿,你应该留出几千万亿的空间.也就是说,我唯一一次看到有人真正开始在零下20亿的身份时,他们最终拥有大约3,000行.

  • 我想起了一个客户问我有关为特定目的耗尽ID的可能性的时间.我指出,如果没有让这些项目成为亿万富翁,就不可能在这个特定的项目中发生,所以他们可能能够负担得起以后调整它的工作. (37认同)
  • 数十亿评论的+1.如果您确实发现*需要*由于数据大小而导致负数,那么您可能无法正确存储数据.存档旧数据.如果您仍在报告项目40亿条目,那么您做错了. (3认同)
  • @deltree如果你真的需要这么多数据,你只需要16GB存储指标,你就有了非常专业的数据存储需求,单个SQLServer安装不太可能削减它. (2认同)

And*_*ttó 9

在SQL Server端,负ID-s是正常的,像正数一样处理,所以你可以这样做.

其他是正确的,您应该考虑不同的建议,但主要问题是连接到您的数据库的应用程序.

让我们来看看MS环境.下面是一个示例: .NET DataSet自动增量的 id-s 上使用负ID来跟踪代码中的更改.所以你可能会遇到麻烦,因为:

负键用于行的临时实例.

以下是参考:MSDN

因此,在MS环境中为MSSQL设计这样的数据库并不是一个好主意.


小智 9

如果你的代码中有一个代表你的表的类(很可能会发生),那么每次创建一个新对象时,默认情况下都会为它分配ID 0.如果已经分配了ID 0,则可能导致覆盖数据库中的数据的错误.这也可以很容易地确定一个对象是新的还是来自数据库的if (myObject.ID != 0)


Stu*_*tLC 5

使用接近零的整数的"好"副作用之一是它们易于使用,易于开发人员,测试人员等,特别是在调试和单元测试时.

此外,代理密钥有一种习惯性地悄悄进入商业术语的习惯,例如,用户可能会看到位于浏览器顶部的URL查询字符串中的PK - 数字越多,他们就越有可能错误地引用某些内容.在帮助台查询中.

所以这就是为什么我很高兴我的身份在1而不是在-2147483231,而不是像@Jon所建议的那样,BIGINT随时可能需要超过2在我的表中十亿行.


小智 5

当您从负数转换为正数时,您将越过零.这意味着(假设您实际上插入了几十亿行),最终您的标识符为零.这本身并不坏,但可能为ORM工具提供潜在的边缘情况,或者只是简单的应用程序代码,难以区分零和零.