NULL vs Empty при работе с пользовательским вводом - PullRequest
6 голосов
/ 02 января 2009

Да, еще один NULL или вопрос о пустой строке.

Я согласен с идеей, что NULL означает не установлено, в то время как пустая строка означает «пустое значение». Вот моя проблема: если значение по умолчанию для столбца равно NULL, как разрешить пользователю вводить этот NULL.

Допустим, в системе создан новый пользователь. Существует поле имени и фамилии; фамилия обязательна, а имя - нет. При создании пользователя человек увидит 2 текстовых ввода, один для первого и один для последнего. Человек решает ввести только фамилию. Первое имя технически не установлено. Во время вставки я проверяю длину каждого поля, устанавливая все поля, которые являются пустыми, в NULL.

При просмотре базы данных я вижу, что имя не задано. Сразу возникает вопрос: возможно, они никогда не видели поле имени (то есть из-за ошибки). Но это не так; они оставили, если пусто.

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

Смежный вопрос: Должен ли я использовать NULL или пустую строку для представления данных в столбце таблицы?

Ответы [ 8 ]

8 голосов
/ 02 января 2009

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

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

  2. Как вы алфавитизируете это?

  3. Можете ли вы однозначно определить, когда пользователь не вводит значение, по сравнению с намеренно оставив его пустым?

  4. Как бы вы однозначно запросили разницу? Может ли пользователь экрана запроса указать NULL или пустое значение, используя стандартный синтаксис формы ввода?

  5. На практике мне никогда не запрещали читать и записывать данные, используя не удивительное поведение по умолчанию, использующее это правило. Если мне нужно было узнать разницу, я использовал логическое поле (которое проще сопоставить с однозначными устройствами пользовательского интерфейса). В одном случае я использовал триггер для принудительного применения значения True => null, но никогда не видел, чтобы оно вызывалось, потому что слой BR эффективно отфильтровывал условие.

6 голосов
/ 02 января 2009

Если пользователь предоставляет пустую строку, я всегда рассматриваю ее как нулевую с точки зрения базы данных. Кроме того, я, как правило, обрезаю свои строковые входы, чтобы удалить пробелы в начале / конце, а затем проверяю их на пустые. Это небольшая победа в базе данных с типами varchar (), и она также уменьшает количество случаев поиска, поскольку мне нужно только проверить name is null вместо name is null or name = ''. Вы также можете пойти другим путем, преобразовав ноль в ''. В любом случае, выберите путь и будьте последовательны.

5 голосов
/ 02 января 2009

Что вам нужно сделать, это выяснить, какое поведение вы хотите. Не существует единой фиксированной алгебры того, как интерпретируются строки имен.

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

NULL & rarr; неинициализированный
"" & rarr; намеренно не установлен
имя & rarr; инициализируется.

2 голосов
/ 02 января 2009

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

1 голос
/ 08 августа 2012

Хотя ваш пример в основном для строк, я бы хотел сказать, что я использую нуль для числовых и логических полей. Баланс счета 0 очень отличается для меня, как нулевой. То же самое для логических значений, если люди сдают тест с несколькими вариантами ответов с правдой и ложью, очень важно знать, ответил ли кто-то истина или ложь или не ответил вообще. Если не использовать null в этих случаях, мне потребуется дополнительная таблица или другая настройка, чтобы увидеть, ответил ли кто-то на вопрос. Вы можете использовать, например, -1 для не заполненных 0 для false и 1 для true, но затем вы используете числовое поле для чего-то, что по сути является логическим.

1 голос
/ 02 января 2009

Я стараюсь, чтобы все было просто. В этом случае я бы сделал столбец с именем name не обнуляемым и допускал пропуски. В противном случае вам придется иметь дело с тремя случаями, где бы вы ни ссылались на это поле:

  1. Пустое имя
  2. Нулевое имя
  3. Непустое имя

Если вы выберете «пусто - пусто» или «пусто - пусто», вы переходите к двум случаям. Два дела лучше, чем три.

Для дальнейшего ответа на ваш вопрос: пользователь, вводящий данные, вероятно, ничего не знает (и не должен) знать, что такое «ноль» и как он сравнивается с «пустым». Эта проблема должна решаться чисто и последовательно в системе, а не в интерфейсе пользователя.

0 голосов
/ 25 февраля 2018

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

Делая это все время, оно есть, даже если я им не пользуюсь, но мне не нужно делать ничего другого, если мне нужно это различие.

Я обычно проверяю на empty(), но иногда я проверяю на isset(), который оценивает false на NULL. Это полезно для напоминаний, чтобы ответить на определенные вопросы. Если это empty, false или 0, то на вопрос дан ответ.

0 голосов
/ 02 января 2009

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

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