Кроме того: 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
недействительный URLVOID
предполагает, что URL-адрес известен (и не существует)UNKNOWN
явно подтверждает, что это значение в настоящее время неизвестно
Теперь предположим, что Betty
удаляет свой URL (теперь известно, что он не существует). Кажется, VOID
было бы наиболее подходящим.