Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用'null'或'-1'表示'quot;“无限”;在数据库的整数列中_Php_Mysql_Database_Doctrine Orm_Storage - Fatal编程技术网

Php 使用'null'或'-1'表示'quot;“无限”;在数据库的整数列中

Php 使用'null'或'-1'表示'quot;“无限”;在数据库的整数列中,php,mysql,database,doctrine-orm,storage,Php,Mysql,Database,Doctrine Orm,Storage,我的数据库中经常有存储“数字或无限”的字段。例如,maxFileSize,maxUsers,等等。可以设置最大值,或者根本不限制它。 我目前有时使用null表示“无限/无限制”,有时使用-1 我想知道是否有任何理由使用这个或那个。作为记录,我使用PHP/MySQL/doctor/Symfony,如果这很重要的话 编辑: 我不是要征求意见,而是要了解与-1或null使用相关的事实(如您在前面给出的答案中所看到的)。这些可能包括速度、查询复杂度、数据库大小等等。仅此而已 null-在许多情况下,任何

我的数据库中经常有存储“数字或无限”的字段。例如,
maxFileSize
maxUsers
,等等。可以设置最大值,或者根本不限制它。 我目前有时使用
null
表示“无限/无限制”,有时使用
-1

我想知道是否有任何理由使用这个或那个。作为记录,我使用PHP/MySQL/doctor/Symfony,如果这很重要的话

编辑

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

仅此而已

null
-在许多情况下,任何框架或查询都会将其预期为空值未定义值。但是如果您尝试使用-1或其他任何东西。某些查询函数SUM()、AVG()等可能会被此值打断

所以我认为没有理由养成坏习惯。null是null,每个人都知道null可以存在于表中,表示为空未定义

如果您将
-1
放在此处,则表示不为空已定义,因此对我来说,这是绝对相反的值

你能问一下我们是否可以用
1
代替
0
true
代替
false

如果您的值已定义且不为空,则可以使用任何您想要的值


如果没有定义值和/或上下文是value是empy,我建议不要使用等于null的任何值。

如果要使用整数存储值,并且要存储非常大的值,则使用2147483647。这是您可以在字段中输入的最大值,因此它尽可能接近字段允许的无穷大

-1和
NULL都有问题。例如,可能尚未设置该值。对于
NULL
来说,这似乎比表示任意值更合理。使用特殊值需要复杂的逻辑:

where users < maxusers or maxusers is null
where users < maxusers or maxusers = -1
其中users
这种特殊的逻辑使得查询更难优化。如果使用可存储在字段中的最大值,则这不是问题


顺便说一句,我在数字方面不经常遇到这个问题,但在日期方面很常见。对于缓慢变化的维度,表中的“结束日期”通常类似于:“9999-01-01”或“4195-01-01”。这些代表了遥远未来的某些任意点。而且,与使用
NULL
相比,它们通常更容易用于优化目的,而
NULL
表示“无限制”在这里是完全合理的。使用实际整数值必然会导致问题

像-1这样的“神奇数字”有一种方式,一开始无害,但后来相关,这意味着你需要一个新的,更神奇的数字来取代它


这使得定义
min
max
可能为
NULL
的边界变得容易,而不是使用任意大或小的值。

您也可以选择在数据库中使用两个字段来实现结果:

file_quota int NOT NULL DEFAULT 50000,
file_quote_is_limited boolean NOT NULL DEFAULT true
当然,与简单地将无限存储为
NULL
相比,有几种存储方法会根据您的规模影响数据库大小。然而,这种技术有一些优点:

  • 即使您没有记录
    NULL
    意味着无限,但当看到映射时,它更清楚地表明了这是什么意思。(考虑新开发人员等)
  • 在代码中找不到if(null==$obj->getFileQuota()){
或类似结构的
。这些代码片段通常很臭,不便于维护
  • 查询的复杂性取决于您试图实现的目标,但这两个字段不会增加不可预见的复杂性。事实上,它使您更容易理解正在发生的事情:
    其中文件配额<50000或文件配额为空

    vs.
    其中file\u quota<50000或!file\u quota\u受限制
    (否定取决于您选择的映射布尔值的数据类型,但条令应该注意这一点)
  • 如果代码中碰巧有
    $usage=$usedFiles/$user->getFileQuota();
    ,甚至可以通过适当地约束数据库列来防止被零除
  • 您可以进一步扩展逻辑以映射更多的状态

  • 如果您决定也开始存储负值,会发生什么情况?现在一些非无限值将被任意检测为无穷大。我只会使用一个大的数字,避免对无穷大进行所有测试。@Cerad好吧,我不必测试无穷大,但在某些情况下我需要测试这个大的数字(例如,当我想显示maxFileSize时,我需要做如下检查:
    if(maxFileSize==bigNumber)然后回显“unlimited size”;否则回显maxFileSize;
    )。这是最好的方法。“infinity”无论如何都是不切实际的。如果有人真的试图上传2147483647MB的文件,你会遇到比其他人更大的问题“规范应该允许上传无限大的文件。”@Erik好的,infinity对于
    maxFileSize
    来说没有意义,但是对于
    maxUsers
    IMO这样的东西肯定有意义。您的数据库中也没有足够的空间来存储无限大的用户。