Кроме того:
NULL не соответствует действительности, неизвестно, не определено, несуществующее, ноль или ноль.

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

let maybeNull = null;
let isNull = maybeNull === null;
let isntNull = maybeNull != null;
console.log({isNull, isntNull}); // {isNull:true, isntNull:false}

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

не пишите expression = NULL, потому что NULL не "равно" NULL. (Нулевое значение представляет собой неизвестное значение, и неизвестно, равны ли два неизвестных значения.)
Postgres Docs

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

{
  "data": { "myData":NULL },
  "errors": [ ... ]
}

Свойство myData возвращено как NULL. Это не означает, что myData неизвестен серверу. Возможно, GraphQL вернул NULL из-за ошибок аутентификации или дросселирования. Значение может быть известно и явно определено; вам просто нужно изменить/повторить запрос.

У вас может возникнуть соблазн протестировать myData === null, но это похоже на анти-шаблон. В зависимости от вашего языка программирования, тест всегда может дать false! Кроме того, это не говорит вам, нужно ли вам изменить/повторить запрос. Лучше сначала исправить ошибки и разобрать ожидаемый тип (хорошо сделано с zod). Если вы исправили все ошибки и не получили ожидаемый тип, это de-factoNULL (и поэтому его не нужно тестировать).

Помогает ли словарь?

Полезны некоторые определения для NULL:

Пустота; не имеет юридической или обязательной силы или действительности; без эффективности; недействительно.
Не имеет значения; не имеющий характера или выражения; отрицательный.
Что-то, что не имеет силы или значения; то, что носит отрицательный или бессмысленный характер.

Однако применительно к программированию некоторые определения NULL также могут ввести в заблуждение:

Не любой; желающий; не существует.
Нуль в алгебраической мере.

Итак, как мы должны определить это?

Мое мнение, что-то вроде этого: NULL похоже на «Я умоляю 5-го» или отсутствие ответа на интервью из-за соглашения о неразглашении. Значение будет вам неизвестно; однако это не означает, что это неизвестно раскрывающей стороне. Это может быть что угодно, все или ничего. Оно может быть известно или неизвестно.

Продумывая дизайн базы данных

Предположим, следующая таблица Postgres:

| User    | URL                          |
| ------- | ---------------------------- |
| Bob     | https://example.com/bob      |
| Betty   | https://example.com/betty    |

Мы создаем нового пользователя Pat перед получением URL-адреса. Должно ли URL быть NULL или как-то иначе? Я бы сказал, что значение по умолчанию должно быть UNKNOWN, если возможно.

  • NULL не предоставляет самую полезную информацию
  • empty string недействительный URL
  • VOID предполагает, что URL-адрес известен (и не существует)
  • UNKNOWN явно подтверждает, что это значение в настоящее время неизвестно

Теперь предположим, что Betty удаляет свой URL (теперь известно, что он не существует). Кажется, VOID было бы наиболее подходящим.