Modelado Relacional y Normalización
Ya tienes un modelo ER sólido. Ahora toca completarlo con generalización/especialización, y llevarlo a un esquema de tablas sin redundancia ni anomalías: el proceso de normalización, paso a paso, desde 1FN hasta BCNF.
Bienvenido
Un modelo Entidad-Relación bien hecho no es el punto final: es el punto de partida. Esta guía cierra dos huecos que quedaron pendientes de la guía anterior y añade el proceso completo de normalización, la técnica que garantiza que un esquema relacional no tenga redundancia ni anomalías.
Al finalizar esta guía sabrás modelar jerarquías de generalización/especialización y convertirlas a tablas, identificar dependencias funcionales, reconocer anomalías de redundancia, y aplicar 1FN, 2FN, 3FN y BCNF sobre un esquema real.
Encontrarás actividades cortas y autocorregibles —selección múltiple, verdadero/falso, emparejamiento, clasificación y completar espacios— repartidas a lo largo de la guía, y una sección de ejercicios de razonamiento donde se te da un escenario y debes predecir el resultado correcto antes de comprobarlo. Cada actividad te da retroalimentación inmediata.
🧬 Completa
Generalización/especialización: lo único que faltaba del modelo ER.
🔎 Razona
Dependencias funcionales: la base teórica de toda la normalización.
🧹 Ordena
1FN → 2FN → 3FN → BCNF, un esquema sin redundancia ni anomalías.
Generalización y especialización (ISA)
A veces una entidad tiene subtipos con atributos propios además de los que comparten con el tipo general. "Vehículo" puede especializarse en "Auto" y "Moto"; "Persona" puede especializarse en "Empleado" y "Cliente". Esta jerarquía se llama generalización/especialización, o relación ISA ("Auto ISA Vehículo": un Auto ES UN Vehículo).
| Término | Significado |
|---|---|
| Superclase | La entidad general, con los atributos comunes a todos los subtipos. |
| Subclase | Un subtipo especializado, que hereda los atributos de la superclase y añade los suyos propios. |
| Participación total | Toda instancia de la superclase debe pertenecer a alguna subclase. |
| Participación parcial | Puede haber instancias de la superclase que no pertenezcan a ninguna subclase. |
| Disjunta | Una instancia solo puede pertenecer a una subclase a la vez (Auto o Moto, no ambas). |
| Solapada | Una instancia puede pertenecer a varias subclases al mismo tiempo (una Persona puede ser Empleado y Cliente a la vez). |
Vehículo (placa, marca, año) se especializa, de forma total y disjunta, en Auto (número de puertas) y Moto (cilindraje): todo vehículo registrado es un Auto o una Moto, y nunca ambos a la vez.
Clasifica cada situación según el tipo de participación/solapamiento que describe.
Cómo convertir una jerarquía ISA a tablas
Existen tres estrategias clásicas para representar una jerarquía ISA en tablas relacionales, con distintos compromisos.
| Estrategia | Cómo funciona |
|---|---|
| Tabla única | Una sola tabla con todos los atributos de la superclase y todas las subclases, más una columna "tipo" para saber a qué subclase pertenece cada fila. Genera columnas que quedan en NULL para las filas que no aplican. |
| Tabla por subclase | Una tabla para la superclase (atributos comunes) y una tabla por cada subclase, cuya clave primaria es también clave foránea hacia la superclase. Es la más usada porque no desperdicia espacio y respeta bien la jerarquía. |
| Tabla por clase completa | Una tabla independiente por cada subclase, repitiendo en cada una los atributos de la superclase (sin tabla aparte para la superclase). Solo funciona bien si la jerarquía es total. |
Relaciona cada estrategia con su descripción.
Une cada estrategia de mapeo ISA con su descripción.
Dependencias funcionales
Una dependencia funcional X → Y significa: "el valor de X determina de forma única el valor de Y". Si dos filas tienen el mismo valor de X, necesariamente deben tener el mismo valor de Y. Toda la teoría de normalización se construye sobre este concepto.
| Notación | Se lee como | Ejemplo |
|---|---|---|
| cedula → nombre | La cédula determina el nombre. | Dos filas con la misma cédula deben tener el mismo nombre. |
| {pedido_id, producto_id} → cantidad | La combinación de pedido y producto determina la cantidad. | Dependencia con un determinante compuesto. |
Cuando la clave es compuesta (más de una columna), un atributo tiene dependencia completa si depende de toda la clave, y dependencia parcial si depende solo de una parte de ella. Por ejemplo, en DETALLE_PEDIDO(pedido_id, producto_id, producto_nombre, cantidad), cantidad depende de la clave completa {pedido_id, producto_id}, pero producto_nombre depende solo de producto_id: es una dependencia parcial.
Si X → Y y Y → Z, entonces X → Z, pero de forma indirecta (a través de Y). Por ejemplo, si empleado_id → depto_id y depto_id → depto_nombre, entonces depto_nombre depende de empleado_id de forma transitiva, no directa.
Dada la tabla EMPLEADO(empleado_id, nombre, depto_id, depto_nombre), donde depto_id → depto_nombre, clasifica cada dependencia.
1. La dependencia empleado_id → nombre es una dependencia .
2. La dependencia empleado_id → depto_nombre (a través de depto_id) es una dependencia .
Redundancia y anomalías
Un esquema mal normalizado repite información innecesariamente. Esa redundancia produce tres tipos clásicos de anomalías al modificar los datos.
| pedido_id | cliente_id | cliente_nombre | cliente_ciudad |
|---|---|---|---|
| 101 | 7 | Ana Flores | Cochabamba |
| 102 | 7 | Ana Flores | Cochabamba |
| 103 | 9 | Luis Vega | Santa Cruz |
| Anomalía | Qué ocurre |
|---|---|
| Inserción | No puedes registrar un cliente nuevo si todavía no tiene ningún pedido, porque cliente_nombre y cliente_ciudad solo existen "colgadas" de una fila de pedido. |
| Eliminación | Si borras el único pedido del cliente 9, pierdes también toda la información de "Luis Vega" sin querer. |
| Actualización | Si Ana Flores se muda de ciudad, hay que actualizar cliente_ciudad en todas sus filas; si olvidas una, los datos quedan inconsistentes. |
Clasifica cada situación según el tipo de anomalía que describe.
Primera Forma Normal (1FN)
Una tabla está en 1FN si todos sus atributos son atómicos (no se pueden dividir más), no hay grupos repetitivos ni columnas multivaluadas, y cada fila puede identificarse de forma única.
| cliente_id | nombre | telefonos |
|---|---|---|
| 7 | Ana Flores | 591-70011122, 591-70033344 |
La columna telefonos guarda varios valores en una sola celda. La solución es crear una tabla TELEFONO(cliente_id, numero) aparte, con una fila por número, relacionada por clave foránea.
Una tabla PRODUCTO tiene una columna "categorias" que guarda valores como "Electrónica, Hogar". ¿Qué regla de 1FN se está violando?
Segunda Forma Normal (2FN)
Una tabla está en 2FN si ya está en 1FN y, además, ningún atributo no clave depende solo de una parte de una clave primaria compuesta (no tiene dependencias parciales). Si la clave primaria es una sola columna, la tabla cumple 2FN automáticamente.
| pedido_id (PK) | producto_id (PK) | producto_nombre | cantidad |
|---|---|---|---|
| 101 | P01 | Teclado | 2 |
| 101 | P02 | Mouse | 1 |
producto_nombre depende solo de producto_id, no de la clave completa {pedido_id, producto_id}: es una dependencia parcial. Se corrige moviendo producto_nombre a una tabla PRODUCTO(producto_id, producto_nombre) aparte. cantidad sí depende de la clave completa, así que se queda en DETALLE_PEDIDO.
Sobre la tabla DETALLE_PEDIDO(pedido_id, producto_id, producto_nombre, cantidad):
1. producto_nombre depende de la clave primaria.
2. cantidad depende de la clave primaria.
Tercera Forma Normal (3FN)
Una tabla está en 3FN si ya está en 2FN y, además, ningún atributo no clave depende de otro atributo no clave (no tiene dependencias transitivas). Se resume con la regla mnemotécnica: cada atributo debe depender "de la clave, de toda la clave, y de nada más que la clave".
| empleado_id (PK) | nombre | depto_id | depto_nombre |
|---|---|---|---|
| 1 | Carlos Ramírez | D1 | Sistemas |
| 2 | Ana López | D1 | Sistemas |
depto_nombre no depende directamente de empleado_id: depende de depto_id, que a su vez depende de empleado_id. Es una dependencia transitiva. Se corrige moviendo depto_nombre a una tabla DEPARTAMENTO(depto_id, depto_nombre) aparte, dejando depto_id como clave foránea en EMPLEADO.
¿Por qué depto_nombre viola 3FN en la tabla EMPLEADO(empleado_id, nombre, depto_id, depto_nombre)?
Forma Normal de Boyce-Codd (BCNF)
BCNF es una versión más estricta que 3FN: para toda dependencia funcional X → Y de la tabla, X debe ser una superclave (una clave candidata, o contenerla). 3FN permite una excepción que BCNF no permite.
| estudiante | curso | profesor |
|---|---|---|
| Juan | Bases de Datos | Roy Carrasco |
| Ana | Bases de Datos | Roy Carrasco |
| Juan | Redes | Marco Vidal |
Regla de negocio: cada profesor dicta un único curso (profesor → curso), pero un curso puede tener varios profesores en paralelo, y un estudiante puede inscribirse con cualquiera de ellos. Las claves candidatas son {estudiante, curso} y {estudiante, profesor}. La dependencia profesor → curso es válida, pero profesor por sí solo no es una superclave: viola BCNF. Sin embargo, sí cumple 3FN, porque curso es parte de una clave candidata (un "atributo primo"), y 3FN permite esa excepción.
| 3FN | BCNF | |
|---|---|---|
| Exige | X → Y: X es superclave, o Y es parte de una clave candidata. | X → Y: X es superclave, sin excepciones. |
| Este ejemplo | ✅ Cumple (curso es atributo primo). | ❌ No cumple (profesor no es superclave). |
Toda tabla que está en BCNF también está en 3FN.
Normalización paso a paso
Vas a normalizar una tabla real, de principio a fin. Punto de partida: una única tabla PEDIDO_RAW con datos de pedido, cliente y producto todos mezclados, clave primaria compuesta {pedido_id, producto_id}.
| pedido_id | producto_id | fecha | cliente_id | cliente_nombre | producto_nombre | precio | cantidad |
|---|---|---|---|---|---|---|---|
| 101 | P01 | 2026-03-01 | 7 | Ana Flores | Teclado | 120 | 2 |
PEDIDO_RAW ya tiene todos sus atributos atómicos (ninguna celda guarda varios valores). Al revisar 2FN, ¿qué atributos violan la dependencia completa respecto a la clave {pedido_id, producto_id}?
Se separan tres tablas: PEDIDO(pedido_id, fecha, cliente_id, cliente_nombre), PRODUCTO(producto_id, producto_nombre, precio) y DETALLE_PEDIDO(pedido_id, producto_id, cantidad), esta última con clave foránea hacia las otras dos.
Dentro de la nueva tabla PEDIDO(pedido_id, fecha, cliente_id, cliente_nombre), ¿qué violación queda todavía, y cuál es la solución?
PEDIDO(pedido_id PK, fecha, cliente_id FK) · CLIENTE(cliente_id PK, cliente_nombre) · PRODUCTO(producto_id PK, producto_nombre, precio) · DETALLE_PEDIDO(pedido_id PK, FK, producto_id PK, FK, cantidad)
Ejercicios de razonamiento
En estas preguntas no se te pide recordar una definición: se te da un escenario, y debes razonar cuál sería la respuesta correcta antes de comprobarla.
Una universidad modela "Persona", que se especializa en "Estudiante" y "Docente". Un mismo individuo puede ser estudiante de posgrado y docente de pregrado al mismo tiempo. ¿Qué tipo de solapamiento es este?
La tabla LIBRO(isbn, titulo, editorial_id, editorial_nombre, editorial_pais) tiene clave primaria isbn (una sola columna), y editorial_id → editorial_nombre, editorial_id → editorial_pais.
¿En qué forma normal está esta tabla como máximo, y qué falla?
Un sistema de talleres mecánicos registra HORARIO(vehiculo_placa, dia_semana, mecanico_id), donde cada mecánico atiende un único vehículo por día, pero un mismo vehículo puede pasar por varios mecánicos en días distintos.
Si además se cumple la regla "cada mecánico solo trabaja en una sucursal fija" (mecanico_id → sucursal_id), y sucursal_id se agrega como columna, ¿qué problema aparece?
Actividades de repaso
Un repaso integrador de todo el módulo. Cada actividad se corrige al instante; tu progreso se guarda automáticamente en este navegador.
¿Cuál de estas es una tabla por subclase, en el mapeo de una jerarquía ISA?
Una dependencia funcional X → Y significa que Y determina el valor de X.
¿Qué forma normal elimina específicamente las dependencias parciales sobre una clave compuesta?
¿Cuál de estas anomalías ocurre cuando no puedes registrar un dato nuevo porque depende de la existencia de otro registro no relacionado?
¿Qué diferencia principal hay entre 3FN y BCNF?
Cheat Sheet
| Término | Idea clave |
|---|---|
| Generalización/especialización (ISA) | Superclase con subclases que heredan sus atributos y añaden los propios. |
| Dependencia funcional X → Y | X determina de forma única el valor de Y. |
| Dependencia parcial | Un atributo no clave depende solo de una parte de una clave compuesta. |
| Dependencia transitiva | Un atributo no clave depende de otro atributo no clave, no directamente de la clave. |
| 1FN | Atributos atómicos, sin grupos repetitivos. |
| 2FN | 1FN + sin dependencias parciales. |
| 3FN | 2FN + sin dependencias transitivas. |
| BCNF | Todo determinante de toda dependencia funcional debe ser superclave. |
¿Sabías que...?
📐 El mismo autor del modelo relacional
Edgar F. Codd, quien propuso el modelo relacional en 1970, también definió las primeras tres formas normales poco después, como parte de la misma teoría.
🏷️ Por qué "Boyce-Codd"
BCNF lleva el nombre de Raymond F. Boyce y Edgar F. Codd, quienes la propusieron en 1974 para cerrar un caso especial que 3FN dejaba sin cubrir.
⚖️ A veces se desnormaliza a propósito
En sistemas con mucha lectura y poca escritura, a veces se introduce redundancia controlada ("desnormalización") a propósito, para ganar velocidad de consulta a cambio de más complejidad al actualizar.