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

时间:2009-07-09 17:13:57

标签: sql database-design

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

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:8)

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

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

因此,漂浮很好。

答案 2 :(得分:6)

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

答案 3 :(得分:2)

是NUMERIC(x,y)格式还是IDENTITY?如果是这样,它可能是从旧版本的SQL Server升级。当天的IDENTITY只能是NUMERIC格式,而不是我们今天使用的常用INT。

否则,无法判断浮点数是否适合作为主键 - 它取决于您的域名。比较有点困难(IEEE INT比浮点数更高效),大多数人使用单调增加的数字(IDENTITY),因此整数通常是人们真正想要的。

因为看起来你正在存储整数:

更直接地回答原始问题:如果要存储整数,请使用整数数据类型。存储和比较效率更高。

答案 4 :(得分:1)

我已经在Cerner Millenium数据库工作了几年(在使用Oracle的封面下)。最初,我很惊讶地看到它在表格上使用了浮动ID。然后我在我们的数据库中遇到了一个ID> 2 ^ 32和我写的查询给出了错误的结果,因为我错误地将它转换为INT我意识到他们为什么这样做了。我没有发现上面的任何论据反对在现实世界中使用浮点数具有说服力,对于你只需要数字的关键字"稍大一些"比2 ^ 32和ID的值总是######。0的形式。 (没有人在谈论######形式的ID。######。)但是现在我们将这些数据导入SQL Server仓库,并且bigint可用,我们将会去用bigint而不是浮动。

答案 5 :(得分:1)

仅供参考 - 还有另一种方式来看待这个:

我从事实时过程控制,因此,我的大多数行条目都是基于时间的,并且由非ASCII机器自动生成。时间 - 这是我的用户经常搜索的内容,以及我的许多用户'实际上是机器本身。因此,基于UTC的主键。