提问人:falsarella 提问时间:1/19/2012 最后编辑:falsarella 更新时间:2/5/2018 访问量:24150
为什么负 id 或零被认为是一种不好的做法?
Why is negative id or zero considered a bad practice?
问:
为什么在数据库表中插入主键时,负 id 或零被认为是一种不好的做法?
我认为它在某些情况下可能有用,但人们说不推荐它,尽管他们从未说过/知道为什么。
所以,我想知道根据定义,是否存在一些限制,或者它是否应该有任何问题,或者它是否只是一个约定,如果真的有一些限制,为什么这个功能没有被阻止?
答:
需要明确的是,这个问题和答案是关于对代理键使用负数,而不是对自然键使用负数。
据我所知,有三个原因认为这是一种不好的做法。
- 它违反了最小意外原则。
- 有些人认为所有身份证号码都是非负数。
- 有些人使用负数来表示错误。
第一个有一定的道理。您永远不会在 SO 上看到使用负 ID 号的 SQL 示例或答案。(从今天开始,我将改变这一点。
第二和第三种是第一种的推论,因为程序员经常假设没有意外的行为。(这让我想起了发现 VBA 会让我将两个日期相乘,返回一个数字,我猜这个数字会用方形日期表示。
对于第 2 点,应用程序程序员可能会通过不为登录 UI 代码留出空间而引入细微的错误,这可能会使 -123456 看起来像123456。
第三个与编写返回 ID 号的代码有关。返回单个 ID 号的代码可能会返回 -1 作为错误代码。但在大多数情况下,-1 是有效的 ID 号。(大多数数据库不会将 ID 号限制在非负整数范围内。
评论
@Mike Sherrill 的答案“猫召回”恕我直言,这是不正确的。
负数:不对 ID 使用负数的原因是负数不可移植。十进制值的二进制表示取决于底层数字体系结构,这会影响负十进制值以非负流格式(例如十六进制、base36 等)呈现的方式。同样,人们不使用浮点值作为标识符,即使在单个体系结构的约束下,理论上也是可能的。
零:零可以作为 ID。但是不建议这样做,因为它通常表示空字段/NULL 值。
评论
有超过 5100 万个网站在讨论这个问题。
我同意 Sherrill @Mike的观点,NULL/空字段或负 ID 在确定真实值时可能会造成严重问题,这很常见。它根本没有信息目的,只会导致不正确的答案和对数据库本身的不信任。
在列中允许零值,负值会给数据库带来全新的不确定性。SQL 程序员必须进行猜测,以计数数据库中 NULL 值的错误结果。
上一个:多层架构中的默认函数值
评论