В чем проблема "нулевых" значений в mysql или других БД? - PullRequest
0 голосов
/ 10 апреля 2020

Насколько я знаю, null может быть проиндексирован в InnoDB. Но многие коллеги говорят, что нулевые значения - это плохой дизайн БД. Так что я не знаю, в чем проблема "нуля", это проблема с 3-м значением (например, не известно, не известно) или что-то еще, что мешает людям использовать пустые столбцы?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2020

NULL является неотъемлемой частью SQL. Это указывает на значение, которое не существует.

Избегание NULL приведет к ситуациям, когда вы создаете произвольные специальные значения для несуществующих элементов (0, -1, пустые строки и т. Д. c). Это был бы плохой дизайн.

0 голосов
/ 20 апреля 2020

Я бы предложил, чтобы 80% столбцов были объявлены NOT NULL.

Но во многих случаях NULL - это «естественная» вещь для использования -

  • Время начала известно, но время окончания еще не известно .
  • Необязательный атрибут
  • et c.

Что касается индексации, прочитайте правила и будьте готовы их соблюдать. PRIMARY KEY запрещает NULLs, но UNIQUE позволяет им. Но считаются ли они «равными» или нет.

Как уже упоминалось, IS NULL и IS NOT NULL работают, как ожидалось, а = NULL - нет. Также обратите внимание, что <=>.

LEFT JOIN создает искусственный NULLs (когда строка 'правой' таблицы отсутствует). Пример такого использования:

   FROM a
   LEFT JOIN b ON ...
   WHERE b.id IS NULL

См. COALESCE(), чтобы узнать, как превратить NULL во что-то еще. Пример:

SELECT ...,
       ( SELECT name FROM foo WHERE ... ) AS foo_name,
       ...,
     FROM ...

может доставить NULL. Это было бы дружелюбнее:

SELECT ...,
       COALESCE(( SELECT name FROM foo WHERE ... ), 'N/A') AS foo_name,
       ...,
     FROM ...

Лично я часто избегаю NULL в этих двух местах:

    string VARCHAR(99) NOT NULL DEFAULT ('') -- empty string is usually good enough
    choice ENUM('unknown', 'this', 'that') NOT NULL  -- easier to display and test

Практически нет разницы в производительности (пространство или скорость) между NULL и NOT NULL.

...