Должен ли я использовать NULL или пустую строку для представления данных в столбце таблицы? - PullRequest
27 голосов
/ 03 октября 2008

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

Ответы [ 16 ]

31 голосов
/ 05 ноября 2008

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

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

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

25 голосов
/ 03 октября 2008

Null. Пустая строка - это не «нет данных», это данные, которые оказываются пустыми.

4 голосов
/ 04 октября 2008

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

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

4 голосов
/ 03 октября 2008

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

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

4 голосов
/ 03 октября 2008

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

3 голосов
/ 03 октября 2008

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

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

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

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

3 голосов
/ 03 октября 2008

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

3 голосов
/ 03 октября 2008

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

2 голосов
/ 03 октября 2008

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

1 голос
/ 05 ноября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...