Po pierwsze - przestań używać wyrażenia „Wartość zerowa”, po prostu doprowadzi Cię to na manowce. Zamiast tego należy użyć wyrażenia „marker zerowy” - znacznik w kolumnie wskazujący, że rzeczywista wartość w tej kolumnie jest brakująca lub nie ma zastosowania (należy jednak pamiętać, że znacznik nie mówi, która z tych opcji jest rzeczywiście przypadkiem¹).
Teraz wyobraź sobie, co następuje (gdy baza danych nie ma pełnej wiedzy na temat modelowanej sytuacji).
Situation Database
ID Code ID Code
-- ----- -- -----
1 A 1 A
2 B 2 (null)
3 C 3 C
4 B 4 (null)
Modelowana przez nas zasada uczciwości to „Kod musi być unikalny”. Sytuacja w świecie rzeczywistym to narusza, więc baza danych nie powinna zezwalać na jednoczesne umieszczanie w tabeli zarówno elementów 2, jak i 4.
Najbezpieczniejszym i najmniej elastycznym podejściem byłoby uniemożliwienie zerowania znaczników w polu Kod, więc nie ma możliwości niezgodności danych. Najbardziej elastycznym podejściem byłoby dopuszczenie wielu znaczników zerowych i martwienie się o unikalność przy wprowadzaniu wartości.
Programiści Sybase zastosowali nieco bezpieczne, niezbyt elastyczne podejście polegające na dopuszczeniu tylko jednego znacznika zerowego w tabeli - od tego czasu komentatorzy narzekają. Microsoft kontynuował to zachowanie, chyba dla kompatybilności wstecznej.
¹ Jestem pewien, że czytałem gdzieś, że Codd rozważał wdrożenie dwóch zerowych znaczników - jednego dla nieznanego, drugiego dla niemożliwego do zastosowania - ale odrzucił go, ale nie mogę znaleźć odniesienia. Czy dobrze pamiętam?
PS Mój ulubiony cytat o null: Louis Davidson, „Profesjonalny projekt bazy danych SQL Server 2000”, Wrox Press, 2001, strona 52. „Sprowadzone do jednego zdania: NULL jest złe”.