Pomyślałem o tym przez chwilę, próbując być pozytywnym i uzasadnić potrzebę użycia dowolnej wartości zamiast wartości zerowej i wydaje mi się (przynajmniej dla mnie), że nie ma uzasadnionego powodu, z wyjątkiem być może w zamkniętym zestawie danych do eksploracji danych w celu poprawy i uproszczenia wydajności i zapytań, a następnie tylko w przypadkach, w których liczby nie są wartościami, które mogą wypaczać dane. Nawet to należałoby rozważyć ostrożnie. We wszystkich rzeczywistych sytuacjach nadanie wartości zerowej nie jest dobrą praktyką. To zmienia definicję kolumny NOT NULL od twojego przyjaciela na wroga, ponieważ tak naprawdę nie jest to prawdą.
Zupełnie inaczej jest powiedzieć, że nasza aplikacja nie powinna przyjmować wartości NULL dla niektórych (lub nawet wszystkich) kolumn. Jest to rozsądna i dobra praktyka oraz istnieją dobrze udokumentowane korzyści z niedozwolenia wartości zerowych (na przykład klucze i indeksy oraz obliczenia statystyczne). Jednak przypisanie wartości „usiądź w miejscu” wartości zerowej wcale nie jest takie samo. Jest to pręt dla twoich własnych pleców, ponieważ musisz najpierw wybrać wartość, która nigdy nie będzie nigdy używana, odfiltruj tę wartość, tak jak w przypadku wartości zerowej, i pamiętaj, aby nie używać jej w obliczeniach i podsumowaniach oraz usuwać ją z zewnętrznych źródeł danych . Jest to co najmniej tak samo złe, jak użycie wartości null do przedstawienia rzeczywistej wartości, o czym mówisz sobie, że unikasz, ale tak nie jest.
Większość problemów, które powodują null, po zrozumieniu, można rozwiązać (lepsza normalizacja, indeksy oparte na funkcjach lub bitmapy lub zwykłe GDZIE x NIE JEST NULL). Czy uważasz, że w jakimś dużym Telco lub w Amazon na comiesięcznym spotkaniu dotyczącym wydajności niektóre DBA przedstawia ten wspaniały plan, aby nieco przyspieszyć zapytania dotyczące ich ogromnych zestawów danych, zastępując wartość null dowolną wartością, np. -5000 lub czymkolwiek - Jestem otwarty na wartość ... ”. A może myślisz, że spędzają czas na lepszym projektowaniu aplikacji, aby odfiltrować niepożądane wartości zerowe i optymalizować zapytania w oparciu o rzeczywiste dane, które otrzymują ? OK, dobrze, może comiesięczne spotkanie jest trochę optymistyczne, ale za każdym razem, gdy się one zdarzają, zapewniam cię, że „Zastąpienie wartości zerowej wartością -5000 (lub cokolwiek innego) dla lepszego interfejsu API” nie jest przedmiotem programu.
Dla mnie dobrze jest powiedzieć, że nie zaakceptuję brakujących danych (musisz mieć wiek, cenę, kod regionu lub cokolwiek innego), a czasem nawet dobrze jest powiedzieć, że w tej kolumnie jest wartość domyślna, która zostanie wprowadzona, jeśli nie stawiasz czegoś innego. Nie jest dobrze, aby odłożyć wartość na zero. Pomyśl o polach drugiego imienia jako przykład. Czasami nie będą one istnieć, ponieważ rodzice są zbyt leniwi, aby wypełnić wszystkie pola. Czy dodajemy do naszych danych „brak”, „brak” lub „nieznane”, aby usprawnić nasze wyszukiwanie? Nie, ponieważ mogą istnieć dziwni ludzie, którzy zmieniają swoje nazwy na te wartości, więc kiedy drukujemy dane, nie wiemy, czy musimy je uwzględnić, czy nie. Jest to prosty, ale dalekosiężny przykład. Wiemy o NULL i mamy przewidywalne wbudowane funkcje, aby sobie z tym poradzić. Nie możesz tego lepiej kodować.
Jeśli żadna odpowiedź (lub NULL) nie jest prawidłową odpowiedzią na twoje żądanie wejściowe, nie zezwalaj na to w aplikacji lub bazie danych, jeśli jest to dobra odpowiedź, musisz zezwolić na nią zarówno w aplikacji, jak i bazie danych i poradzić sobie z to jako poprawna odpowiedź. Jeśli jest to część zestawu prawidłowych odpowiedzi, twoja baza danych musi być zaprojektowana do jej przechowywania. W końcu nie mówisz hej, pola liczbowe są tak nudne, że pozwalają przechowywać liczby w kroplach i używać zdjęć dzikich zwierząt do reprezentowania każdej liczby, ponieważ to orzechy (fajne, ale orzechy). Nie decydujemy również, że nie podoba nam się litera B i jak jakiś okrutny koszmar z Ulicy Sezamkowej zamień ją na # w naszych danych. Jeśli B nie jest odpowiedzią, chcemy, abyśmy odpowiedzieli użytkownikowi „Hej, nie możesz tu wstawić B”. Po co więc traktować null inaczej?
Unikaj więc zer, których nie chcesz na poziomie aplikacji, i zajmuj się nimi w bazie danych, gdzie akceptujesz je w przeciwnym razie, tak jak żyrafa + żyrafa = hipopotam, twoje bezsensowne sprowadzanie danych sprawi ci kłopotów.