Mam aplikację (dane są przechowywane w PostgreSQL), w której większość pól w tabelach nie zawsze ma wartość NULL, ale schemat tych tabel nie wymusza tego. Na przykład spójrz na tę fałszywą tabelę:
CREATE TABLE "tbl" (
"id" serial,
"name" varchar(40),
"num" int,
"time" timestamp
PRIMARY KEY ("id"),
UNIQUE ("id")
);
Również name
, num
, time
nie są wyraźnie zaznaczono NOT NULL
, w rzeczywistości są, ponieważ egzekucja odbywa się na stronie aplikacji.
Mam wrażenie, że należy to zmienić, ale kontrapunktem jest to, że poziom aplikacji upewnia się, że wartości null nie pojawią się tutaj i nikt inny nie modyfikuje tabeli ręcznie.
Moje pytanie brzmi : jakie są zalety (wydajność, pamięć masowa, spójność, coś jeszcze) i wady (zakładając, że już sprawdziłem, że w tej chwili nie ma wartości zerowych, a z logiki biznesowej nie powinno być żadnych wartości zerowych) poprzez ustawienie wyraźne NOT NULL
ograniczenie?
Mamy dobry proces przeglądu kodu i dość dobrą dokumentację, więc możliwość, że jakaś nowa osoba popełni coś, co łamie to ograniczenie, nie jest tak naprawdę wystarczająca, aby uzasadnić zmianę.
To nie jest moja decyzja, dlatego właśnie szukam innych uzasadnień. Moim zdaniem, jeśli coś nie może być zerowe, a baza danych pozwala określić, że coś nie jest zerowe - zrób to. Zwłaszcza jeśli zmiana jest bardzo prosta.
NOT NULL
ograniczenia nie mają bezpośredniego wpływu na rozmiar pamięci. Oczywiście, gdy wszystkie kolumny są zdefiniowane NOT NULL
, na początku nie może być pusta mapa bitowa. Z drugiej strony: rozmiar pamięci jest zwykle znacznie mniejszy, jeśli użyjesz NULL zamiast „pustych” lub fikcyjnych wartości dla kolumn bez rzeczywistej wartości, ponieważ pusta mapa bitowa jest stosunkowo znacznie mniejsza (z wyjątkiem rzadkich przypadków krawędzi).