Поза аргументом про те, чи слід коли-небудь використовувати NULL чи ні: я відповідаю за існуючу базу даних, яка використовує NULL, щоб означати "відсутні або ніколи не введені" дані. Він відрізняється від порожнього рядка, що означає "користувач встановив це значення, і він вибрав" порожній "."
Інший підрядник проекту твердо висловлюється з аргументу "Сторінка NULL не існує для мене; я ніколи не використовую NULL, і ніхто інший не повинен". Однак мене бентежить те, що оскільки команда підрядника ДОЗНАЄ різницю між "зниклим / ніколи не введеним" та "навмисно порожнім або вказаним користувачем як невідомим", вони використовують один символ "Z" у коді та збережені процедури для представляють "відсутній / ніколи не введений" з тим самим значенням, що NULL, у всій іншій базі даних.
Незважаючи на те, що наш спільний клієнт просив це змінити, і я підтримав цей запит, команда називає це «стандартною практикою» серед адміністраторів баз даних, набагато просунутих, ніж я; вони неохоче змінюють використання NULL на основі лише мого необізнаного запиту. Отже, чи може хтось допомогти мені подолати своє незнання? Чи існує якийсь стандартний або невелика група осіб, або навіть єдиний гучний голос серед експертів з SQL, який виступає за вживання "Z" замість NULL?
Оновлення
У мене є відповідь від підрядника, щоб додати. Ось що він сказав, коли клієнт попросив видалити спеціальні значення, щоб дозволити NULL у стовпцях без даних:
В основному, я розробив базу даних, щоб уникати NULL, коли це можливо. Ось обґрунтування:
• НУЛЬ у полі [VARCHAR] рядка ніколи не є необхідним, оскільки порожній рядок (нульової довжини) надає точно ту саму інформацію.
• З НУЛОМ у цілочисельному полі (наприклад, значенням ID) можна обробити, використовуючи значення, яке ніколи не зустрічається в даних (наприклад, -1 для цілого поля ІДЕНТИЧНОСТІ).
• НУЛЬ у полі дати може легко спричинити ускладнення під час обчислення дати. Наприклад, у логіці, яка обчислює різницю дат, таку як різниця в днях між [RecoveryDate] та [OnsetDate], логіка підірветься, якщо одна або обидві дати NULL - якщо явно не враховано обидві дати будучи НУЛЬНИМ. Це додаткова робота та додаткова керованість. Якщо для [RecoveryDate] та [OnsetDate] використовуються дати "за замовчуванням" або "заповнювач" (наприклад, "1/1/1900"), математичні розрахунки можуть показувати "незвичні" значення, але логіка дати не підірветься.
Обробка NULL традиційно є областю, де розробники допускають помилки в збережених процедурах.
За свої 15 років роботи в DBA я вважав, що найкраще уникати НУЛЬ, де це можливо.
Здається, це підтверджує переважно негативну реакцію на це питання. Замість того, щоб застосовувати прийнятий підхід 6NF до проектування NULL, використовуються спеціальні значення, щоб "уникати NULL, де це можливо". Я розмістив це запитання з відкритою душею, і я радий, що дізнався більше про дискусію "НУЛІ корисні / НУЛІ - це зло", але зараз мені цілком зручно називати підхід "особливих цінностей" повною нісенітницею.
порожній рядок (нульової довжини) подає точно таку ж інформацію.
Ні, це не так; в існуючій базі даних, яку ми модифікуємо, NULL означає "ніколи не вводився", а порожній рядок означає "введено як порожній".
Обробка NULL традиційно є областю, де розробники допускають помилки в збережених процедурах.
Так, але ці помилки були допущені тисячі разів тисячами розробників, і уроки та застереження щодо уникнення цих помилок відомі та задокументовані. Як ми вже згадували тут: приймаєте ви чи відхиляєте NULL, подання відсутніх значень є вирішеною проблемою . Немає необхідності винаходити нове рішення лише тому, що розробники продовжують робити помилки, які легко подолати (і легко ідентифікувати).
Як виноска: я працюю DBE і розробником більше 20 років (що, безумовно, достатньо часу, щоб я знав різницю між інженером та адміністратором бази даних). Протягом своєї кар’єри я завжди був у таборі "НУЛІ корисні", хоча я знав, що кілька дуже розумних людей не погодились. Я вкрай скептично ставився до підходу "особливих цінностей", але недостатньо добре обізнаний з науковцями "Як уникнути НУЛИ правильним шляхом", щоб твердо висловитись. Я завжди люблю вчитися новим речам - і мені ще доведеться багато чому навчитися після 20 років. Дякуємо всім, хто сприяв тому, щоб зробити це корисною дискусією.