Лучше ли использовать `null` или` -1` для обозначения & quot; бесконечности & quot; в целочисленных столбцах базы данных

У меня часто есть поля в моей базе данных, которые хранят «число или бесконечность». Примеры могут быть maxFileSize, maxUsersи т. д. Должно быть возможно установить максимальное значение или просто не ограничивать его вообще.
Я в настоящее время иногда использую null указывать «бесконечно / без ограничений» и иногда использовать -1,

Мне было интересно, если есть какая-либо причина использовать тот или другой. Для протокола, я работаю с PHP / MySQL / Doctrine / Symfony, если это имеет значение.

редактировать:

Я не спрашиваю мнения, но факты (как вы видите в ответах уже дано), связанных с использованием -1 или же null, Они могут включать скорость, сложность запроса, размер базы данных и так далее.

4

Решение

Если вы собираетесь использовать целое число для хранения значения и хотите сохранить действительно большое значение, используйте 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,

5

Другие решения

Просто имхо

null — ожидается любой структурой или запросом как пустой или же не определен значение во многих случаях. но если вы попытаетесь использовать -1 или что-нибудь еще. некоторые функции запроса SUM (), AVG () и т. д. могут быть нарушены этим значением.

Поэтому я не вижу причин, чтобы получить вредную привычку. NULL равен NULL, и все знают, что NULL может существовать в таблице и означает пустой или же не определен.

В случае, если вы разместите -1 это означает не пустой а также определенный так что для меня это абсолютно противоположные ценности.

Можете ли вы спросить, можем ли мы использовать 1 вместо 0, true вместо false?

если ваше значение определено, а не пусто — вы можете использовать все, что захотите.

и если ваше значение не определено и / или контекст значение empy Я бы предложил использовать ничего, что равно нулю.

1

Вы также можете использовать два поля в вашей базе данных для достижения результата:

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(); в своем коде вы даже можете предотвратить деление на ноль, ограничив столбец базы данных соответствующим образом.
  • Вы можете расширить свою логику, чтобы отобразить еще больше состояний.
1

имеющий NULL означает «без ограничений» здесь вполне разумно. Использование фактического целочисленного значения обязательно вызовет проблемы.

«Магические числа», такие как «-1», имеют способ начать достаточно безобидно, но в конечном итоге они уместны позже, а значит, вам нужно новое, более магическое число, чтобы заменить его.

Это позволяет легко определить границы, где min а также max может быть NULL вместо того, чтобы использовать какое-то произвольно большое или маленькое значение.

0
По вопросам рекламы [email protected]