valores validar que not ejemplos ejemplo cocina celulares campo buscar sql database database-design schema data-modeling

sql - validar - ¿Cómo puedo evitar NULLs en mi base de datos, mientras que también representa los datos que faltan?



validar campo null sql server (8)

Entonces, ¿cómo se diseña sin NULLS? Esa fue la pregunta original.

En realidad es bastante fácil. Usted diseña de tal manera que cada vez que tenga que dejar algunos datos faltantes, puede hacerlo dejando una fila completa faltante. Si una fila no está allí, no es una fila llena de NULLs. Simplemente no está allí.

Entonces, en el caso de "DateOfDeath", tenemos una tabla con dos columnas, a saber, PersonId y DateOfDeath. PersonId hace referencia a Id en la tabla Personas. Si no hay DataOfDeath para ser almacenado, no almacenamos la fila. Fin de la discusión.

Si realiza una OUTER JOIN entre esta y la tabla Persons, obtendrá un NULL para DateOfDeath donde no haya fila. Y si usas esto en una cláusula where, obtendrás el comportamiento usual de perplejidad con respecto a la lógica de 3 valores. Si realiza una UNIÓN INTERNA, las filas para las que no hay FechaDeDeceso simplemente desaparecerán de la unión.

Un diseño que permite que cada columna NO sea NULA aplicada se llama sexta forma normal.

Habiendo dicho todo eso, a menudo permití NULLs en columnas no críticas. Y no tengo una forma concisa de decirle cómo determino que una columna es crítica.

En SQL y la teoría relacional (CJ Date, 2009), el capítulo 4 recomienda evitar las filas duplicadas y también evitar los atributos NULL en los datos que almacenamos. Si bien no tengo problemas para evitar las filas duplicadas, estoy luchando para ver cómo puedo modelar los datos sin utilizar NULL . Tome lo siguiente, por ejemplo, que es un poco del trabajo.

Tenemos una tabla de artist , que tiene, entre otras columnas, una columna de gender . Esta es una clave externa a la tabla de gender . Sin embargo, para algunos artistas, no conocemos su género, por ejemplo, se nos ha dado una lista de música nueva que no tiene descripciones del artista. ¿Cómo, sin usar NULL se pretende representar estos datos? La única solución que veo es agregar un nuevo género, "desconocido", a la tabla de gender .

Mientras disfruto completamente este libro, me sentí realmente decepcionado cuando el capítulo concluyó con:

Por supuesto, si los valores nulos están prohibidos, la información faltante deberá manejarse por otros medios. Desafortunadamente, esos otros medios son demasiado complejos para ser discutidos en detalle aquí.

Lo cual es una verdadera lástima, ¡porque esta era la solución sobre la que estaba esperando leer! Hay una referencia para leer el apéndice, que tiene muchas publicaciones para leer, pero esperaba un resumen un poco más realista antes de sumergirme en la lectura de estos.

Estoy recibiendo algunas personas que comentan que no entienden por qué deseo evitar ''NULL'', así que citaré el libro nuevamente. Tome la siguiente consulta:

SELECT s.sno, p.pno FROM s, p WHERE s.city <> p.city OR p.city <> ''Paris''

Ahora, tome el ejemplo de que s.city es Londres, y p.city es París. En este caso, Londres <> París, por lo que la consulta es verdadera. Ahora tome el caso de que p.city no es París, y de hecho es xyz . En este caso, (Londres <> xyz ) O ( xyz <> París) también es Verdadero. Entonces, dada cualquier información, esta consulta es verdadera. Sin embargo, si xyz es ''NULO'', el escenario cambia. En este caso, estas dos expresiones no son ni verdaderas ni falsas, de hecho son desconocidas. Y en este caso porque el resultado es desconocido, no obtendrá ninguna fila devuelta.

El paso de la lógica de 2 valores a la lógica de 3 valores puede fácilmente introducir errores como este. De hecho, acabo de presentar uno en el trabajo que motivó esta misma publicación. ¡Quería todas las filas donde el type != 0 Sin embargo, esto realmente termina emparejando type == 0 OR type IS NULL - comportamiento confuso.

