При создании таблиц встает вопрос: ставить "not null" или нет. Я не говорю о случаях, когда null необходим, например, если у вас установлен unique index или пустая строка - это тоже осмысленное значение и его надо отличать от null.
Неудобство, которое мы получаем, если поле nullable - это двойная проверка на отсутствие данных.
Простой пример: таблица пользователей и форма для их редактирования. Если мы не заполняем поле и отправляем форму, то на сервер приходит пустая строка, которая и сохраняется в БД.
Далее, если нам нужно, например, вытащить всех пользователей, у которых не указан номер телефона, нам нужно писать так: where `phone` != '' and `phone` is not null
А если бы мы не использовали null, то хватило бы where `phone` != ''
Тут можно на этапе записи в БД приводить все пустые поля в null (так по умолчанию ведет себя laravel).
Но зачем все усложнять? Почему бы просто не использовать пустую строку по умолчанию там, где null не нужен?
Кроме того, в каких-то советах по оптимизации я читал, что пустая строка - это быстрее.
Как вы создаете таблицы? Используете ли not null или нет?
Значение не задано и значение задано пустым. Есть знаете ли разница.
Далее, если нам нужно, например, вытащить всех пользователей, у которых не указан номер телефона, нам нужно писать так where `phone` != '' and `phone` is not null
Так Вы пишите что бы выбрать пользователей у которых телефон не задан или задан пустым. А если Вам надо именно тех у кого не задан, тогда как раз phone = NULL.
Кто Вам мешает писать свой код так, что бы в базе не могло оказаться null или наоборот, что бы там могло оказаться только null? Вы списываете недостатки своего кода, на якобы избыточность языка sql. Не там ищите проблему.
Тут можно на этапе записи в БД приводить все пустые поля в null (так по умолчанию ведет себя laravel).
Не только laravel. Это здравая идея приводить базу к тому виду, который требуется в проекте.
Простой пример: таблица пользователей и форма для их редактирования. Если мы не заполняем поле и отправляем форму, то на сервер приходит пустая строка, которая и сохраняется в БД.
это у вас она сохраняется. Что мешает этого не делать? Достаточно после валидации бизнес-логики пройтись по массиву данных, перед вставкой в базу, и обNULLить все переменные с пустыми строками. Пустые строки в базе не нужны, никогда. Нет ни одной причины их там хранить.
пустая строка - это тоже осмысленное значение
теоретически - это "осмысленное значение", практически - это мусор, это результат развития языков высокого уровня, типа php, которые позволяют вам записывать в базу пустую строку (поощряют это делать в виду своих конструктивных особенностей).
Отсутствие значения (null) не будет использоваться при операциях со строками. К примеру, если вы будете считать среднее по столбцу, то такие строки будут отброшены, а если вместо null будет 0, то они будет учитываться и результат будет некорректен.
Поэтому выбирайте по-смыслу.