Eu tenho um aplicativo (os dados são armazenados no PostgreSQL), onde a maioria dos campos nas tabelas nem sempre é nula, mas o esquema para essas tabelas não impõe isso. Por exemplo, veja esta tabela falsa:
CREATE TABLE "tbl" (
"id" serial,
"name" varchar(40),
"num" int,
"time" timestamp
PRIMARY KEY ("id"),
UNIQUE ("id")
);
Além disso name
, num
, time
não são explicitamente indicado como NOT NULL
, na realidade, eles são, porque a aplicação acontece no lado de aplicação.
Meu sentimento é que ele deve ser alterado, mas o contraponto é que o nível do aplicativo garante que os valores nulos não possam aparecer aqui e ninguém mais modifique manualmente a tabela.
Minha pergunta é : Quais são os benefícios (desempenho, armazenamento, consistência, outra coisa) e desvantagens (supondo que eu já verifiquei que não há nulos presentes no momento e, pela lógica de negócios, não deve haver nulos) definindo um NOT NULL
restrição explícita ?
Temos um bom processo de revisão de código e uma documentação razoavelmente boa; portanto, a possibilidade de alguém novo cometer algo que rompa essa restrição não é realmente suficiente para justificar a alteração.
Esta não é uma decisão minha, por isso é exatamente por que estou procurando outras justificativas. Na minha opinião, se algo não puder ser nulo e um banco de dados permitir que você especifique que algo não é nulo - basta fazê-lo. Especialmente se a mudança for super simples.
NOT NULL
restrições não têm efeito direto no tamanho do armazenamento. Obviamente, com todas as colunas sendo definidas NOT NULL
, não pode haver um bitmap nulo para começar. Por outro lado: o tamanho do armazenamento é geralmente muito menor se você usar NULL em vez de valores "vazios" ou fictícios para colunas sem valor real, porque o bitmap nulo é comparativamente muito menor (exceto casos de borda raros).