为什么负面的id或零被视为不良做法?

时间:2012-01-19 14:29:47

标签: database database-design primary-key identifier least-astonishment

在数据库表中插入主键时,为什么将负ID或零视为不良做法?

我认为它在某些情况下可能有用,但人们说不推荐,尽管他们从不说/知道原因。

所以,我想知道是否存在,根据定义,是否存在某些限制,或者它是否应该没有任何问题,或者它是否只是一个约定,如果确实存在一些限制,为什么不阻止该功能?

3 个答案:

答案 0 :(得分:25)

要清楚,这个问题和答案是关于使用代号键的负数而不是自然键。

据我所知,有三个理由认为这是一种不好的做法。

  1. 违反了principle of least surprise
  2. 有些人认为所有身份证号码都是非负数。
  3. 有些人使用负数表示错误。
  4. 第一个有一定的效力。您永远不会在SO上看到使用负ID号的SQL示例或答案。 (我将从今天开始改变它。)

    第二个和第三个是第一个的推论,因为程序员经常假设没有惊喜的行为。 (这让我想起发现VBA会让我乘以两个日期,返回一个可以用方形日期表达的数字。)

    对于2号,应用程序员可能会因为不允许登录UI代码而引入细微错误,这可能会使-123456看起来像123456.

    第三个与编写返回id号的代码有关。返回单个id号的代码可能会返回-1作为错误代码。但在大多数情况下,-1是有效的ID号。 (大多数数据库不会将id号限制在非负整数范围内。)

答案 1 :(得分:9)

@Mike Sherrill的回答' Cat Recall'是恕我直言。

否定:不对ID使用否定的原因是负数不可移植。十进制值的二进制表示取决于基础数值体系结构,这会影响负十进制值以非负流式格式(例如,十六进制,base36等)呈现的方式。类似地,一个人不使用浮点值作为标识符,即使在单一架构的约束下,它在理论上也是可能的。

零:零可以作为ID。不建议这样做,因为它通常表示空字段/ NULL值。

答案 2 :(得分:0)

有超过5100万个网站在讨论这个问题。

我同意@Mike Sherrill并且很可能常见的是NULLs / Empty字段或Negative Ids在确定真值时会产生严重问题。它完全没有任何信息用途,只会导致数据库本身的错误答案和不信任。

允许零值,列中的负值会为数据库带来全新的不确定性。必须由SQL程序员进行猜测,以便对数据库中NULL值的错误结果进行计数。