Come studente di CS, ho imparato un numero decente di linguaggi di programmazione nel corso degli anni, molti dei quali hanno avuto un concetto di tipo "nullable" o "opzionale". Nota che io sono non che parla di puntatori o riferimenti null, o di linguaggi debolmente tipizzati come JavaScript, dove tutto può essere null
. Esempi di ciò di cui sto parlando includono boost::optional
(C ++), java.util.Optional
(Java 8.0), prelude.Maybe
(Haskell) e tutti i '?' tipi (ad esempio int?
, float?
, C # e Kotlin). Si tratta di costrutti che aggiungono il nullability a un tipo precedentemente non annullabile all'interno di un sistema di tipi statici e rigorosi.
SQL ha un concetto simile: un tipo come INTEGER
può essere reso nullable o non annullabile, ma c'è una svolta. In SQL, INTEGER
è annullabile per impostazione predefinita e deve essere scritto in modo esplicito come INTEGER NOT NULL
per non essere annullabile.
Mi sembra estremamente contro-intuitivo e potenzialmente pericoloso per consentire a NULL di essere il comportamento predefinito. Ovviamente SQL è stato intorno così a lungo a questo punto che (la maggior parte) gli sviluppatori SQL hanno sviluppato una sana consapevolezza delle insidie di NULL. Ma non posso fare a meno di immaginare che nei primi giorni NULL spesso si insinuava in luoghi inaspettati e problematici.
SQL precede tutti gli esempi che ho fornito, quindi è possibile che questa sia semplicemente una questione di evoluzione storica. Tuttavia, devo chiedere, c'è qualche buona ragione per il linguaggio che deve essere progettato in questo modo, con tipi che sono annullabili per impostazione predefinita?
Se è così, è solo una ragione storica, o la logica resiste al design del database oggi?
Modifica: non sto chiedendo perché NULL è una parte di SQL o perché le colonne nullable sono utili. Sto solo chiedendo perché la colonna sia annullabile di default . Ad esempio, perché scriviamo:
column1 FLOAT,
column2 FLOAT NOT NULL
Piuttosto che:
column1 FLOAT NULLABLE,
column2 FLOAT