Столбцы Varchar: Nullable или нет

Стандарты разработки баз данных в нашей организации гласят, что поля varchar не должны допускать пустых значений. Они должны иметь значение по умолчанию пустой строки (""). Я знаю, что это упрощает запросы и конкатенацию, но сегодня один из моих коллег спросил меня, почему этот стандарт существует только для типов varchar, а не для других типов данных (int, datetime и т. д.). Я хотел бы знать, считают ли другие это допустимым, защищенным стандартом, или следует ли рассматривать varchar так же, как поля других типов данных?

Я считаю, что этот стандарт действителен по следующей причине:

Я считаю, что пустая строка и нулевые значения, хотя и различаются технически, концептуально одинаковы. Пустая строка нулевой длины — это несуществующая строка. Это не имеет значения. Однако числовое значение 0 не равно NULL.

Например, если поле OutstandingBalance имеет значение 0, это означает, что осталось 0,00 долларов США. Однако, если то же поле имеет значение NULL, это означает, что значение неизвестно. С другой стороны, поле CustomerName со значением "" в основном совпадает со значением NULL, поскольку оба представляют несуществующее имя.

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

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


person DCNYAM    schedule 08.06.2010    source источник


Ответы (2)


Это в значительной степени сводится к следующему: в вашем приложении для конкретной строки есть ли разница между наличием пустой строки и отсутствием строки вообще?

Если нет различий, то стандарт, которому вы следуете, в порядке.

Если вы обнаружите, что есть разница, то null имеет особое значение и должна быть разрешена.

По моему опыту, null обычно моделируется как unknown.

Вот более конкретный пример - отчества людей:

  • Если известно отчество, то значение заполняется
  • Если вы знаете, что у человека нет отчества, используйте пустую строку ('')
  • Если вы не знаете, есть ли у человека отчество, null может быть более подходящим

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

person Oded    schedule 08.06.2010
comment
+1: Бизнес-правила определяют необязательность столбца, а не тип данных. Кроме того, нет экономии места при использовании строк NULL вместо строк нулевой длины: vampirebasic.blogspot.com/2009/01/ - person OMG Ponies; 09.06.2010

Нет, null — это очень отличительное значение. Например, всего один из более чем дюжины нулей может означать «у нас вообще нет значения», а пустая строка означает «у нас есть ответ, и это ничего». Это было бы полезно, например, как ответ на вопрос - так и не получил ответа или ответ был ничем...

Там есть ВЕЛИКОЛЕПНЫЙ технический документ, озаглавленный что-то вроде «18 значений NULL» — я не помню, что такое целое число! В любом случае, эта статья существует по крайней мере с начала 1990-х годов, и если вы сможете ее найти, это действительно фантастика — я не искал ее в Интернете.

Реальная проблема с нулями заключается в том, что они могут «случайно» изменить возвращаемые строки. Например, если вы говорите

выберите strcol1, datecol2, someint3 из fubar, где...

Если strcol1 окажется нулевым, вы НЕ вернете значение для этой строки, потому что подразумевается «где strcol1 не является нулевым» - таким образом, может отсутствовать целая строка.

Это верно не для всех систем СУБД, но для некоторых это было верно уже довольно давно, поэтому, если вы хотите, чтобы ваш код можно было перемещать из одной СУБД в другую, вы должны быть ОЧЕНЬ осторожны при обработке нулей.

Еще один момент: Oracle — или, по крайней мере, некоторые версии Oracle — будут молча преобразовывать пустые строки в null! Это действительно возмутительно, но каким-то образом у них это было в производстве «навсегда». Осторожно! Мое решение состоит в том, чтобы использовать другую строку для обозначения «пустой строки», чаще всего одиночный символ пробела.

person Richard T    schedule 08.06.2010