Tengo una aplicación (los datos se almacenan en PostgreSQL), donde la mayoría de los campos en las tablas no siempre son nulos, pero el esquema para estas tablas no impone esto. Por ejemplo, mira esta tabla falsa:
CREATE TABLE "tbl" (
"id" serial,
"name" varchar(40),
"num" int,
"time" timestamp
PRIMARY KEY ("id"),
UNIQUE ("id")
);
También name
, num
, time
No se indican explícitamente como NOT NULL
, en realidad son, debido a la aplicación ocurre en el lado de la aplicación.
Mi sensación es que debería cambiarse, pero el contrapunto es que el nivel de aplicación se asegura de que los valores nulos no puedan aparecer aquí y nadie más modifique manualmente la tabla.
Mi pregunta es : ¿Cuáles son los beneficios (rendimiento, almacenamiento, consistencia, algo más) e inconvenientes (suponiendo que ya verifiqué que no hay nulos presentes en este momento, y de la lógica de negocios no debería haber nulos) estableciendo un NOT NULL
restricción explícita ?
Tenemos un buen proceso de revisión de código y una documentación razonablemente buena, por lo que la posibilidad de que alguna persona nueva cometa algo que rompa esta restricción no es realmente suficiente para justificar el cambio.
Esta no es mi decisión, así que es exactamente por eso que estoy buscando otras justificaciones. En mi opinión, si algo no puede ser nulo y una base de datos le permite especificar que algo no es nulo, entonces simplemente hágalo. Especialmente si el cambio es super simple.
NOT NULL
restricciones no tienen ningún efecto directo sobre el tamaño de almacenamiento. Por supuesto, con todas las columnas definidas NOT NULL
, no puede haber un mapa de bits nulo para empezar. Por otro lado: el tamaño de almacenamiento suele ser mucho más pequeño si usa NULL en lugar de valores "vacíos" o ficticios para columnas sin valor real, porque el mapa de bits nulo es comparativamente mucho más pequeño (excepto en casos extremos poco comunes).