Apuntes de como normalizar una tabla de base de datos.



La Normalización ayuda a clarificar la base de datos y a organizarla en partes más pequeñas, y más fáciles de entender. En lugar de tener una tabla gigantesca y monolítica que tiene muchos diferentes aspectos, solo tenemos que entender los objetos más tangibles, así como las relaciones que guardan con otros objetos pequeños.

"La primera forma normal" Las columnas repetidas deben eliminarse y colocarse en tablas separadas. Poner la base de datos en la primera forma normal resuelve el problema de los encabezados de columnas múltiples.

Para aplicarla seria algo así:

La primera forma normal prohíbe los grupos repetidos, por lo tanto tenemos que convertir a la primera forma normal, los pasos son los siguientes:

  • -Eliminar los grupos repetidos
  • -Crear una nueva tabla con las PK de la tabla base y el grupo repetido

"La segunda forma normal"

Todas las dependencias parciales se deben eliminar y separar dentro de sus propias tablas. Una dependencia parcial es un término que describe a aquellos datos que no dependen de de llave primaria de la tabla para identificarlos.

Aplicar la segunda forma normal:

Eliminar cualquier columna no llave que no dependa de la llave primaria de la tabla, es decir:

  • -Determinar cuales columnas que no son llave no dependen de la llave primaria de la tabla.
  • -Eliminar esas columnas de la tabla base
  • -Crear una segunda tabla con esas columnas y la(s) columna(s) de las PK de la cual dependen.

“Tercera forma normal” Una tabla esta normalizada en esta normalizada en esta forma si todas las columnas que no son llave son funcionalmente dependientes por completo de la llave primaria y no hay dependencias transitivas. Una dependencia transitiva es aquella en la cual existen columnas que no son llave que dependen de otras columnas que tampoco son llave.

Aplicarla seria así:

Eliminar cualquier columna no llave que sea dependiente de otra columna no llave, los pasos a seguir son:

  • -Determinar las columnas que son dependientes de otra columna no llave
  • -Eliminar esas columnas de la tabla base
  • -Crear una segunda tabla con esas columnas y con la columna no llave de las cuales son dependientes.

Ahora después de la introducción/recordatorio vamos al problema: El problema surgió dentro de un proyecto que estoy desarrollando, y pues me propuse a darle solución, que es una de las cosas que mejor hago según yo… Bueno expongo el caso:

La tabla orden de servicio es muy grande, tiene cerca de 30 campos, esto no era así en un principio, ya que fue modificándose de acuerdo a los deseos del cliente, se fueron agregando campos a la tabla para poder concordar con los requerimientos que planteaba, pero lo que se modifico es el código que la gestionaba y no propiamente la estructura de la base de datos, entonces eso a la larga puede llegar a ser un problema, sobre todo para futuras modificaciones del sistema, esta tabla es una tabla inmensa y monolítica, y lógicamente esta mal estructurada. Entonces manos a la obra:
Este es el diagrama actual de la base de datos, como se puede ver la tabla “ordenservicio” está mal estructurada, por el tamaño que tiene y esta mal relacionada. La estructura de la tabla “ordenservicio” a continuación, no he puesto los tipos de datos, ya que de momento creo que es irrelevante para la normalización, pero se pueden ver en los diagramas de todo el modelo completo.

Tabla “ordenservicio” 

+------------------------------+ 
ordenservicio
+------------------------------+ 
orden_id folio 
tipo_orden 
empresa_id 
tipo 
marca 
submarca 
modelo 
color 
placas 
ubicacion_comentario 
ubicacion_estado 
ubicacion_municipio 
ubicacion_colonia 
autoriza_servicio 
expediente 
asistencia 
user_id 
destino_estado 
destino_municipio 
destino_colonia 
observaciones 
hora_contacto 
hora_cierre 
operador_id 
unidad_id 
fecha_registro 
status 
fecha_actualizacion 
excedente 
excedente_monto 
relacion 
conexion 
tiempo_max 
hora_asignacion 
hora_aseguradora 
servicio_muerto 
hora_cancelado 
+------------------------------+