Si no modelé mis datos con o sin NULL en el futuro no está claro, pero tengo mucha curiosidad sobre cuáles son las otras soluciones. (Yo también siempre he sido del argumento de que si no sabes, deberías usar NULL ).


No estoy de acuerdo con el autor y afirmaría que NULL es en realidad la forma CORRECTA de manejar datos faltantes para campos opcionales. De hecho, es la razón por la que NULL existe en absoluto ...

Para su problema específico con respecto al género:

  • ¿Estás seguro de que quieres una tabla de género e incurrir en el costo de una unión extra para cada consulta? Para los tipos enumerados simples, no es irracional convertir el campo en int y definir 1 = hombre, 2 = mujer, NULO = desconocido.

No permita que una columna se defina como NULL si es posible. Para mí, no tiene nada que ver con la regla comercial de lo que quiere que NULL signifique que tiene que ver con el disco I / O.

En SQL Server, una columna anulable, digamos un carácter 10, tomará un bit en un mapa de bits cuando sea nulo y 10 bytes cuando no pueda contener nulos. Entonces, ¿cómo tiene un daño nulo de disco de E / S. La forma en que duele es cuando un valor se inserta en una columna donde solía estar un valor nulo. Como SQL no reservó espacio, no hay espacio en la fila para simplemente poner el valor, por lo que SQL Server debe cambiar los datos para dejar espacio. La división de páginas, la fragmentación, la actualización del RID si se trata de un HEAP, etc. afectan a todas las E / S del disco.

Por cierto, si hay una tabla de género, podríamos agregar otra fila para "No se puede determinar el verdadero origen sexual o estado del individuo".


Simplemente almacenando solo la información conocida, en otras palabras, la Asunción Mundial Cerrada. Intenta estar al menos en Boyce Codd / Fifth Normal Form y no te equivocarás demasiado.


Todos hablan y nadie excepto Dportas y Walter pueden incluso entender la pregunta. Ok, entonces el 95% de las personas en SO no entienden el problema nulo, y se sienten amenazados porque sus bases de datos están llenas de nulos, quieren convertir al buscador. No tiene precio. ¿Cómo va alguien a aprender cuando están discutiendo?

Bien por ti, por eliminar Nulls. Nunca he permitido Nulls en ninguna de mis bases de datos.

Por supuesto, si los valores nulos están prohibidos, la información faltante deberá manejarse por otros medios. Desafortunadamente, esos otros medios son demasiado complejos para ser discutidos en detalle aquí.

En realidad, no es tan difícil en absoluto. Hay tres alternativas.

  1. Aquí hay un documento sobre cómo manejar la información que falta sin usar NULL de H Darwen, que puede ayudar a entender el problema.

1.1. La Sexta Forma Normal es la respuesta. Pero no tiene que normalizar toda su base de datos a 6NF. Para cada columna que es opcional, necesita una tabla secundaria fuera de la tabla principal, con solo PK, que también es FK, porque es una relación 1 :: 0-1. Además de PK, la única columna es la columna opcional.

Mire este Modelo de Datos ; AssetSerial en la página 4 es un caso clásico: no todos los Assets tienen SerialNumbers ; pero cuando lo hagan, quiero que los almacenen; más importante, quiero asegurarme de que sean únicos.

(Para la gente de OO, por cierto, ese es un diagrama de clase de tres niveles en notación relacional, una "herencia de tabla Concwete", no es gran cosa, lo hemos tenido durante 30 años).

1.2. Para cada tabla, use una Vista para proporcionar la forma 5NF de la tabla. Claro, use Nulo (o cualquier valor que sea apropiado para la columna) para identificar la ausencia de la columna para cualquier fila. Pero no actualice a través de la vista.

