Использование пустых строк вместо нуля - хорошая практика? - PullRequest
3 голосов
/ 11 октября 2011

Рассмотрим, например, в базе данных:

CREATE TABLE users (
  id INTEGER IDENTITY PRIMARY KEY,
  last_name VARCHAR (50) DEFAULT '' NOT NULL,
  first_name VARCHAR (50) DEFAULT '' NOT NULL,
  email VARCHAR(50) DEFAULT '' NOT NULL)

И рассмотрим программу, которая взаимодействует с этой базой данных, используя Hibernate как ORM.

На мой взгляд, это будет означать:

  • избегая исключений NullPointerExceptions
  • избегая необходимости проверять нулевые значения

Это хорошая практика? Пожалуйста, приведите примеры плюсов и минусов.

Ответы [ 5 ]

7 голосов
/ 11 октября 2011

Как пишет PeterMmm, "Null" имеет особое значение и обычно поддерживается специальными операторами в вашей базе данных.

«Хорошая практика» - это одна из тех фраз, которая означает то, что вы хотите, чтобы она имела в виду, но немного распаковывает аргументы:

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

  • Отказоустойчивость: плохая идея.Если столбец не может быть пустым, это обычно что-то значит в дизайне вашего приложения.Если запись пользователя ДОЛЖНА иметь действительный адрес электронной почты, вы больше не можете проверять его на уровне базы данных - поэтому ваша база данных может постепенно заполняться фиктивными данными, и вы узнаете об этом только при попытке отправить электронное письмо.к.Исключения «нулевого указателя» являются функцией, а не ошибкой!

  • Производительность: в соответствии с http://www.sql -server-performance.com / 2007 / datatypes / , NULLмедленнее.

4 голосов
/ 11 октября 2011

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

4 голосов
/ 11 октября 2011

Это зависит от вашего варианта использования. null является специальным значением и имеет особую семантику . Вы можете по умолчанию all на пустую строку, но может быть совсем иначе иметь last_name пустую строку или ноль (фамилия неизвестна или неприменима) (плохой пример, я знаю).

4 голосов
/ 11 октября 2011

Ну, минус в том, что вы не сможете различить «я ничего не вводил для этого поля» и пустую строку.Было бы хорошо, если бы вам никогда не приходилось беспокоиться о пустых строках.Если ваш водитель не вводит их.(Я думаю, что некоторые старые просто превращают пустые строки в java null.)

0 голосов
/ 14 июля 2016

Цитирование Django ORM документы :

Избегайте использования пустых значений в полевых строках, таких как CharField и TextField, поскольку пустые строковые значения всегда будут храниться как пустые строки, а не какНОЛЬ.Если строковое поле имеет значение null = True, это означает, что у него есть два возможных значения для «без данных»: NULL и пустая строка.В большинстве случаев избыточно иметь два возможных значения для «нет данных»; соглашение Django состоит в том, чтобы использовать пустую строку, а не NULL.

Итак, да, наиболее широко используемый веб-фреймворк PythonРассматривает дизайн, который вы предложили лучшие практики и обеспечивает такое поведение по умолчанию.Java также отходит от null s в настоящее время с Java 8 Optional, возможно, пришло время пересмотреть наши конструкции БД в этом свете.

...