2010-06-08 3 views
9

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

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

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

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

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

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

ответ

15

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

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

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

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

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

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

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

+0

+1: Необязательный код столбца бизнес-правил, а не тип данных. Кроме того, нет экономии пространства, используя строки NULL vs zero length: http://vampirebasic.blogspot.com/2009/01/sql-server-null-varchar-vs-empty.html –

1

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

Существует большой документ, плавающий вокруг, озаглавленный что-то вроде «18 значений NULL» - Я не помню, что такое целое! В любом случае, этот документ был там, по крайней мере, с начала 1990-х годов и поистине фантастичен, если вы можете его найти - я не сделал веб-поиск.

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

выберите strcol1, datecol2, someint3 от FuBar где ...

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

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

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