Допустим, у вас есть приложение с логическим полем в User
таблице Inactive
.
Есть ли что-то по сути неправильно просто хранить false как ноль? Если да, то можете ли вы объяснить, какой должна быть обратная сторона? Я обсуждал это с кем-то несколько месяцев назад, и мы оба согласились, что это не должно иметь значения, если вы делаете это последовательно в приложении / базе данных. В последнее время кто-то из моих знакомых подчеркивал, что это «правда» true
или false
следует использовать, но они не дали объяснения, почему.
database-design
null
Ominus
источник
источник
Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database
что это общепринятая мудрость, и вам не следует переопределять значение Null в вашем приложении. Это будет сбивать с толку всех, кто работает с вашим кодом.SELECT * FROM foo WHERE bar = FALSE
не дает ожидаемых результатов.Ответы:
Да.
NULL - это не то же самое, что False.
По определению, сравнения (и логика), которые включают NULL, должны возвращать значения NULL (не False). Однако реализации SQL могут отличаться.
True and NULL
НЕДЕЙСТВИТЕЛЕН (не Ложен).True and NULL or False
НЕДЕЙСТВИТЕЛЕН (не Ложен).http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29
http://technet.microsoft.com/en-us/library/cc966426.aspx
источник
null
она не имеет отношения к логике (как в случаеwhatever OR TRUE
илиwhatever AND FALSE
, где никакое значение неwhatever
может изменить условие), то выражение возвращает значение. Это не оптимизация; это то, как работает 3-значная логика . Любая СУБД, которая настаивает на возвратеUNKNOWN
/NULL
для этих выражений, в корне сломана.Допуская нулевые значения в логическом поле, вы превращаете намеченное двоичное представление (true / false) в представление с тремя состояниями (true, false, null), где ваши «нулевые» записи являются неопределенными. Значение 'null' не является ни соответствующим образом 'true', ни 'false'. По какой причине вы должны увеличить свое представление, чтобы быть неточным?
Даже если вы выберете такой шаблон и будете делать это последовательно во всем приложении, это не поможет. Вы окажетесь в ситуации, когда свежим глазам непонятно, почему этот паттерн на месте, или, что более вероятно, вы окажетесь в ситуации, когда этот паттерн непреднамеренно нарушен.
источник
Что сказали другие. 3 возможных значения не булево.
Но у вас может быть законная потребность в 3 значениях. Такие как (правда, ложь, неизвестно). Даже если это так, если вы занимаетесь ультранормализацией, вы вообще не допустите нулевые значения. Вместо этого вы сохраните истинное логическое значение в другой таблице с отношением 1: 1. Нулевое значение может быть получено в запросе с помощью «неудачного» внешнего соединения, а не с помощью физически сохраненного нулевого значения.
источник
false
), то у них есть свое место. Если бы они этого не сделали, их бы не было. Альтернатива, как уже упоминалось, в основном состоит из совершенно другой таблицы, содержащей только первичный ключ вашей строки и один логический (или int, или varchar, или что у вас). Для каждого поля, которое в противном случае вы могли бы сделать обнуляемым. Хотя он относительно чистый, он слишком сложен для большинства целей.Это
bool?
логический тип? Нет, это тип,Nullable<T>
гдеT
логическое. Обнуляемое логическое значение может иметь 3 значения: true, false и null. Для использованияbool
илиbool?
зависит от вашего требования. Может быть законная причина, по которой вам может понадобиться использовать null, но тип, который пахнет как двоичный, но вы не знаете ответ. В приведенном выше примереUser.IsActive
кажется четким. Пользователь активен или нет. Как система, она может захотеть узнать, активен ли пользователь или нет. Там не должно быть «возможно». Но подумайте о чем-то похожем на флаг функции. Функция включена? Ответы могут быть да, нет или не уверен. У вас может быть бизнес-правило, которое излагает только показ кнопки, когда флаг установлен в значение true. Кто-то может возразить, что bool по умолчанию ложен, так зачем создавать недействительные bool? Обратное требование: собираетесь ли вы установить для всех значений в источнике данных значение true?источник