.NET: Разрешить NULLS в полях БД? - PullRequest
5 голосов
/ 14 апреля 2010

У меня есть задача перефакторинга БД SQLServer .... Многие таблицы и столбцы "РАЗРЕШИТЬ НУЛЬ", это хорошая практика ...

Кажется, я помню, как автор CSLA.NET говорил, что это действительно плохая практика - разрешать пустые значения в БД ...

Если это так, каковы мои альтернативы?

Удалите все «РАЗРЕШИТЬ НУЛЬ» из всех столбцов .... и в числовых столбцах используйте значение -1, например ??

Буду очень признателен за любой вклад.

В настоящее время я использую модель (из структуры сущностей) из моей БД и столбцы БД, в которых «РАЗРЕШИТЬ НУЛЬ» являются пустыми ... и некоторые хранимые процедуры требуют, чтобы у меня было значение по умолчанию ... т.е. ЛОЖЬ по умолчанию ... но это ноль ..

Ну, я не хочу отклоняться от моего первоначального вопроса, РАЗРЕШИТЬ NULL - плохая вещь из того, что я могу собрать .... так как я могу это исправить?

Любая помощь действительно ценится

Ответы [ 4 ]

8 голосов
/ 14 апреля 2010

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

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

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

Часто вам нужно хранить необязательное числовое значение, и многие люди говорят вам, чтобы вы просто хранили ноль, чтобы указать «нет значения», но это еще худший антипаттерн хранения магического значения, которое действительно означает что-то другое. Что если тогда вы не можете использовать ноль для одного поля, потому что ноль также считается значимым значением, или потому что это значение используется как кратное делителя, поэтому вам нужно использовать какое-то другое магическое значение (-1? ) для этого поля только в этом случае, и теперь у вас проблема хуже, потому что все ваши необязательные числовые поля теперь ведут себя по-разному. Oye.

Даты являются еще более убедительным кандидатом на пустые поля. Стандартное значение «без значения», которое люди используют в .NET, - это неназначенное значение DateTime по умолчанию, то есть DateTime.MinValue или, более конкретно, 1 января 0001 года. Однако вы не можете записать это магическое значение в базу данных SQL, поскольку минимальное значение по умолчанию для поле DATETIME для SQL Server - 1 января 1973 года. Теперь у вас должно быть что-то, что проверяет, правильно ли вы переводите эти значения, когда они записываются и считываются из базы данных, и вы должны иметь защитное кодирование повсюду, которое проверяет для того, чтобы ваши поля даты были меньше, чем SqlDateTime.MinValue, вместо того, чтобы просто проверить, равны ли они DateTime.MinValue. Double Oye.

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

1 голос
/ 14 апреля 2010

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

Пуристы попросят вас создать новую таблицу с левым соединением, чтобы записать это значение. Реалист изменит существующую таблицу и добавит нулевое значение.

В определенных случаях нули имеют значение. Универсальный Nullable был добавлен в .net Framework для типов значений по той же причине.

1 голос
/ 14 апреля 2010

Ноль иногда является допустимым значением столбца, но я бы посоветовал лучше вместо этого добавить значения по умолчанию и сделать столбец не нулевым.

Если у вас есть данные для рассмотрения, вам нужно будет сделать обновление, например:

update TableA set ColumnA = 'default value' where ColumnA is null 

... если вы хотите наложить 'not null' на существующие данные.

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

0 голосов
/ 14 апреля 2010

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

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

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