Digamos que tiene una aplicación que tiene un campo booleano en su User
tabla llamada Inactive
.
¿Hay algo inherentemente incorrecto con solo almacenar falso como nulo? Si es así, ¿puede explicar cuál debería ser el lado negativo? He discutido esto con alguien hace unos meses y ambos acordamos que no debería importar siempre y cuando lo hagas de manera consistente en toda la aplicación / base de datos. Recientemente, alguien que conozco enfatizó que "verdadero" true
o false
debería usarse, pero realmente no dieron una explicación de por qué.
database-design
null
Ominus
fuente
fuente
Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database
esta es la sabiduría aceptada y no debe redefinir lo que significa Nulo en su aplicación. Será confuso para todos los demás que trabajen con su código.SELECT * FROM foo WHERE bar = FALSE
no da los resultados que espera.Respuestas:
Si.
NULL no es lo mismo que False.
Por definición, las comparaciones (y la lógica) que involucran NULL deberían devolver valores de NULL (no False). Sin embargo, las implementaciones de SQL pueden variar.
True and NULL
es NULL (no es falso).True and NULL or False
es NULL (no es falso).http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29
http://technet.microsoft.com/en-us/library/cc966426.aspx
fuente
null
es irrelevante para la lógica (como es el caso enwhatever OR TRUE
owhatever AND FALSE
, donde ningún valor dewhatever
puede cambiar la condición), entonces la expresión devuelve un valor. No es una optimización; así es como funciona la lógica de 3 valores . Cualquier DBMS que insista en devolverUNKNOWN
/NULL
para esas expresiones está fundamentalmente roto.Al permitir nulos en un campo booleano, está convirtiendo una representación binaria prevista (verdadero / falso) en una representación de tres estados (verdadero, falso, nulo) donde sus entradas 'nulas' son indeterminadas. El valor 'nulo' no es apropiadamente 'verdadero' ni 'falso'. ¿Qué razón tendrías para aumentar tu representación para ser inexacta?
Incluso si decide un patrón como este y lo hace de manera consistente a lo largo de su aplicación, eso no lo hace correcto. Terminará en una situación en la que no está claro para los ojos nuevos por qué ese patrón está en su lugar o, lo más probable, terminará en una situación en la que ese patrón se rompe inadvertidamente.
fuente
Lo que otros han dicho. 3 valores posibles no son booleanos.
Pero es posible que tenga una necesidad legítima de 3 valores. Tales como (verdadero, falso, desconocido). Incluso si este es el caso, si está en ultra-normalización, no permitirá ningún valor nulo en absoluto. En su lugar, almacenará un verdadero booleano en otra tabla con una relación de 1 a 1. Se podría generar un valor nulo en una consulta mediante una unión externa "fallida", no mediante un valor nulo almacenado físicamente.
fuente
false
), entonces tienen su lugar. Si no lo hicieran, no existirían. La alternativa, como se mencionó, es básicamente tener una tabla completamente diferente con solo la clave principal de su fila y un único booleano (o int, o varchar, o lo que sea). Para todos y cada uno de los campos que de lo contrario haría nulables. Aunque relacionalmente puro, es demasiado complicado para la mayoría de los propósitos.¿Es
bool?
un tipo booleano? No. Es de tipoNullable<T>
dondeT
es booleano. Un booleano anulable puede tener 3 valores: verdadero, falso y nulo. Para usarbool
obool?
depende de su requerimiento. Podría haber una razón legítima en la que necesite usar nulo pero un tipo que huele a binario pero no sabe la respuesta. En el ejemplo anterior,User.IsActive
Parece claro. El usuario está activo o no. Como sistema, es posible que desee saber si un usuario está activo o no. No debería haber "tal vez". Pero piense en algo como una bandera de características. ¿Está activada la función? Las respuestas podrían ser sí, no o no estoy seguro. Es posible que tenga una regla comercial que especifique que solo se muestra el botón cuando el indicador se establece en verdadero. Uno puede argumentar que bool es por defecto falso, entonces ¿por qué crear bool anulable? Invierta el requisito: ¿va a establecer todos los valores en el origen de datos en verdadero?fuente