2010-12-13 21 views
7

No estoy seguro de cuáles son las mejores prácticas para tratar con valores NULL cuando tengo una sola tabla donde dos campos solo se rellenan algunas veces creando muchos valores NULL en las filas.Crear una tabla db Prácticas recomendadas NULL

¿Deberían los dos campos moverse a una tabla separada creando dos tablas sin valores NULOS?

Unir estas dos tablas simplemente devolvería un resultado que iguala mi tabla original con las NULL, entonces, ¿qué sentido tiene eso?

Parece inútil separarlos, pero he estado leyendo un poco acerca de evitar que los nulos estén todos juntos en la base de datos.

Cualquier idea bienvenida.

+0

¿Ejecuta consultas contra esos dos campos? –

+0

Posibles respuestas también aquí: http://dba.stackexchange.com/a/5227/14987 –

Respuesta

10
  1. Teóricamente, se supone que un NULL significa "valor desconocido". Por lo tanto, de nuevo, puramente teóricamente, debe diseñar sus tablas cuando esté normalizado para que no tenga que completar valores NULOS para indicar "no aplicable para esta fila". Sin embargo, este punto no tiene ninguna relación con ninguna consideración práctica (diseño, rendimiento o legibilidad de consultas).

  2. Prácticamente, hay algunas consideraciones de rendimiento. Usted debe normalizar los datos de distancia muy escasa en los siguientes casos:

    • hay beneficio material de acortar la mesa (IO tanto sabia y/o en el espacio del reloj). Los NULL ocupan espacio, y cuanto más anchas sean las filas, peor será el rendimiento. Esto es especialmente cierto cuando la tabla tiene MUCHAS filas y hay muchas columnas dispersas. Para una tabla más pequeña con solo 2 de tales columnas, los beneficios obtenidos podrían no valer la pena de tener una unión extra.

    • Sus consultas tienen la columna en cuestión en la cláusula WHERE. IIRC, consultar en una columna fuertemente NULL-ed es bastante ineficiente.

    • Por otro lado, en cierto punto, tener uniones adicionales en la consulta puede perjudicar el rendimiento del optimizador (al menos lo hace en Sybase una vez que sus uniones tienen más de 10 tablas, desde ocupar recursos de la CPU cuando el optimizador se ejecuta realmente confundiendo el optimizador para elegir un plan MUY malo). La solución es evitar tener demasiadas tablas debido a la normalización (como en, no molestar en dividir sus 2 columnas en una tabla separada), o forzar el plan de consulta. El último es obviamente Bad Juju.

+0

'nulls' no siempre ocupan espacio. Usando Oracle, si están al final de una fila, toman cero bytes, e incluso si no lo son, toman como máximo 1 byte. –

+0

@JackPDouglas - No sabía eso de Oracle, ¡gracias !. Ese no es el caso tristemente en Sybase (o en el servidor MS SQL a menos que use una columna dispersa) – DVK

+0

¿Qué pasa con MySQL? –

2

Nulos causan resultados incorrectos e inconsistentes en las consultas y en general aumentan la complejidad del código debido al manejo especial que se necesita en el código que tiene que procesarlos. Por estas razones, generalmente tiene sentido evitar o minimizar los nulos en los diseños de su base de datos. Tampoco necesita usar nulos en las consultas, aunque SQL lamentablemente los hace muy difíciles de evitar. Sin embargo, al no usar valores nulos en las tablas base, se asegurará de que su modelo de datos refleje con mayor precisión la realidad y le dará a los usuarios de la base de datos más control sobre cómo desean que se utilicen los nulos.

+0

@dportas: ¿podría detallar la parte "Nulls causa resultados incorrectos e incoherentes en las consultas"? – DVK

+1

"Los nulos causan resultados incorrectos e incoherentes en las consultas", solo si mezcla y combina los valores centinela y NULL en general. Preferiría un null limpio a una cadena vacía o NULL. No menos importante con el mapa de bits nulo de SQL Server, por ejemplo, – gbn

+1

@DVK, nulo no es un valor. A diferencia de los valores normales, la forma en que SQL trata null generalmente no tiene mucho sentido en el mundo real. La validez de los resultados depende del significado previsto de null. En la práctica, tienen muchos significados diferentes y contradictorios. Por ejemplo, sugirió que null podría usarse para indicar un "valor desconocido", sin embargo, SQL no es compatible con eso. En matemáticas, realidad y en sentido común, x = x evaluaría TRUE si x fuera desconocido pero no lo es en SQL si x es nulo. Por lo tanto, SQL no trata con precisión nulo como un "valor desconocido". – sqlvogel

