En la actualidad la información y los datos han cobrado una importancia fundamental. La cantidad de datos que generamos y transmitimos todos los días es increíble. Nuestros cielos se encuentran atestados de ondas electromagnéticas cargadas de información, en todas las frecuencias, por todos lados. Construimos infraestructuras para compartir y guardar esos datos.

Fuente: https://www.fundaciontelefonica.com/wp-content/uploads/2015/02/vivir_mar_datos_720.jpg
Guardar. Porque es necesario acumular, preservar mantener. Todas las imágenes, memes, conversaciones que publicas, compartes, generas, en algún lugar del mundo se guardan. Quizá en algún data center sumergido debajo del Pacífico, quizá en algún bunker en Islandia. No lo sé. Pero lo que sí se es que, para poder guardar de forma ordenada y eficiente nuestros datos, es necesaria la implementación de una base de datos.
Una base de datos (relacional) la definiría en tres palabras como un conjunto de tablas. Dichas tablas ( llamadas formalmente relaciones) poseen una lista de datos ( propiedades o campos) para un conjunto de objetos dados. Por otro lado, una base de datos no relacional, estructura la información de forma jerárquica, a manera de un árbol n-ario ( por verlo de una forma).

Fuente: https://previews.123rf.com/images/extracoin/extracoin1711/extracoin171100017/89429152-jerarqu%C3%ADa-en-la-empresa-%C3%A1rbol-de-organigrama.jpg
Las bases de datos merecen un adecuado modelado, un diseño pobre de una base de datos, podría generar información redundante en las tablas ( y por ende, costo de almacenamiento) o en su defecto, podría dejar sin acceso a ciertos fragmentos de la información.
En este momento deberías estar preguntándote querido lector: ¿Como modelo una base de datos?
Diagrama Entidad Relación
UML posee los diagramas entidad relación, en la cual definimos que clase de información vamos a guardar y como está relacionada entre sí. Sin embargo, esto no nos ofrece un modelo de datos ( las tablas explícitas a implementar en la base). Los diagramas en cambio se utilizan como primer paso, para reunir requisitos y definir la arquitectura de los sistemas de bases de datos.
Una entidad puede ser un objeto físico tangible, como una escuela o un estudiante, o un concepto, como una respuesta o una transacción. La entidad se puede identificar extrayendo objetos que sean relevantes y significativos para el dominio del problema y el sistema a desarrollar. Cada entidad trae consigo un conjunto de columnas, que son las propiedades de la entidad a la que pertenecen los atributos. Por ejemplo, la entidad Estudiante tiene nombre, dirección y calificación como columnas (sinónimos: atributos, propiedades, campos). Cada entidad debe tener al menos un atributo que se pueda utilizar para identificar de forma exclusiva la entidad, que se conoce como llave (s) primaria (s) de la entidad.
Las relaciones conectan las entidades. Existen relaciones uno a uno (Para cada zapato izquierdo existe un zapato derecho), uno a muchos( cada hijo tiene una madre, pero eso no implica que una madre no pueda tener más de uno) y relación muchos a muchos ( entre las prendas de mi closet, existen prendas de distintos tipos y colores. Las entidades tipo de prenda y color, poseen una relación muchos a muchos).
Si quieres adentrarte en la notación y detalles de los diagramas haz click aqui. Los diagramas ER no es el tema primario de este post.
Como mapear un diagrama ER a tablas
Supongamos que para este punto, poseemos un diagrama Entidad Relación que represente adecuadamente nuestro sistema.
Para trasladar el diagrama a tablas se aplica un proceso conocido como mapeo. El mapeo sigue una serie de pasos que rezan algo más o menos así:
- Para cada entidad (fuerte) genera una tabla. Indica su llave primaria.
- Para cada entidad (débil) genera una tabla con todos sus atributos. Además, agrega como llave foránea ( puntero que indica a quien pertenece este hijo) la llave primaria del padre.
- Para las relacion 1:1 entre dos entidades E1, E2, agrega la llave primaria E2 llave foránea de E1.
- Para las relaciones 1:N entre entidades E1, E2, toma la llave primaria de la entidad que solo involucra 1 elemento en la relación ( madre con muchos hijos, toma la madre) y asignala como llave foránea en la Entidad 2. ( Cada hijo sabrá quien es su madre, pero la madre no tiene consciencia de quienes son sus hijos).
- Para cada relación muchos a muchos se genera otra tabla que relacione la llave primaria de ambas entidades y las propiedades de esta relación.
- Para cada atributo multivaluado A, cree una nueva tabla R. R incluirá un atributo correspondiente a A, más el atributo PK.
El proceso de mapeo descrito anteriormente es una transcripción resumida del proceso de mapeo descrito en el libro Elmarsi et al. Fundamentos de Bases de datos. Consulte su ficha aqui.
Normalización
Al mapear un diagrama Entidad Relación a tablas, ya podemos implementar nuestras tablas en alguna base de datos. Sin embargo, es posible que a estas alturas nuestra base de datos posea información redundante, o cual implica un costo en el almacenamiento. Además, pueden existir problemas de mantenimiento de los datos por la redundancia entre tablas. Para eliminar redundancias y proporcionar un acceso ordenado a toda la información se procede a la normalización de las tablas.
Con la normalización se pretende:
- El número mínimo de atributos necesarios para soportar los requisitos de datos de la empresa;
- Atributos con una relación lógica cercana se encuentran en la misma relación;
- Redundancia mínima con cada atributo representado solo una vez con lo importante excepción de los atributos que forman todo o parte de claves foráneas.
La normalización tiene distintos niveles. Se clasifican con números, a mayor número, mejor normalizada se halla la tabla.
En esta sección me permitiré presentar un método que formulé para normalizar tablas hasta en 3FN.
Mi método inédito para normalizar tablas
Primero debo explicar brevemente el concepto de dependencia funcional.
Dependencia Funcional Decimos que un atributo Y de una relación “depende funcionalmente” de otro atributo X de la relación si a todo valor de X le corresponde siempre el mismo valor de Y.
Para normalizar aprovecharemos el concepto de dependencia entre distintos atributos.
Las dependencias funcionales se representan:
X -> Y
Algoritmo para normalizar ( con dibujitos ).
La tabla no normalizada se puede interpretar como un grafo dirigido. Donde los nodos son los atributos y las aristas son las dependencias funcionales:
Por ejemplo, sea la tabla
Parcela:
( IdPropiedad, Municipio, NoParcela, Area, Precio, Impuestos ).
Además, supongamos que conocemos las distintas dependencias funcionales entre los atributos:
idPropiedad -> Municipio,NoPropiedad,Impusetos, Area
Municipio,NoPropiedad -> Area, Impuestos, precio, IdPropiedad
Area -> Precio
Municipio -> Impuestos
Podemos representar nuestra tabla con un grafo dirigido:

