在数据库的整数列中使用 `null` 或 `-1` 表示 "infinite" 更好吗

Is it better to use `null` or `-1` to indicate "infinite" in integer columns of the database

我的数据库中经常有存储 "a number or infinite" 的字段。示例可以是 maxFileSizemaxUsers 等。可以设置最大值或根本不限制它。 我目前有时用null表示"infinite / no restriction",有时用-1.

我想知道是否有任何理由使用其中之一。作为记录,如果重要的话,我使用 PHP / MySQL / Doctrine / Symfony。

编辑

我不是在征求意见,而是在征求与 -1null 的使用相关的事实(正如您在已经给出的答案中看到的那样)。这些可能包括速度、查询复杂性、数据库大小等。

恕我直言

null - 在许多情况下,任何框架或查询都期望为 emptynot defined 值。但是如果您尝试使用 -1 或其他任何东西。某些查询函数 SUM()、AVG() 等可能会被此值破坏。

所以我认为没有理由养成坏习惯。 null 是 null 大家都知道 null 可以存在于 table 中,表示 emptynot defined.

如果你放置 -1 意味着 不为空 定义 所以对我来说这是绝对相反的值。

请问能不能用1代替0true代替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 一样,开始时无害,但后来变得相关,这意味着您需要一个新的、更神奇的数字来代替它。

这使得定义 minmax 可能是 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();,您甚至可以通过适当地限制数据库列来防止被零除。
  • 您可以进一步扩展逻辑以映射更多状态。