SQL: использование значений NULL и значений по умолчанию - PullRequest
40 голосов
/ 22 января 2010

Каковы плюсы и минусы использования значений NULL в SQL по сравнению с значениями по умолчанию * * 1013

PS. Здесь было задано много похожих вопросов, но никто не отвечает на мой вопрос.

Ответы [ 13 ]

39 голосов
/ 22 января 2010

Значение NULL в базах данных является системой значение, которое занимает один байт хранения и указывает, что значение не присутствует в отличие от пробела или ноль или любое другое значение по умолчанию. поле в базе данных, содержащей Значение NULL означает, что содержание эта ячейка неизвестна во время смотря на это. Столбец, который позволяет Значения NULL также позволяют вставляется без значений вообще в этом колонка. Есть несколько плюсов и минусы использования значений NULL в противоположность к значениям по умолчанию:

Плюсы

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

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

Поскольку значение NULL занимает только 1 немного места в памяти, они могут быть полезно при оптимизации базы данных. Использование этих значений гораздо больше эффективнее значений по умолчанию, например, 8 символов и целые числа 16bits.

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

Назначение Not Null для схем таблиц может также помочь с проверкой таблицы, в том смысле, что столбец с не Нулевые критерии потребуют значения быть вставленным. Значения по умолчанию не имеют эти возможности.

Против

Значения NULL легко спутать с пустые строки символов, которые возвращают пустое значение для пользователя, когда выбран. В этом смысле дефолт значения являются менее запутанными и являются более безопасный вариант, если не указано значение по умолчанию устанавливается на пустую строку.

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

Источник: Плюсы и минусы

18 голосов
/ 22 января 2010

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

Может быть, какой-то пример будет лучшим объяснением. Допустим, у нас есть member таблица. Каждый участник имеет свой идентификатор и имя пользователя. По желанию у него может быть адрес электронной почты (но он не обязан). Также у каждого участника есть столбец postCount (который увеличивается каждый раз, когда пользователь пишет сообщение). Таким образом, столбец электронной почты может иметь значение null (поскольку электронная почта необязательна), в то время как столбец postCount имеет значение NOT NULL, но имеет значение по умолчанию 0 (поскольку при создании нового участника у него нет сообщений ).

11 голосов
/ 22 января 2010

Нулевые значения не являются ... значениями!

Null означает «не имеет значения» ... помимо аспекта базы данных, одним важным измерением незначных переменных или полей является то, что невозможно использовать '=' (или '>', '<'), когда сравнивая переменные. </p>

Написание чего-то вроде (VB):

if myFirstValue = mySecondValue

не вернет ни True, ни False, если одна или обе переменные не имеют значения. Вам нужно будет использовать «оборот», такой как:

if (isnull(myFirstValue) and isNull(mySecondValue)) or myFirstValue = mySecondValue

«Обычный» код, используемый в таких обстоятельствах:

if Nz(myFirstValue) = Nz(mySecondValue, defaultValue)

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

Несмотря на это неприятное поведение, никогда, никогда, никогда включает значения по умолчанию в строку нулевой длины (или «0») без веской причины, и упрощение сравнения значений в коде не является важной причиной .

6 голосов
/ 22 января 2010

Значения NULL означают, что атрибут либо не применим, либо неизвестен. Есть религиозные войны за то, хорошие они или плохие, но я попадаю в лагерь «хороших вещей».

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

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

Значения по умолчанию - это просто то, что СУБД поместит в столбец, если вы не укажете это явно.

4 голосов
/ 22 января 2010

Это зависит от ситуации, но на самом деле все просто. Какой из них ближе к истине?

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

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

Обратите внимание, что существуют три различных способа реализации значений по умолчанию. Сначала в приложении, прежде чем вставлять новые данные. База данных никогда не видит разницы между значением по умолчанию, предоставленным пользователем, и значением, предоставленным приложением!

Во-вторых, путем объявления значения по умолчанию для столбца и отсутствия данных во вставке.

В-третьих, подставляя значение по умолчанию во время поиска, всякий раз, когда обнаруживается NULL. Только несколько продуктов СУБД разрешают объявлять этот третий режим в базе данных.

В идеальном мире данные никогда не пропадают. Если вы разрабатываете для реального мира, необходимые данные в конечном итоге будут отсутствовать. Ваши приложения могут делать что-то, что имеет смысл, или то, что не имеет смысла, когда это происходит.

4 голосов
/ 22 января 2010

Как и во многих вещах, у каждого есть свои плюсы и минусы.

Хорошие замечания о значениях по умолчанию: они дают вам возможность установить для столбца известное значение, если не указано другое значение. Например, при создании столбцов BOOLEAN я обычно присваиваю столбцу значение по умолчанию (TRUE или FALSE, в зависимости от того, что подходит) и делаю столбец NOT NULL. Таким образом, я могу быть уверен, что столбец будет иметь значение, и он будет установлен соответствующим образом.

