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

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

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

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

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

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

12
DCNYAM 8 Июн 2010 в 23:59

2 ответа

Лучший ответ

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

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

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

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

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

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

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

18
xpda 19 Фев 2013 в 09:25
2
+1: бизнес-правила определяют выбор столбцов, а не тип данных. Кроме того, нет экономии места при использовании строк NULL и нулевой длины: vampirebasic.blogspot.com/2009/01/…
 – 
OMG Ponies
9 Июн 2010 в 00:06

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

Вокруг плавает БОЛЬШОЙ технический документ, озаглавленный что-то вроде «18 значений NULL» - я не помню, что такое целое число! Во всяком случае, эта статья существует по крайней мере с начала 1990-х годов, и она действительно фантастическая, если вы можете ее найти - я не выполнял поиск в Интернете.

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

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

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

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

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

1
Richard T 9 Июн 2010 в 00:09