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, timenã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 NULLrestriçã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 NULLrestriçõ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).