Плохие замечания о значениях по умолчанию: не все имеют значение по умолчанию.

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

Плохие вещи о NULL: NULL требуют осторожного обращения. В большинстве баз данных, построенных на реляционной модели, поскольку обычно реализуемые значения NULL являются ядовитыми, наличие в расчете значения NULL приводит к тому, что результатом вычисления является NULL. Значения NULL, используемые в сравнениях, также могут привести к неожиданным результатам, поскольку любое сравнение с NULL возвращает UNKNOWN (что не является ИСТИНОЙ или ЛОЖЬЮ). Например, рассмотрим следующий скрипт PL / SQL:

declare 
  nValue NUMBER;
begin
  IF nValue > 0 THEN
    dbms_output.put_line('nValue > 0');
  ELSE
    dbms_output.put_line('nValue <= 0');
  END IF;

  IF nValue <= 0 THEN
    dbms_output.put_line('nValue <= 0');
  ELSE
    dbms_output.put_line('nValue > 0');
  END IF;
end;

Вывод выше:

nValue <= 0
nValue > 0

Это может быть немного удивительно. У вас есть NUMBER (nValue), который меньше или равен нулю и больше нуля, по крайней мере, в соответствии с этим кодом. Причина, по которой это происходит, состоит в том, что nValue фактически равно NULL, и все сравнения с NULL приводят к UNKNOWN вместо TRUE или FALSE. Это может привести к тонким ошибкам, которые трудно распознать.

Делись и наслаждайся.

4 голосов
/ 22 января 2010

Для меня они несколько ортогональны.

Значения по умолчанию позволяют изящно развивать схему базы данных (например, добавляя столбцы) без необходимости изменения клиентского кода. Кроме того, они сохраняют некоторую печать, но полагаться на значения по умолчанию для этого плохо для IMO.

Нули - это просто: null с. Недостающая ценность и огромная PITA при работе с Трехзначной Логикой .

3 голосов
/ 22 января 2010

В хранилище данных вы всегда хотели бы иметь значения по умолчанию, а не NULL.

Вместо этого вы бы имели такие значения, как «неизвестно», «не готов», «отсутствует»

Это позволяет эффективно выполнять ВНУТРЕННИЕ СОЕДИНЕНИЯ в таблицах фактов и измерений, поскольку «все всегда имеет значение»

3 голосов
/ 22 января 2010

Null s и значения по умолчанию - разные вещи, используемые для разных целей. Если вы пытаетесь избежать использования null s, задав для всех значение по умолчанию, то, как я объясню, это плохая практика.

Null означает, что мы не знаем, какое значение будет или будет. Например, предположим, что у вас есть поле enddate. Вы не знаете, когда закончится записываемый процесс, поэтому null является единственным подходящим значением; использование значения по умолчанию некоторого ложного выхода из даты в будущем вызовет столько же проблем при программировании, сколько и обработка null s, и, скорее всего, по моему опыту, создаст проблему с возвращением неверных результатов.

Теперь бывают случаи, когда мы можем знать, каким должно быть значение, если человек, вставляющий запись, этого не делает. Например, если у вас есть поле date inserted, целесообразно иметь значение по умолчанию для текущей даты и не ожидать, что пользователь заполнит его. Вероятно, у вас действительно будет более точная информация для этого поля.

Иногда это колл-суждение и зависит от бизнес-правил, которые вы должны применять. Предположим, у вас есть поле speaker honoraria (это сумма, которую будет выплачен докладчику). Значение по умолчанию 0 может быть опасным, так как это может означать, что ораторы наняты, и мы намерены ничего им не платить. Также возможно, что иногда будут выступающие, которые отдают свое время на конкретный проект (или которые являются сотрудниками компании и, следовательно, не платят дополнительно за выступление), где ноль является правильным значением, поэтому вы не можете использовать ноль в значение, чтобы определить, что вы не знаете, сколько нужно заплатить этому оратору. В этом случае Null является единственным подходящим значением, и код должен вызвать проблему, если кто-то пытается добавить докладчика в конференцию. В другой ситуации вы, возможно, уже знаете, что минимальный размер оплаты за каждого выступающего составляет 3000, и что только в колонках, которые договорились о другой ставке, будут введены данные в поле honoraria. В этом случае целесообразно ввести значение по умолчанию 3000. В других случаях разные клиенты могут иметь разные минимумы, поэтому значение по умолчанию следует обрабатывать по-разному (обычно через справочную таблицу, которая автоматически заполняет минимальное значение honoraria для этого клиента в форме ввода данных.

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

1 голос
/ 23 января 2010

Как уже сказал один респондент, NULL не является значением.

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

NULL не равно самому себе. x = y возвращает false, если оба x и y равны NULL. x = y дает значение true, если оба значения x и y являются значениями по умолчанию.

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

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