J'ai une application (les données sont stockées dans PostgreSQL), où la majorité des champs dans les tables ne sont pas toujours nuls, mais le schéma de ces tables ne les applique pas. Par exemple, regardez cette fausse table:
CREATE TABLE "tbl" (
"id" serial,
"name" varchar(40),
"num" int,
"time" timestamp
PRIMARY KEY ("id"),
UNIQUE ("id")
);
En outre name
, num
, time
ne sont pas explicitement déclaré que NOT NULL
, en réalité , ils sont, parce que l'application se produit du côté de l' application.
Mon sentiment est qu'il devrait être changé, mais le contrepoint est que le niveau d'application s'assure que les valeurs nulles ne peuvent pas apparaître ici et que personne d'autre ne modifie manuellement la table.
Ma question est : quels sont les avantages (performances, stockage, cohérence, autre chose) et inconvénients (en supposant que j'ai déjà vérifié qu'il n'y a pas de null présents pour le moment, et de la logique métier il ne devrait pas y avoir de null) en définissant un NOT NULL
contrainte explicite ?
Nous avons un bon processus de révision du code et une documentation raisonnablement bonne, donc la possibilité qu'une nouvelle personne commette quelque chose qui brise cette contrainte n'est pas vraiment suffisante pour justifier le changement.
Ce n'est pas ma décision, c'est donc exactement pourquoi je cherche d'autres justifications. À mon avis, si quelque chose ne peut pas être nul et qu'une base de données vous permet de spécifier que quelque chose n'est pas nul, alors faites-le. Surtout si le changement est super simple.
NOT NULL
contraintes n'ont aucun effet direct sur la taille du stockage. Bien sûr, toutes les colonnes étant définies NOT NULL
, il ne peut pas y avoir de bitmap nul au départ. D'un autre côté: la taille de stockage est généralement beaucoup plus petite si vous utilisez NULL au lieu de valeurs "vides" ou factices pour les colonnes sans valeur réelle, car le bitmap nul est comparativement beaucoup plus petit (sauf pour les cas marginaux rares).