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这样的东西肯定有意义。您的数据库中也没有足够的空间来存储无限大的用户。