Ho un'applicazione (i dati sono archiviati in PostgreSQL), dove la maggior parte dei campi nelle tabelle non è sempre nulla, ma lo schema per queste tabelle non lo applica. Ad esempio guarda questo falso tavolo:
CREATE TABLE "tbl" (
"id" serial,
"name" varchar(40),
"num" int,
"time" timestamp
PRIMARY KEY ("id"),
UNIQUE ("id")
);
Inoltre name
, num
, time
non sono esplicitamente dichiarato come NOT NULL
, in realtà sono, perché l'esecuzione avviene sul lato di applicazione.
La mia sensazione è che dovrebbe essere cambiato, ma il contrappunto è che il livello dell'applicazione si assicura che i valori null non possano apparire qui e nessun altro modifica manualmente la tabella.
La mia domanda è : quali sono i vantaggi (prestazioni, archiviazione, coerenza, qualcos'altro) e gli svantaggi (supponendo che ho già verificato che al momento non siano presenti null e che dalla logica aziendale non dovrebbero esserci null) impostando un NOT NULL
vincolo esplicito ?
Abbiamo un buon processo di revisione del codice e una documentazione ragionevolmente buona, quindi la possibilità che una persona nuova commetterebbe qualcosa che rompa questo vincolo non è davvero sufficiente per giustificare il cambiamento.
Questa non è una mia decisione, quindi è esattamente per questo che cerco altre giustificazioni. Secondo me, se qualcosa non può essere nullo e un database ti consente di specificare che qualcosa non è null, allora fallo. Soprattutto se il cambiamento è super semplice.
NOT NULL
vincoli non hanno alcun effetto diretto sulla dimensione della memoria. Naturalmente, con tutte le colonne definite NOT NULL
, non può esserci una bitmap nulla per cominciare. D'altra parte: la dimensione della memoria è in genere molto più piccola se si utilizzano valori NULL anziché "vuoti" o fittizi per le colonne senza valore reale, poiché la bitmap null è relativamente più piccola (tranne per i rari casi limite).