Como estudiante de CS, he aprendido un buen número de lenguajes de programación a lo largo de los años, la mayoría de los cuales han tenido algún concepto de tipo "anulable" u "opcional". Tenga en cuenta que estoy no hablar de punteros nulos o referencias, o lenguajes de tipo débilmente como JavaScript donde todo puede ser null
. Los ejemplos de lo que estoy hablando incluyen boost::optional
(C ++), java.util.Optional
(Java 8.0), prelude.Maybe
(Haskell) y todos los '?' tipos (por ejemplo int?
, float?
C # y Kotlin). Estas son construcciones que agregan nulabilidad a un tipo previamente no anulable dentro de un sistema de tipo estricto y estático.
SQL tiene un concepto similar: un tipo como INTEGER
puede ser anulable o no anulable, pero hay un giro. En SQL, INTEGER
es anulable de forma predeterminada y debe escribirse explícitamente INTEGER NOT NULL
para que no sea anulable.
Me parece extremadamente contra-intuitivo y potencialmente peligroso por permitir que los NULL sean el comportamiento predeterminado. Obviamente, SQL ha existido durante tanto tiempo en este punto que (la mayoría) de los desarrolladores de SQL han desarrollado una conciencia saludable de las trampas de NULL. Pero no puedo evitar imaginar que en los primeros días, NULL a menudo se arrastraba en lugares inesperados y problemáticos.
SQL es anterior a todos los ejemplos que he proporcionado, por lo que es posible que esto sea simplemente una cuestión de evolución histórica. Aún así, tengo que preguntar, ¿hay alguna buena razón para que el lenguaje se diseñe de esta manera, con tipos que se anulan por defecto?
Si es así, ¿es solo una razón histórica, o la lógica se mantiene hoy en día para el diseño de la base de datos?
Editar: no estoy preguntando por qué NULL es parte de SQL o por qué las columnas anulables son útiles. Solo estoy preguntando por qué las columnas son anulables por defecto . Por ejemplo, por qué escribimos:
column1 FLOAT,
column2 FLOAT NOT NULL
Más bien que:
column1 FLOAT NULLABLE,
column2 FLOAT