У меня часто есть поля в моей базе данных, которые хранят «число или бесконечность». Примеры могут быть maxFileSize
, maxUsers
и т. д. Должно быть возможно установить максимальное значение или просто не ограничивать его вообще.
Я в настоящее время иногда использую null
указывать «бесконечно / без ограничений» и иногда использовать -1
,
Мне было интересно, если есть какая-либо причина использовать тот или другой. Для протокола, я работаю с PHP / MySQL / Doctrine / Symfony, если это имеет значение.
редактировать:
Я не спрашиваю мнения, но факты (как вы видите в ответах уже дано), связанных с использованием -1
или же null
, Они могут включать скорость, сложность запроса, размер базы данных и так далее.
Если вы собираетесь использовать целое число для хранения значения и хотите сохранить действительно большое значение, используйте 2,147,483,647. Это самое большое значение, которое вы можете указать в поле, поэтому оно настолько близко к бесконечности, насколько позволяет поле.
Есть проблемы как с -1, так и с NULL
, Например, возможно, значение еще не установлено. Это кажется гораздо более разумным NULL
чем представлять какое-то произвольное значение. А использование специального значения требует сложной логики:
where users < maxusers or maxusers is null
where users < maxusers or maxusers = -1
Эта специализированная логика усложняет оптимизацию запроса. Это не проблема, если вы используете максимальное значение, которое может быть сохранено в поле.
Кстати, я не часто сталкиваюсь с этой проблемой с числами, но это очень часто встречается с датами. Часто «конечные даты» в таблицах для медленно меняющихся измерений будут выглядеть примерно так: «9999-01-01» или «4195-01-01». Они представляют собой произвольную точку в далеком будущем. И, как правило, они проще для целей оптимизации, чем с помощью NULL
,
Просто имхо
null
— ожидается любой структурой или запросом как пустой или же не определен значение во многих случаях. но если вы попытаетесь использовать -1 или что-нибудь еще. некоторые функции запроса SUM (), AVG () и т. д. могут быть нарушены этим значением.
Поэтому я не вижу причин, чтобы получить вредную привычку. NULL равен NULL, и все знают, что NULL может существовать в таблице и означает пустой или же не определен.
В случае, если вы разместите -1
это означает не пустой а также определенный так что для меня это абсолютно противоположные ценности.
Можете ли вы спросить, можем ли мы использовать 1
вместо 0
, true
вместо false
?
если ваше значение определено, а не пусто — вы можете использовать все, что захотите.
и если ваше значение не определено и / или контекст значение empy Я бы предложил использовать ничего, что равно нулю.
Вы также можете использовать два поля в вашей базе данных для достижения результата:
file_quota int NOT NULL DEFAULT 50000,
file_quote_is_limited boolean NOT NULL DEFAULT true
Есть несколько способов хранения логические значения в 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();
в своем коде вы даже можете предотвратить деление на ноль, ограничив столбец базы данных соответствующим образом. имеющий NULL
означает «без ограничений» здесь вполне разумно. Использование фактического целочисленного значения обязательно вызовет проблемы.
«Магические числа», такие как «-1», имеют способ начать достаточно безобидно, но в конечном итоге они уместны позже, а значит, вам нужно новое, более магическое число, чтобы заменить его.
Это позволяет легко определить границы, где min
а также max
может быть NULL
вместо того, чтобы использовать какое-то произвольно большое или маленькое значение.