Должен ли я использовать NULL или пустую строку для представления данных в столбце таблицы?

Нулевая или пустая строка - лучше, чем другой, чтобы не представлять данные в столбце таблицы? (Я специально использую MySQL, но я думаю, что это не зависит от системы.) Существуют ли существенные преимущества/недостатки для использования одного над другим, или это просто предпочтение программиста?

Ответ 1

Я категорически не согласен со всеми, кто говорит, что безоговорочно использует NULL. Разрешение столбца NULL вводит дополнительное состояние, которое у вас не было бы, если бы вы установили столбец как NOT NULL. Не делайте этого, если вам не нужно дополнительное состояние. То есть, если вы не можете придумать разницу между значением пустой строки и значением null, тогда установите столбец вверх как NOT NULL и используйте пустую строку для представления пустого. Представление одной и той же вещи двумя разными способами - плохая идея.

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

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

Ответ 2

Null. Пустая строка не является "никакими данными", это данные, которые являются пустыми.

Ответ 3

Нуль лучше "" фактически представляет данные, и он не будет регистрировать то же самое в вашем коде

Ответ 4

В контексте модели реляционной базы данных null указывает "нет значения" или "неизвестное значение". Он существует точно для цели, которую вы описываете.

UPDATE: Извините, но я забыл добавить, что, хотя большинство (все?) RDMBS используют это же определение для null, существуют тонкие различия в том, как обрабатывается null. Например, MySQL и Oracle допускают множественные нули в столбце UNIQUE (или наборе столбцов), поскольку значение null не является значением и не может считаться уникальным (null!= Null). Но в последний раз, когда я использовал MS SQL Server, он допускал только один null. Таким образом, вам может потребоваться рассмотреть поведение РСУБД и будет ли указанный столбец ограничен или проиндексирован.

Ответ 5

Ни. Представление отсутствия данных как отсутствие кортежей в соотношении.

По соображениям производительности вам может потребоваться избежать объединений в некоторых СУБД, но попробуйте разработать модель, чтобы информация, которая может отсутствовать, находится в отдельном отношении.

Ответ 6

Вот пара ссылок с сайта MySQL:

http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

Я прочитал один раз, что значение NULL равно 2 битам, где в качестве пустой строки всего 1 бит. В 99% случаев это не будет иметь никакого значения, но в очень большой таблице, когда это не имеет значения, если NULL или '', тогда было бы лучше использовать '', если это правда.

Ответ 7

Всегда используйте NULL. Обратите внимание на разницу между "Я не знаю, что это за номер телефона человека" (NULL) и "этот человек оставил его пустым" (пробел).

Ответ 8

Используйте правильный инструмент для задания. NULL может означать, что никакое значение не было предоставлено (пока) или оно может означать, что значение не применимо.

Но пустая строка также является информацией. Это может означать, что значение применимо и дано, но это пустая строка.

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

Имейте в виду, что в конкатенации строк все в сочетании с NULL дает NULL. Например: CONCAT (NULL, 'foo') дает NULL. Научитесь использовать функцию COALESCE(), если вы хотите преобразовать NULL в значение по умолчанию в выражении SQL.

Ответ 9

В большинстве случаев нуль лучше. Вероятно, есть некоторые ситуации, когда это мало чем отличается, но их мало. Просто помните, когда вы запрашиваете, что field = '' не совпадает с field is null (по крайней мере, в MySQL).

Ответ 10

Насколько я могу судить, Oracle не различает разницу.

select 1 from (select '' as col  from dual) where col is null;

Ответ 11

Подумайте, почему в столбце нет данных. Означает ли это, что дизайн таблицы неаккуратен? Несмотря на то, что они не нравятся нули, есть случаи, когда они подходят (или, при необходимости, достаточно), и система обычно не умирает. Просто никогда не допускайте нули во всем, что является ключом-кандидатом (основной или альтернативный ключ).

Ответ 12

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

Ответ 13

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

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

Одна огромная проблема, с которой я всегда сталкивался с NULL, заключается в том, что "SELECT * from tbl WHERE column = NULL" всегда возвращает пустой набор результатов. NULL никогда не может быть равным никому, включая NULL. Специальное ключевое слово "column is null" - единственный способ проверить, что что-то имеет значение null. Если вы вернетесь от нулевого значения, сравнение будет успешным: "column = ''" Возвращено 7 строк.

Я сделал две основные реализации БД с нуля, где, в конце концов, я пожалел об использовании NULL. В следующий раз для меня нет NULL!

Ответ 14

Есть одно важное исключение. Билл Карвин заявил: "CONCAT (NULL," foo ") дает NULL", что справедливо для большинства РСУБД, но НЕ для Oracle.

Как было предложено Джеймсом Карраном выше, Oracle выбрала этот довольно критический момент для отхода от стандартного SQL, обрабатывая NULL и пустые строки точно так же. Хуже, чем просто рассматривать их одно и то же, однако, это может фактически испортить значение значения NULL, возвращая что-то отличное от NULL при конкатенации.

В частности, в оракуле CONCAT (NULL, 'foo') дает 'foo'. Благодаря Oracle, теперь я потерял свои нули, которые могут не иметь для вас значения, но, безусловно, имеет значение, когда данные передаются на другие СУБД для дальнейшей обработки.

Ответ 15

Значение "нет данных" в столбце должно быть представлено значением по умолчанию. Помните, что NULL означает неизвестное значение, то есть столбец может иметь значение или нет, но вы не знаете его на этот раз.

Например, в системе приложений займа значение NULL в поле "Номер лицензии" означает, что заявитель или кредитный процессор не вводили номер лицензии водителя. Значение NULL автоматически не означает, что у заявителя нет лицензии. У него может быть или не быть лицензии, вы просто не знаете, почему это NULL.

Неопределенность заключается в строковых столбцах. Числовой столбец, очевидно, содержит ноль, если нет значения. Как вы можете представить строку без значения? В приведенном выше примере для претендентов без лицензии на драйвер вы можете назначить произвольное значение по умолчанию, такое как "none" или, еще лучше, пустую строку. Просто убедитесь, что вы используете пустое значение по умолчанию в других таблицах для согласованности.

В связи с вопросом о том, что NULL не используется в качестве принципа, существуют случаи, когда они действительно необходимы. Как кто-то, кто активно работает со статистикой, поставщикам данных часто предоставляется набор данных с неполными данными. Например, в наборе данных ВВП по стране вы можете найти недостающие показатели ВВП в предыдущий и последующие годы. Одна из причин заключается в том, что за эти годы от правительства страны нет официальных данных. Неправильно сделать вывод, что их ВВП равен нулю (DUH!) И показывает нулевое значение в извлеченных данных или графике. Правильное значение равно NULL, а это значит, что у вас пока нет данных. Конечный пользователь правильно интерпретирует отсутствующие точки данных в извлеченных данных и графиках как NOT zero. Кроме того, это не приведет к ошибкам в ваших вычислениях, особенно когда вы делаете средние значения.

Некоторые "правила", которые имеют смысл теоретически, на самом деле были бы плохим или неправильным решением в вашем случае.

Ответ 16

Я нахожу значения NULL полезными для ссылочной целостности. В случае с MySQL, если для поля установлено значение NOT NULL, тогда вставка требует, чтобы данные были установлены; в противном случае NULL является возможным значением, а ограничение внешнего ключа не выполняется.

  • id: первичный ключ
  • product_id: FOREIGN KEY NOT NULL
  • ref_id: (NULLABLE)

id и product_id всегда требуются. ref_id может быть установлен в NULL. Однако, если какое-либо другое значение используется, оно должно удовлетворять ограничению FOREIGN KEY.