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行.
小智 9
如果你的代码中有一个代表你的表的类(很可能会发生),那么每次创建一个新对象时,默认情况下都会为它分配ID 0.如果已经分配了ID 0,则可能导致覆盖数据库中的数据的错误.这也可以很容易地确定一个对象是新的还是来自数据库的if (myObject.ID != 0)
使用接近零的整数的"好"副作用之一是它们易于使用,易于开发人员,测试人员等,特别是在调试和单元测试时.
此外,代理密钥有一种习惯性地悄悄进入商业术语的习惯,例如,用户可能会看到位于浏览器顶部的URL查询字符串中的PK - 数字越多,他们就越有可能错误地引用某些内容.在帮助台查询中.
所以这就是为什么我很高兴我的身份在1而不是在-2147483231,而不是像@Jon所建议的那样,BIGINT随时可能需要超过2在我的表中十亿行.
小智 5
当您从负数转换为正数时,您将越过零.这意味着(假设您实际上插入了几十亿行),最终您的标识符为零.这本身并不坏,但可能为ORM工具提供潜在的边缘情况,或者只是简单的应用程序代码,难以区分零和零.