Існує кілька різних заперечень проти використання NULL. Деякі заперечення засновані на теорії баз даних. Теоретично немає різниці між теорією та практикою. На практиці існує.
Це правда, що повністю нормалізована база даних може взагалі обійтися без NULLS. Будь-яке місце, де значення даних повинно залишатися осторонь, - це місце, де можна залишити цілий рядок без втрати інформації.
На практиці декомпозиція таблиць до цієї мети не приносить великих корисних цілей, і програмування, необхідне для виконання простих CRUD-операцій над базою даних, стає більш втомливим та схильним до помилок, ніж менше.
Є місця, де використання NULLS може спричинити проблеми: по суті вони обертаються навколо такого питання: що насправді означає відсутні дані? Все, що NULL насправді передає, це те, що в заданому полі не зберігається значення. Але висновки, які прикладні програми роблять із відсутніх даних, іноді бувають неправильними, і це викликає багато проблем.
Дані не можуть бути відсутніми в місці з різних причин. Ось декілька:
Дані в цьому контексті не застосовуються. наприклад, ім'я дружини / дружини самотньої особи.
Користувач форми введення даних залишив поле порожнім, і програма не вимагає введення в поле.
Дані копіюються в базу даних з іншої бази даних або файлу, і у джерелі відсутні дані.
Існує необов’язковий зв’язок, закодований у зовнішньому ключі.
Порожній рядок зберігався в базі даних Oracle.
Ось декілька вказівок щодо того, коли слід уникати НУЛЬ:
Якщо в процесі нормального очікуваного програмування, запитувачам доводиться писати багато ISNULL, NV, COALESCE або подібного коду, щоб замінити дійсне значення NULL. Іноді заміну краще робити під час зберігання, якщо те, що зберігається, є "реальністю".
Якщо підрахунки, ймовірно, будуть вимкнені, оскільки підраховано рядки, що містять NULL. Часто цього можна уникнути, просто вибравши count (MyField) замість count (*).
Ось одне місце, де ти, голі, краще звикнеш до NULLS і програмуєш відповідно: щоразу, коли ти починаєш використовувати зовнішні об’єднання, такі як LEFT JOIN та RIGHT JOIN. Вся суть позаду зовнішнього об’єднання, на відміну від внутрішнього, полягає в отриманні рядків, коли відсутні відповідні дані. Відсутні дані будуть вказані як NULLS.
Моя суть: не відкидайте теорію, не розуміючи її. Але дізнайтеся, коли відходити від теорії, а також як дотримуватися її.