Должен ли я использовать NULL или пустую строку для представления данных в столбце таблицы? - PullRequest
27 голосов
/ 03 октября 2008

Нулевая или пустая строка - лучше ли другой, чтобы не представлять данные в столбце таблицы? (Я специально использую MySQL, но думаю, что это не зависит от системы.) Существуют ли основные преимущества / недостатки использования одного над другим или это просто предпочтение программиста?

Ответы [ 16 ]

1 голос
/ 04 октября 2008

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

1 голос
/ 03 октября 2008

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

1 голос
/ 03 октября 2008

Насколько я могу судить, Oracle не различает разницу.

select 1 from (select '' as col  from dual) where col is null;
0 голосов
/ 06 апреля 2016

Я считаю, что значения NULL полезны для ссылочной целостности. В случае MySQL, если для поля установлено значение NOT NULL, для вставки требуются данные; в противном случае NULL является возможным значением, а ограничение внешнего ключа не применяется.

  1. id: первичный ключ
  2. product_id: ИНОСТРАННЫЙ КЛЮЧ НЕ НУЛЬ
  3. ref_id: (NULLABLE)

ID и область product_id всегда требуются. ref_id может быть установлен в NULL. Однако, если используется любое другое значение, оно должно удовлетворять ограничению FOREIGN KEY.

0 голосов
/ 03 июля 2013

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

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

Неоднозначность заключается в строковых столбцах. Числовой столбец, очевидно, содержит ноль, если нет значения. Как вы можете представить строку без значения? В приведенном выше примере для заявителей, у которых нет водительских прав, вы можете назначить произвольное значение по умолчанию, например, «none» или, что еще лучше, пустую строку. Просто убедитесь, что вы используете пустое значение по умолчанию в других таблицах для согласованности.

Что касается вопроса о том, чтобы не использовать NULL в качестве принципа, существуют случаи, когда они действительно необходимы. Как те, кто активно работает со статистикой, поставщики данных обычно предоставляют вам наборы данных с неполными данными. Например, в наборе данных о ВВП на страну вы можете найти недостающие показатели ВВП за предыдущие и последующие годы. Одной из причин является то, что официальных данных за эти годы от правительства страны нет. Будет неверным делать вывод, что их ВВП равен нулю (DUH!) И показывать нулевое значение в извлеченных данных или графике. Правильное значение NULL, означающее, что у вас еще нет данных. Конечный пользователь правильно интерпретирует отсутствующие точки данных в извлеченных данных и графиках как НЕ ноль. Кроме того, это не вызовет ошибок в ваших вычислениях, особенно когда вы делаете средние значения.

Некоторые "правила", которые имеют теоретический смысл, на самом деле будут плохим или неправильным решением в вашем случае.

0 голосов
/ 14 октября 2008

Есть одно важное исключение. Билл Карвин заявил, что «CONCAT (NULL, 'foo') приводит к NULL", что верно для большинства СУБД, но НЕ для Oracle.

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

В частности, в oracle CONCAT (NULL, 'foo') выдает 'foo'. Благодаря Oracle, я теперь потерял свои нули, которые могут не иметь значения для вас, но, несомненно, имеют значение, когда данные передаются в другие СУБД для дальнейшей обработки.

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