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, timenon 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 NULLvincolo 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 NULLvincoli 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).