1.3 No use uniones rectas para agarrar la columna 6NF. No use uniones externas, tampoco (y haga que el servidor complete un nulo para las filas faltantes). Use una subconsulta para rellenar la columna y especifique el valor que desea devolver para un valor perdido (excepto si tiene Oracle, porque su procesamiento de subconsulta es incluso peor que su procesamiento establecido). P.ej. y solo un ej. puede convertir una columna numérica en una cadena y usar "Falta" para las filas faltantes.

Cuando no quiere ir tan lejos (6NF), tiene dos opciones más.
.
2. Puedes usar sustitutos nulos. Yo uso CHAR (0) para las columnas de caracteres y 0 para numéricas. Pero no lo permito para FK. Obviamente, necesita un valor que está fuera del rango normal de datos. Esto no permite Three Valued Logic.
.
3. Además de (2), para cada columna Nullable, necesita un indicador booleano. Para el ejemplo de la columna Sex , el indicador sería algo así como SexIsMissing o SexLess (lo siento). Esto permite una lógica de tres valores muy ajustada. A muchas personas en ese 5% les gusta porque el DB permanece en 5 NF (y menos tablas); las columnas con información faltante se cargan con valores que nunca se usan; solo se usan si el indicador es falso. Si tiene un db empresarial, puede ajustarlo en una Función y siempre usar la UDF, no la columna sin formato.

Por supuesto, en todos los casos, nunca puede evitar escribir el código que se requiere para manejar la información faltante. Si es ISNULL() , o una subconsulta para la columna 6NF, o un indicador para verificar antes de usar el valor, o una UDF.

Si Null tiene un significado específico ... ¡ entonces no es un Nulo! Por definición, Null es el valor desconocido.


NULL podría / debería usarse siempre que:

A ) Tienes una razón comercial. Por ejemplo, en una tabla de pagos, un valor de pago NULL significaría que nunca se pagó. Un valor de pago de 0.00 significaría que intencionalmente no pagamos nada. Para las historias clínicas, un valor NULL para la lectura de la presión arterial significaría que no tomó una PA, un valor 0 significaría que el paciente está muerto. Esta es una distinción significativa , y necesaria en ciertas aplicaciones.

B ) Sus consultas lo explican. Si comprende el efecto de NULL en IN , EXISTS , operadores de desigualdad (como lo especificó en OP), etc., entonces no debería ser un problema. Si tiene NULL ahora en sus tablas y no desea el valor para ciertas aplicaciones, puede emplear vistas y COALESCE o ISNULL para llenar diferentes valores si la tabla fuente tiene un NULL .

EDITAR:

Para abordar las preguntas de OP sobre las desigualdades / igualdades del "mundo real" usando NULL , este es un gran ejemplo que uso a veces.

Estás en una fiesta con otras 3 personas. Usted sabe que una persona se llama "John" pero no conoce a los demás.

Lógicamente , la respuesta para "¿Cuántas personas se llaman Joe?" Es desconocida o NULL . En SQL, esto sería algo así como

SELECT name FROM party where NAME = ''Joe'' No obtendría filas ya que no conoce sus nombres. Pueden o no ser Joe.

Tu desigualdad sería:

SELECT name from party where NAME <> ''Joe'' Usted solo obtendría un valor de retorno para "Juan" ya que el nombre de John es todo lo que usted conoce. Las otras personas pueden o no ser Joe, pero no tienes manera de saberlo.


null s son una consecuencia de que la teoría se encuentra con la realidad y tiene que ajustarse para ser utilizable. En mi opinión, intentar evitar todos null valores null última instancia conducirá a un código más feo y menos sostenible que el simple uso de null corresponda.


Se requieren NULL, no hay necesidad de reemplazarlos

La definición enitre de NULL es que es desconocida; simplemente reemplazarla por un tipo arbitrario hace lo mismo, ¿por qué?

Para los comentarios a continuación:

Acabo de probar esto, ninguno es verdad:

declare @x char set @x = null if @x = @x begin select ''true'' end if @x <> @x begin select ''false'' end

Solo puedo interpretar esto como que, dado que nulo es desconocido, no puede decirse que iguala o no es igual; por lo tanto, ambas afirmaciones son falsas.