No hay duda de que los NULL deben evitarse cuando sea posible, debido a los problemas que pueden presentar varios problemas con la sintaxis de indexación y consulta.
Debido a los problemas que pueden presentar los NULL, ha habido un impulso para dejar de usarlos. Sin embargo, como la mayoría de estos movimientos, se ha salido de control, hasta el punto de que algunas personas insisten fanáticamente en que los NULL nunca se deben usar en la base de datos. Estuve en este campo durante muchos años, antes de encontrarme un poco demasiado entusiasta.
La respuesta está en algún punto intermedio. Los NULL deben evitarse siempre que sea posible, pero existen razones comerciales válidas para almacenarlos.
Muchas veces necesita almacenar un valor numérico opcional, y muchas personas le dirán que simplemente almacene un cero para indicar "sin valor", pero este es un antipatón aún peor de almacenar un valor mágico que realmente significa algo más .¿Qué pasa si no puedes usar cero para un campo, porque cero también se considera un valor significativo, o porque este valor se usa como el múltiplo de un divisor, entonces necesitas usar algún otro valor mágico (-1?) para ese campo en este caso, y ahora tiene un problema peor, porque todos sus campos numéricos opcionales ahora se comportan de manera diferente. Oye.
Las fechas son un candidato aún más convincente para los campos que aceptan valores numéricos. El estándar "sin valor" que las personas usan en .NET es el valor DateTime sin asignar predeterminado, que es DateTime.MinValue, o más específicamente el 1 de enero de 0001. Sin embargo, no puede escribir este valor mágico en la base de datos SQL porque el valor mínimo predeterminado un campo SQL Server DATETIME es el 1 de enero de 1973. Ahora debe tener algo que compruebe que está traduciendo esos valores correctamente a medida que se escriben y leen en la base de datos, y debe tener una codificación defensiva en todo el lugar que verifique para si sus campos de fecha son menores que SqlDateTime.MinValue, o simplemente para comprobar si son iguales a DateTime.MinValue. Double Oye.
Mi preferencia es tratar con los valores como realmente son, y no construir muchos constructos artificiales para ocultar el verdadero significado y uso del campo. Si un campo bien puede no tener un valor, hágalo aceptar el nulo y haga que se pueda agregar un nulo en los objetos de su aplicación (si su lenguaje admite tal cosa). Luego, cada vez que esté usando ese campo, debe considerar lo que debe hacerse en caso de que sea NULO, pero eso es realmente algo bueno. Por lo general, me opongo a que los desarrolladores desperdicien sus conocimientos sobre la complejidad innecesaria del código, pero eso se debe a que le quita el enfoque al verdadero problema comercial que se está resolviendo; sin embargo, en este caso, la falta de un valor ES parte del verdadero problema comercial y debe ser pensado. Si solo está incumpliendo este valor, el desarrollador que escriba una fórmula o algoritmo tendrá menos probabilidades de pensar en esas condiciones de borde donde faltan los valores, y puede que ni siquiera se dé cuenta en el momento en que existe la posibilidad de que esos valores falten. .
Creo que esto ya está respondido aquí http://stackoverflow.com/questions/163434/are-nulls-in-a-relational-database-okay – jfs