理智检查:浮动作为主键?

Gra*_*ett 12 sql database-design

我正在使用旧的SQL Server 2000数据库,将其中的一些信息与我正在构建的新应用程序混合.我注意到几个表中的一些主键是浮点数而不是任何类型的整数.它们不是外键,而且都是独一无二的.我想不出任何人会想让他们唯一的主键ID浮动,但我不是任何SQL专家.所以我想我所问的是,设计这个相当广泛的数据库的人是否知道我不知道的事情?

Sha*_*nce 8

我曾与在SQL Server数据库中使用浮动作为PK的人一起工作.如果他坚持使用INT,他担心标识符用完了.(在SQL Server上32位.)他只是看了浮动的范围,并没有想到这个事实没关系,对于较大的数字,由于精度有限,数字中没有数字.因此,他接受MAX(PK)+ 1.0的代码会在某个时刻返回一个等于MAX(PK)的数字.不好.我终于说服他不要使用float代替未来数据库的代理主键.他在修复他正在处理的数据库之前就辞职了.

要回答你的问题,"所以我想我所问的是,设计这个相当广泛的数据库的人是否知道我不知道的事情?" 很可能没有!至少不是选择数据类型.


GSe*_*erg 8

我目前正在使用一个相当大的会计软件包,其中350多个表中的每一个都有FLOAT的主键(53).所有实际值都是整数,系统严格检查它们确实是(有特殊函数可以完成所有递增工作).

我确实对这个设计感到好奇,但我能理解它为什么被选中并给它一些学分.一方面,系统足够大,在某些表中有十亿条记录.另一方面,这些主键必须能够从Excel或VB6等外部应用程序中轻松读取,在这种情况下,您并不想让它们成为BIGINT.

因此,漂浮是好的.


Mar*_*som 6

浮点数有一个有趣的属性:总是可以在两个其他值之间插入一个值,除了用完比特的病态情况.它的缺点是代表性问题可能使您无法通过密钥引用行; 很难使两个浮点值彼此相等.

  • 原则上,如果你想要这些属性,我认为你总是可以添加一个包含float的索引列,以及int主键. (2认同)
  • 对于提问者的具体案例来说,这听起来并不是正确的答案......但无论如何你都会因为下一个人搜索这个问题而得到一个有趣且可能的答案而被投票. (2认同)