Я думаю, что следует избегать пустых столбцов. Везде, где семантика домена позволяет использовать значение, которое четко указывает на отсутствующие данные, его следует использовать вместо NULL.
Например, давайте представим таблицу, которая содержит поле Comment
. Большинство разработчиков помещают здесь значение NULL, чтобы указать, что в столбце нет данных. (И, надеюсь, проверочное ограничение, запрещающее строки нулевой длины, чтобы у нас было общеизвестное «значение», указывающее на отсутствие значения.) Мой подход обычно противоположен. Столбец Comment
равен NOT NULL
, а строка нулевой длины указывает на отсутствие значения. (Я использую проверочное ограничение, чтобы убедиться, что строка нулевой длины действительно является строкой нулевой длины, а не пробелами.)
Итак, зачем мне это делать? Две причины:
NULL
s требует специальной логики в SQL, и эта техника избегает этого.
- Многие клиентские библиотеки имеют специальные значения для указания
NULL
. Например, если вы используете Microsoft ADO.NET, константа DBNull.Value
указывает на NULL, и вы должны проверить это. Использование строки нулевой длины в столбце NOT NULL
устраняет необходимость.
Несмотря на все это, есть много обстоятельств, при которых NULL
в порядке. На самом деле, я не возражаю против их использования в приведенном выше сценарии, хотя это не будет моим предпочтительным способом.
Что бы вы ни делали, будьте добры к тем, кто будет использовать ваши столы. Будьте последовательны . Позвольте им с уверенностью SELECT
. Позвольте мне объяснить, что я имею в виду под этим. Недавно я работал над проектом, база данных которого не была разработана мной. Почти каждый столбец обнулялся и не имел ограничений. Не было последовательности в том, что означало отсутствие стоимости. Это может быть NULL
, строка нулевой длины или даже куча пробелов, и часто это так. (Как этот суп ценностей попал туда, я не знаю.)
Представьте себе некрасивый код, который разработчик должен написать, чтобы найти все эти записи с пропущенным полем Comment
в этом сценарии:
SELECT * FROM Foo WHERE LEN(ISNULL(Comment, '')) = 0
Удивительно, но есть разработчики, которые считают это вполне приемлемым, даже нормальным, несмотря на возможные последствия для производительности. Лучше было бы:
SELECT * FROM Foo WHERE Comment IS NULL
Или
SELECT * FROM Foo WHERE Comment = ''
Если ваша таблица правильно спроектирована, то для получения качественных данных можно использовать два приведенных выше оператора SQL.