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

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

Нулевой.Пустая строка — это не «нет данных», это данные, которые оказались пустыми.

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

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

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

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

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

Вот несколько ссылок с сайта 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 или '' , тогда может быть лучше использовать '' , если это правда.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<Ол>
  • id: первичный ключ
  • product_id: FOREIGN KEY NOT NULL
  • ref_id: (NULLABLE)
  • Область

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top