Aplicando un análisis se puede ver que muchos campos se repiten, y es necesario reestructurar la tabla “ordenservicio”, y a sus campos restantes es posible agruparlos en una segunda tabla, ya que no dependen de la llave primaria de la tabla (orden_id) y hasta en una tercera, entonces la nueva estructura de la orden de servicio conceptualmente hablando queda así:

Antes del análisis 
+------------------------------+ 
ordenservicio 
+------------------------------+ 
cargosservicio
+------------------------------+ 


Actual después del análisis 
+------------------------------+ 
ordenservicio 
+------------------------------+ 
detalleordenservicio 
+------------------------------+ 
cargosservicio 
+------------------------------+

 
Se metió una segunda tabla en medio que corresponde al detalle de la orden de servicio, aca se puede notar como se aplica la segunda forma normal “Eliminar cualquier columna no llave que no dependa de la llave primaria de la tabla e insertarla dentro de otra respetando las llaves foraneas”, la nueva tabla se llama “detalleordenservicio” y es en esta tabla donde se metieron los campos de la tabla “ordenservicio” que no cumplen con la segunda forma normal. Las nuevas tablas quedan de la siguiente forma, siguiendo la estructura conceptual de arriba que en este caso son 3 tablas y no 2 como estaba inicialmente (ordenservicio, detalleordenservicio, cargosservicio). La estructura de la nuevas tabla queda asi:

+------------------------------+ 
ordenservicio 
+------------------------------+ 
-orden_id 
-empresa_id 
-tipo 
-origencolonia_id 
-destinocolonia_id 
-user_id 
-operador_id 
-unidad_id 
-marca_id 
-submarca_id 
-status 
-fecha_registro 
-fecha_actualizacion 
+------------------------------+ 

 De la tabla "detalleordenservicio"

+------------------------------+ 
detalleordenservicio 
+------------------------------+ 
-orden_id 
-color 
-placas 
-autoriza_servicio 
-expediente 
-asistencia 
-observaciones 
-hora_contacto 
-hora_cierre 
-excedente 
-excedente_monto 
-relación 
-conexión 
-tiempo_max 
-hora_asignacion 
-hora_aseguradora 
-servicio_muerto 
-hora_cancelado 
+------------------------------+ 

De la tabla “cargosservicio”  

+------------------------------+ 
cargosservicio 
+------------------------------+ 
-costo_id 
-orden_id 
-cargo_id 
-concepto 
-importe 
-iva 
-retención 
-km 
-casetas 
-user_id 
-fecha_creacion 
-tipo_cargo 
+------------------------------+ 

Y finalmente una imagen final de cómo quedo el modelo de las base de datos de todo el proyecto ya con los cambios aplicados de la normalización de la tabla principal:

  Conclusión
La normalización es una ciencia subjetiva, determinar las necesidades de simplificación depende de nosotros, si es una base de datos pequeña de pocos usuarios llevarla hasta la 3era forma de normalización tal ves es exagerado. Las reglas de normalización existen como guías para crear tablas que sean fáciles de manejar, así como flexibles y eficientes. A veces puede ocurrir que normalizar los datos hasta el nivel mas alto no tenga mucho sentido. La experiencia y el sentido común nos pueden auxiliar para tomar la decisión correcta, la normalización no es una ciencia exacta. Existen 6 niveles más que no se exponen aquí, estos son:
-Forma Normal Boyce-Codd -Cuarta forma normal -Quinta Forma Normal o Forma Normal de Proyección – Unión -Forma Normal de proyección-unión-fuerte -Forma Normal de proyección-unión-extrafuerte -Forma normal de clave de dominio

 
Estas formas de normalización pueden llevar las cosas mas haya de lo que necesitamos, existen para hacer una base de datos realmente relacional, y tiene que ver principalmente con dependencias múltiples y claves relacionales. No soy un gurú de la programación ni nada de eso, mi meta es compartir el conocimiento que tengo y que he adquirido a través de los proyectos en que estoy trabajando o he trabajado, si el diseño te parece mal, pues deja un comentario, no solo critiques por criticar. “Todo sistema es perfectible”, así que aporta en vez de solo criticar.

Comentarios

Carmen D. ha dicho que…
ahh eso me lo enseñaron en la uni y no aprendí mucho!

Buena explicacion de tu parte!

Entradas populares