2

Como dportas implica en un comentario, es útil saber qué es un valor null en un campo particular significa - no es lo que significa en teoría, pero lo que significa en sus datos.

pienso todo el tiempo que esté claro lo que significa un null en su mesa, y si está seguro de que sólo significa una cosa , se puede tomar una decisión informada sobre si pragmática para permitirlo.

Opinión: Mi regla de oro es que los campos anulables están bien, pero no deben realizar varias tareas

+0

+1 Mis pensamientos también. Olvídese de la teoría y sea coherente ... – gbn

+0

Cita de Keith Hare, quien dirige el comité de estándares SQL: "Al principio del desarrollo del estándar SQL: ANSI e ISO 1999, existía un concepto de tipos NULL definidos por el usuario. era permitir hasta 128 tipos diferentes de NULL. Uno necesitaba un mecanismo para especificar qué tipo NULL y comparar dos tipos NULL para ver si eran del mismo tipo de NULL. El concepto era muy poderoso desde el punto de vista del diseño de la base de datos, pero muy complejo para especificar en el estándar. No había ninguna indicación de que alguno de los vendedores fuera capaz de implementar el concepto, por lo que eventualmente fue descartado ". – onedaywhen

+0

@onedaywhen jeje [le gana a usted] (http://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls/5223#5223) –

2

valores nulos son fundamentales para tener en una base de datos. Nunca he tratado con una base de datos que no permitiera nulos que al final no fue mucho más difícil de consultar, mucho más difícil de mantener (cómo se decide qué valor significa que no sé la respuesta) y generalmente tengo más datos malos Sí nulos requieren un manejo especial en las consultas, por lo que hacer cosas como agregar una fecha posterior (1/1/9999) como fecha de finalización para evitar tener un nulo.

La verdad es que algunos datos simplemente no se conocen en el momento en que se inserta el registro. No hay sustituto para nulo.

Ahora en su caso, si debe dividirse en dos tablas depende mucho del ancho de las tablas y la frecuencia que necesitará para consultar esas columnas que aceptan valores nulos. No es probable que mueva una columna de segundo plano a otra tabla, aunque tuve muchos nulos porque siempre se consulta con la otra información en la tabla base. También es poco probable que mueva una columna de fecha de finalización. Pero si las columnas son cosas que es bueno conocer pero que normalmente no se consultan cada vez que consulta los datos base (como Cumpleaños, color de cabello, etc.), entonces una tabla de referencia solo para los registros que contienen los datos puede estar bien. Sin embargo, recuerde que cuando consulta si usa una combinación interna, elimina todos los registros que no tienen un valor en la segunda tabla. Si normalmente quisiera todos los registros (como con el segundo nombre, raramente consulto solo para encontrar a las personas con un segundo nombre de 'Mary'), entonces tiendo a mantenerlos en la misma tabla a menos que la mesa esté muy amplia y yo Por lo general, no quiero consultar esa información.

+0

Es discutible que los nulos sean útiles, pero decir que son "críticos" o que "no hay sustituto" para ellos es ir demasiado lejos. Las bases de datos son solo colecciones de hechos sobre el mundo. La ciencia, las matemáticas y la lógica lograron describir el mundo con precisión durante siglos antes de que aparecieran SQL y nulos. Incluso en SQL, muchas personas diseñan bases de datos que funcionan perfectamente bien sin usar valores nulos. – sqlvogel

+0

Sí, sí diseñan bases de datos sin ellas, pero nunca he visto una que funcionara bien. ¿Qué usas cuando quieres un valor numérico que se establecerá más tarde y 0 tiene un significado para el campo, por ejemplo? ¿Cómo sabe el desarrollador qué valor falso usar o qué se usó en el pasado? – HLGEM

+0

@HLGEM - vea el punto # 1 de mi respuesta. A lo que se refería en su comentario era al uso real al 100% de un NULL en la lógica relacional - "valor desconocido"; y como tal es definitivamente muy difícil de prescindir, los valores especiales mágicos de "valor inválido" son Muy Malos. El uso de NULL como "sin valor" que se arrastró con el tiempo es lo que es opcional. – DVK

Cuestiones relacionadas