Cuando no hay que normalizar la base de datos
12:30 H (CET)| Temas: Bases de datos
La normalización es el proceso por el cual se optimizan las tablas de una base de datos para que no haya datos redundantes, se optimice el espacio en disco y se evite errores en la actualización de datos. Ahora bien, aunque la normalización es el estado idóneo para la base de datos, eso no quiere decir que sea el más idóneo para nuestra aplicación.
Existen un caso perfecto cuando la normalización no es adecuada y es cuando la obtención de datos es lenta. Si normalizamos y eso implica que para obtener los datos tengamos que realizar varios joins, al haber muchos datos puede darse la situación de que las consultas sean lentas.
Algo parecido nos ha pasado en Bitacoras.com, ha sido necesario desnormalizar para mejorar la velocidad de respuesta. Imaginaros, teníamos que mostrar dentro de la Comunidad de los usuarios los posts de los usuarios a los que sigues y su actividad (tal sigue a cual).
Como se puede apreciar son datos totalmente distintos y lógicamente van en tablas diferentes, y a parte hay que obtener los datos de los usuarios a los que se sigue y usarlos para obtener sus posts (de todas sus bitácoras) y sus actividades y ordenarlos por fecha descendiente. Solo de leerlo ya me aparecen unos cuantos joins por la mente.
La solución ha sido crear una tabla de enlaces a ids de otras tablas. En la misma tabla tengo enlaces a los posts y a las actividades y a los ids de los usuarios. Es más rápido (unas 300 veces) debido a que existe paginación y es preferible obtener ids de dos tablas en una consulta sencilla y luego obtener n registros sencillos, que obtenerlo en una única consulta.
Otra cosa que he observado es que puede ser más rápido obtener una lista de IDs (sacadas de una consulta) y luego comparar haciendo un IN que hacer un join de dos tablas, cuando una de estas tablas se obtiene mediante una consulta.
Al final lo que nos queda es que la teoría no es siempre válida y que las situaciones en las que nos podemos encontrar hacen que la solución menos elegante sea la más efectiva
Relacionados
Feedback (3) » Formulario
1. Alfonso Jiménez ~ Jueves, 28 Feb 2008 | 11:52H:
Tienes razón en algunas cosas, pero también es cierto que la normalización no solo tiene en cuenta la obtención/selección de datos, sino la modificación y la eliminación de registros. A veces podemos mejorar una acción enormemente, pero se complican las otras dos.
Saludos!
2. Juan I. Benavides ~ Jueves, 28 Feb 2008 | 16:40H:
Me da gusto saber que no son solo rebeldías mías =P
Aunque algunos se toman como excusa esto y nunca normalizan nada
3. Luis ~ Jueves, 28 Feb 2008 | 16:44H:
Cierto, Alfonso, yo también hablaba de la actualización de datos. Está claro que hay que tener en cuenta muchas cosas antes de no normalizar, pero en mi caso la tabla que uso intermedia son de valores que no van a cambiar y que hacen referencia a otros. En vez de usar un join, me creo una tabla.
Juan, también de acuerdo contigo, esto no es excusa para no normalizar.

