Подтвердить что ты не робот

Должен ли я разрешать нулевые значения в схеме db?

Я знаю, что логически, есть случаи, когда значения NULL имеют смысл в схеме БД, например, если некоторые значения plain не были указаны. Тем не менее, работа над DBNull в коде, как правило, является королевской болью. Например, если я получаю представление, и я хочу видеть строку, я бы не ожидал, что значение будет пустой строкой, а не "Null", и мне не нравится кодировать этот сценарий.

Кроме того, это упрощает запрос. По общему признанию, вы можете сделать "foo is not null" очень легко, но для младших разработчиков SQL он противоположен интуитивно понятным, чтобы не использовать "foo!= Null" (и да, я знаю о вариантах отключения ANSI-нулей и т.д., но это определенно НЕ проще, и мне не нравится работать вдали от стандарта).

Какая веская причина заключается в наличии/разрешении нулей в схеме базы данных?

4b9b3361

Ответ 1

Самой важной причиной разрешения NULLS является отсутствие разумной альтернативы. Логически, значение NULL представляет "undefined". Из-за отсутствия NULLS вы в конечном итоге попытаетесь указать значение "dummy" везде, где результат undefined, а затем вам придется учитывать указанное значение "dummy" во ВСЕХ из вашей логики приложения.

Я написал статью в блоге о причинах включения значений NULL в вашу базу данных. Вы можете найти здесь здесь. Короче говоря, я считаю, что значения NULL являются неотъемлемой частью дизайна базы данных и должны использоваться там, где это необходимо.

Ответ 2

