2011-01-19 14 views
8

Tengo una tabla con 25 columnas donde 20 columnas pueden tener valores nulos para algunas (30-40%) filas. Ahora, ¿cuál es el costo de tener filas con 20 columnas nulas? ¿Esta bien?Pregunta de diseño Sql

O

es que un buen diseño para tener otra tabla para almacenar las 20 columnas y añadir una referencia a la primera tabla? De esta forma solo escribiré en la segunda tabla solo cuando haya valores de are.

Estoy utilizando SQL server 2005. Se migrará a 2008 en el futuro.

sólo 20 son columnas varchar, smallint resto, smalldate

Lo que estoy almacenando: Estas columnas almacenar diferentes atributos de la fila que pertenece. Estos atributos pueden ser nulos a veces.

La mesa llevará a cabo ~ mil millones de filas

favor comentar.

+6

¿Qué servidor de base de datos está utilizando? SQL Server 2008 admite el concepto de columnas dispersas que admite su escenario con un impacto mínimo. –

+0

Eche un vistazo a esta respuesta: http://stackoverflow.com/questions/229179/null-in-mysql-performance-storage/230923#230923 Y http://dev.mysql.com/doc/refman/5.0/ es/working-with-null.html – RobertPitt

+0

¿Ha considerado la herencia de tablas? –

Respuesta

2

Debe describir el tipo de datos que está almacenando. Parece que algunas de esas columnas deberían moverse a otra mesa.

Por ejemplo, si tiene varias columnas que representan varias columnas para el mismo tipo de datos, entonces diría moverlo a otra tabla. Por otro lado, si necesita esta cantidad de columnas para describir diferentes tipos de datos, entonces puedes necesitar mantenerlo como está.

Por lo tanto, depende de lo que está modelando.

+0

+1 para describir los datos ... Si conocemos las columnas en cuestión podemos dar un mejor consejo sobre la reestructuración (si es necesario) – scunliffe

+1

Se agregó más información sobre los datos y el tipo – kheya

+0

@Projapati: Parece reacio a ofrecer muchos detalles. Decir las columnas "almacenar diferentes atributos de la fila a la que pertenece" no me dice nada sobre el tipo de datos que está almacenando. Si quieres ofrecer algunos ejemplos, puedo decirte lo que pienso. Pero necesitaría más para continuar. –

2

¿Hay algunas circunstancias en las que se requieren algunas de esas columnas? Si es así, entonces quizás deberías usar alguna forma de herencia. Por ejemplo, si se tratara de información sobre pacientes en un hospital, y si había algunos datos que solo tenían sentido para las pacientes femeninas, entonces podría crear una tabla de FemalePatients con esas columnas. Esas columnas que siempre se deben recopilar para pacientes femeninos podrían entonces declararse NOT NULL en esa tabla separada.

2

Depende de los tipos de datos (40 entradas con nulos pueden tomar básicamente el mismo espacio que 40 entradas no anulables, independientemente de los valores). En SQL Server, el espacio es bastante eficiente con las técnicas normales. En 2008, tienes la característica SPARSE.

Si divide la tabla verticalmente con una relación 1: 1 opcional, existe la posibilidad de ajustar las dos tablas con una vista y agregar activadores en la vista para que sea actualizable y oculte la implementación subyacente.

De modo que hay muchas opciones, muchas de las cuales se pueden implementar después de ver la carga de datos y el comportamiento.

1

Cree tablas basadas en los distintos conjuntos de atributos que tiene. Entonces, si tiene algunos datos donde algunas de sus columnas no se aplican, tendría sentido tener esos datos en una tabla que no tenga esas columnas. En la medida de lo posible, evite repetir el mismo atributo en varias tablas. Asegúrate de que tus datos estén en al menos Boyce-Codd/5th Normal Form y no te equivocarás demasiado.