在数据库的整数列中使用 `null` 或 `-1` 表示 "infinite" 更好吗
Is it better to use `null` or `-1` to indicate "infinite" in integer columns of the database
我的数据库中经常有存储 "a number or infinite" 的字段。示例可以是 maxFileSize
、maxUsers
等。可以设置最大值或根本不限制它。
我目前有时用null
表示"infinite / no restriction",有时用-1
.
我想知道是否有任何理由使用其中之一。作为记录,如果重要的话,我使用 PHP / MySQL / Doctrine / Symfony。
编辑:
我不是在征求意见,而是在征求与 -1
或 null
的使用相关的事实(正如您在已经给出的答案中看到的那样)。这些可能包括速度、查询复杂性、数据库大小等。
恕我直言
null
- 在许多情况下,任何框架或查询都期望为 empty 或 not defined 值。但是如果您尝试使用 -1 或其他任何东西。某些查询函数 SUM()、AVG() 等可能会被此值破坏。
所以我认为没有理由养成坏习惯。 null 是 null 大家都知道 null 可以存在于 table 中,表示 empty 或 not defined.
如果你放置 -1
意味着 不为空 和 定义 所以对我来说这是绝对相反的值。
请问能不能用1
代替0
,true
代替false
?
如果您的值已定义且不为空 - 您可以使用任何您想要的值。
如果您的值未定义 and/or 上下文是 值是 empy 我建议不要使用任何等于 null 的东西。
如果您要使用整数来存储一个值并且要存储一个非常大的值,那么请使用 2,147,483,647。这是您可以放入字段中的最大值,因此它在字段允许的范围内尽可能接近无穷大。
-1 和 NULL
都有问题。例如,可能尚未设置该值。这似乎是 NULL
比表示某个任意值更合理的用法。并且使用特殊值需要复杂的逻辑:
where users < maxusers or maxusers is null
where users < maxusers or maxusers = -1
这种专门的逻辑使查询更难优化。如果您使用可以存储在字段中的最大值,这不是问题。
顺便说一下,我不经常遇到数字的这个问题,但是日期很常见。通常 "end dates" 在表中缓慢变化的维度将类似于:'9999-01-01' 或 '4195-01-01'。这些代表了遥远未来的某个任意点。而且,出于优化目的,它们通常比使用 NULL
.
更容易
NULL
的意思是 "no limit" 在这里是完全合理的。使用实际的整数值必然会导致问题。
"Magic numbers" 像 -1 一样,开始时无害,但后来变得相关,这意味着您需要一个新的、更神奇的数字来代替它。
这使得定义 min
和 max
可能是 NULL
的边界变得容易,而不是使用一些任意大或小的值。
您也可以选择在数据库中使用 两个 字段来获得结果:
file_quota int NOT NULL DEFAULT 50000,
file_quote_is_limited boolean NOT NULL DEFAULT true
有几种存储 boolean values in MySQL 的方法,与简单地将无限存储为 NULL
相比,这当然会影响数据库大小,具体取决于您的规模。但是,这种技术有一些优点:
- 即使您没有记录
NULL
表示无限制,但在看到映射时,它的含义会更加清楚。 (考虑新开发者等)
- 不可能在您的代码中找到
if (null == $obj->getFileQuota()) {
或类似的结构。这些片段通常很臭而且不便于维护。
- 查询的复杂性取决于您要实现的目标,但这两个字段不会增加不可预见的复杂性。事实上,它更容易理解正在发生的事情:
where file_quota < 50000 or file_quota is null
对比
where file_quota < 50000 or ! file_quota_is_limited
(取反取决于你选择的数据类型来映射布尔值,但 Doctrine 应该处理这个)
- 如果您的代码中碰巧有
$usage = $usedFiles / $user->getFileQuota();
,您甚至可以通过适当地限制数据库列来防止被零除。
- 您可以进一步扩展逻辑以映射更多状态。
我的数据库中经常有存储 "a number or infinite" 的字段。示例可以是 maxFileSize
、maxUsers
等。可以设置最大值或根本不限制它。
我目前有时用null
表示"infinite / no restriction",有时用-1
.
我想知道是否有任何理由使用其中之一。作为记录,如果重要的话,我使用 PHP / MySQL / Doctrine / Symfony。
编辑:
我不是在征求意见,而是在征求与 -1
或 null
的使用相关的事实(正如您在已经给出的答案中看到的那样)。这些可能包括速度、查询复杂性、数据库大小等。
恕我直言
null
- 在许多情况下,任何框架或查询都期望为 empty 或 not defined 值。但是如果您尝试使用 -1 或其他任何东西。某些查询函数 SUM()、AVG() 等可能会被此值破坏。
所以我认为没有理由养成坏习惯。 null 是 null 大家都知道 null 可以存在于 table 中,表示 empty 或 not defined.
如果你放置 -1
意味着 不为空 和 定义 所以对我来说这是绝对相反的值。
请问能不能用1
代替0
,true
代替false
?
如果您的值已定义且不为空 - 您可以使用任何您想要的值。
如果您的值未定义 and/or 上下文是 值是 empy 我建议不要使用任何等于 null 的东西。
如果您要使用整数来存储一个值并且要存储一个非常大的值,那么请使用 2,147,483,647。这是您可以放入字段中的最大值,因此它在字段允许的范围内尽可能接近无穷大。
-1 和 NULL
都有问题。例如,可能尚未设置该值。这似乎是 NULL
比表示某个任意值更合理的用法。并且使用特殊值需要复杂的逻辑:
where users < maxusers or maxusers is null
where users < maxusers or maxusers = -1
这种专门的逻辑使查询更难优化。如果您使用可以存储在字段中的最大值,这不是问题。
顺便说一下,我不经常遇到数字的这个问题,但是日期很常见。通常 "end dates" 在表中缓慢变化的维度将类似于:'9999-01-01' 或 '4195-01-01'。这些代表了遥远未来的某个任意点。而且,出于优化目的,它们通常比使用 NULL
.
NULL
的意思是 "no limit" 在这里是完全合理的。使用实际的整数值必然会导致问题。
"Magic numbers" 像 -1 一样,开始时无害,但后来变得相关,这意味着您需要一个新的、更神奇的数字来代替它。
这使得定义 min
和 max
可能是 NULL
的边界变得容易,而不是使用一些任意大或小的值。
您也可以选择在数据库中使用 两个 字段来获得结果:
file_quota int NOT NULL DEFAULT 50000,
file_quote_is_limited boolean NOT NULL DEFAULT true
有几种存储 boolean values in MySQL 的方法,与简单地将无限存储为 NULL
相比,这当然会影响数据库大小,具体取决于您的规模。但是,这种技术有一些优点:
- 即使您没有记录
NULL
表示无限制,但在看到映射时,它的含义会更加清楚。 (考虑新开发者等) - 不可能在您的代码中找到
if (null == $obj->getFileQuota()) {
或类似的结构。这些片段通常很臭而且不便于维护。 - 查询的复杂性取决于您要实现的目标,但这两个字段不会增加不可预见的复杂性。事实上,它更容易理解正在发生的事情:
where file_quota < 50000 or file_quota is null
对比
where file_quota < 50000 or ! file_quota_is_limited
(取反取决于你选择的数据类型来映射布尔值,但 Doctrine 应该处理这个) - 如果您的代码中碰巧有
$usage = $usedFiles / $user->getFileQuota();
,您甚至可以通过适当地限制数据库列来防止被零除。 - 您可以进一步扩展逻辑以映射更多状态。