C.J. Дата в его книге "SQL и реляционная теория" (2009: O'Reilly, ISBN 978-0-596-52306-0) занимает очень сильную позицию против NULL. Он демонстрирует, что наличие NULL в SQL дает неверные ответы на определенные запросы. (Аргумент не относится к самой реляционной модели, потому что реляционная модель не допускает NULL.)

Я попытаюсь обобщить его пример на словах. Он представляет таблицу S с атрибутами SNO (поставщик) и городом (город, где находится поставщик) и один ряд: (S1, Лондон). Также таблица P с атрибутами PNO (номер детали) и City (город, где производится часть) и одна строка: (P1, NULL). Теперь он делает запрос "Получить (SNO, PNO) пары, где либо страны-поставщики, либо части города отличаются или город-часть не является Парижем (или обоими)".

В реальном мире P1 производится в городе, который либо является, либо не является Парижем, поэтому запрос должен возвращаться (S1, P1), поскольку город-часть является Парижем или не является Парижем. (Простое присутствие P1 в таблице P означает, что у части есть город, связанный с ним, даже если он неизвестен.) Если это Париж, то страны-поставщики и города-порты отличаются. Если это не Париж, то часть города не Париж. Однако по правилам трехзначной логики ( "Лондон" < > NULL) оценивается НЕИЗВЕСТНО, (NULL < > 'Paris') оценивается в UNKNOWN, а UNKNOWN или UNKNOWN сводится к UNKNOWN, что не является TRUE ( а не FALSE), и поэтому строка не возвращается. Результат запроса "SELECT S.SNO, P.PNO FROM S, P WHERE S.CITY < > P.CITY ИЛИ P.CITY < > 'Paris'" является пустой таблицей, что является неправильным ответом.

Я не эксперт и в настоящее время не имею возможности занять про или кон. Я считаю, что C.J. Date является одним из ведущих авторитетов теории релятивизма.

P.S. Также верно, что вы можете использовать SQL как нечто иное, чем реляционная база данных. Он может многое сделать.

Ответ 3

Какая веская причина заключается в наличии/разрешении нулей в схеме базы данных?

С точки зрения теории наличие NULL означает, что значение не определено для столбца.

Используйте его везде, где вам нужно сказать "Я не знаю/мне все равно", чтобы ответить на вопрос "Каково значение этого столбца?"

И вот несколько советов с точки зрения производительности:

  • В Oracle, NULL не индексируются. Вы можете сохранить индексное пространство и ускорить выполнение запросов, используя NULL для значений, которые вам не нужно индексировать.
  • В Oracle конец NULL не занимает пробела.
  • В отличие от нулей, NULL можно безопасно разделить на.
  • NULL внести вклад в COUNT(*), но не вносить вклад в COUNT(column)

Ответ 4

Нули хороши, когда ваш столбец действительно может иметь неизвестное значение, которое не имеет значения по умолчанию. Мы не можем ответить, если ваш столбец применим к этому правилу.

например, если у вас есть и дата окончания, у вас может возникнуть соблазн включить datetime.maxvalue в качестве значения по умолчанию isntead из null. он полностью действителен, но вы должны принимать во внимание отчетность о том, что делается на этом и тому подобное.

Ответ 5

В теории нет разницы между теорией и практикой. На практике существует.

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

Однако, степень разложения таблицы, которую вы должны пройти, чтобы получить этот результат, просто не стоит выигрыша с точки зрения теоретической эстетики. Часто бывает, что некоторые столбцы содержат NULLS.

Хорошими кандидатами для столбцов с нулевым значением являются те, в которых, в дополнение к необязательным данным, вы никогда не используете столбец в условии сравнения в предложении WHERE или HAVING. Верьте или нет, внешние ключи часто работают нормально с NULLS в них, чтобы указать экземпляр отношений, которого нет. INNER JOINS отбрасывает NULLS вместе со строками, которые их содержат.

Когда значение часто используется в булевых условиях, лучше всего сконструировать так, чтобы NULLS не произошло. В противном случае вы склонны заканчивать таинственный результат, который в SQL, значение "NOT UNKNOWN" "UNKNOWN". Это вызвало ошибки перед несколькими людьми.

Ответ 6

Как правило, если вы разрешаете NULL для столбца в базе данных, это значение NULL имеет какое-то отдельное значение в отношении структуры самой базы данных. Например, в схеме базы данных StackOverflow, NULL для столбца ParentId или тегов в таблице Post указывает, является ли сообщение вопросом или ответом, Просто убедитесь, что в каждом случае значение хорошо документировано.

Теперь ваша жалоба касается обработки этих значений в клиентском коде. Есть два способа смягчить проблему:

  • Большинство случаев со значением, подобным описанному выше, никогда не должны возвращаться к клиенту в первую очередь. Используйте NULL в своих запросах, чтобы собрать правильные результаты, но не возвращайте столбец NULL.

  • В остальных случаях вы можете обычно использовать функции, такие как COALESCE() или ISNULL(), чтобы возвращать то, что легче обрабатывать.

Ответ 7

Нуль полезен, когда вам нужно указать, что никакого значения нет.

Вместо этого вы можете использовать магическое число, но более интуитивно, чтобы обрабатывать значения null, чем обрабатывать магические значения, и легче запомнить, какое значение обрабатывать. (Хм... это было -1 или 99999 или 999999, что было волшебным значением...?)

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

Для текстового значения пустая строка может работать как "нет значения", но есть и некоторые недостатки. Если вы, например, имеете три пробела в поле, не всегда можно визуально отличить от пустой строки, но они являются разными значениями.

Ответ 8

Нули должны и должны использоваться в любое время, когда информация может быть недоступна во время ввода исходных данных (пример, дата отправки заказа).

Конечно, есть ситуации, когда нули могут указывать на необходимость перепроектирования (таблица, состоящая в основном из нулевых записей в большинстве полей, вероятно, неправильно нормализована, файл, содержащий все нулевые значения, вероятно, не нужен.)

Чтобы не использовать нули, потому что ваши разработчики jr неправильно понимают их, указывает, что у вас есть большая проблема, чем нули. Любой разработчик, который не понимает, как обращаться к данным, содержащим нули, нуждается в базовом обучении в SQL. Это так же глупо, как не использовать триггеры для обеспечения соблюдения правил целостности данных, потому что разработчики забывают смотреть на них, когда есть проблема или не используются объединения, потому что разработчики не понимают их или используют select *, потому что разработчики слишком ленивы, чтобы добавить имена полей.

Ответ 9

В дополнение к большим причинам, упомянутым в других ответах, NULL может быть очень важным для новых выпусков существующих продуктов.

Добавление нового столбца Nullable в уже существующую таблицу оказывает относительно низкое влияние. Добавление нового столбца, отличного от Nullable, является гораздо более сложным процессом из-за миграции данных. Если у вас или ваших клиентов много данных, время и сложность миграции могут стать серьезной проблемой.

Ответ 10

Причины наличия нулей

  • Это общепринятая практика, и каждый, кто работает с базой данных, знает, как работают нули.
  • Это ясно показывает, что есть отсутствие значения.

Ответ 11

Для того, что стоит, SQL-99 определяет предикат IS [NOT] DISTINCT FROM, который возвращает true или false, даже если операнды NULL.

foo IS DISTINCT FROM 1234

Является эквивалентным:

foo <> 1234 OR foo IS NULL

Поддержка PostgreSQL, IBM DB2 и Firebird IS DISTINCT FROM.

Oracle и Microsoft SQL Server пока не работают.

У MySQL есть собственный оператор <=>, который работает как IS NOT DISTINCT FROM.

Ответ 12

НИКОГДА не имеет места, где NULL имеет смысл логически. NULL не является частью реляционной модели, а теория реляций не имеет такого понятия, как NULL.

NULL "полезен" в том смысле, что дрянная СУБД не оставляет вам другого выбора, кроме как использовать его на уровне ФИЗИЧЕСКОГО, который эти очень дрянные СУБД сами серьезно смешивают с логическим уровнем и более или менее заставляют их пользователям делать то же самое.

Ответ 13

Я согласен с большинством ответов здесь, но для того, чтобы разделить его по-другому, "вы не можете иметь значение, которое означает две вещи". Это просто сбивает с толку. Действительно ли 0 означает 0? или это значит, что мы еще не знаем? и т.д.

Ответ 14

Когда есть объект, который не имеет значения для своего атрибута, мы используем нулевое значение. Нулевое значение не равно 0, но оно ничего не значащее. Одним из примеров является то, что большинство корейских имен не имеют среднего имени. Если есть атрибут имени с именем, именем и фамилией, следует указать специальное значение null.