Dibujo realizado por mi
Cada nodo representa un atributo. Cada arista representa una dependencia funcional.
Como primer paso, debemos eliminar aristas, de tal forma que el grafo se transforme en un árbol. (Aún no conozco algún algoritmo que realice este proceso, pero de haberlo, habré automatizado el proceso de normalización de tablas!). Con el proceso anterior se eliminarían las relaciones transitivas.
Se podrá observar, que existen más de una solución viable.
Para este punto, obsérvese que los atributos ya están organizados jerárquicamente, de tal forma que representan una base de datos no relacional!
Como segundo paso, para realizar la 2FN, donde todos los atributos no llaves primarias, dependen funcionalmente de forma completa de la llave primaria, significa que todos los nodos no raíz del árbol sean hojas del árbol. Si no son hojas ( es decir existe un subárbol en dicho nodo) lo que hacemos es tomar dicho nodo y creamos un nuevo árbol con el. Además, dicho nodo permanece en el árbol original como hoja.

Cada árbol, representa una tabla. Cada nodo raíz es la llave primaria. Y si una hoja aparece como hoja raíz en otro árbol, implica que es una llave foránea.
Con esta disposición de tablas, automáticamente se tiene una normalización 3FN.
Conclusiones
Obtener una implementación eficiente de una base de datos a partir de nuestros diagramas entidad relación, no es un proceso trivial. Espero hallar un algoritmo programático para automatizar el proceso de normalización de tablas.
Todo es más fácil haciendo dibujitos!

