Diseño de bases de datos: Normalización 1NF, 2NF, 3NF y BCNF
Este artículo es una aclaración de conceptos sobre normalización en bases de datos, incluyendo ejemplos prácticos y preguntas de examen.
En resumen
La normalización es el proceso de estructurar bases de datos relacionales para eliminar redundancia y evitar anomalías en los datos. El objetivo es garantizar la integridad y consistencia de los datos.
Descripción técnica compacta
La normalización es un enfoque formal para eliminar redundancia y prevenir anomalías en bases de datos relacionales. Mediante la aplicación escalonada de formas normales se mejora la estructura de datos.
Anomalías sin normalización:
- Anomalías de inserción: Los datos no pueden insertarse sin información adicional
- Anomalías de actualización: Los cambios requieren actualizaciones en múltiples lugares
- Anomalías de eliminación: Borrar datos elimina inadvertidamente otra información
Formas normales:
- 1NF: Valores atómicos, sin grupos repetidos
- 2NF: 1NF + sin dependencias parciales
- 3NF: 2NF + sin dependencias transitivas
- BCNF: Forma más estricta que 3NF con reglas más exigentes
Las dependencias funcionales constituyen la base matemática: X → Y significa que el valor de X determina unívocamente el valor de Y.
Puntos clave para exámenes
- 1NF: Valores atómicos, sin grupos repetidos, claves primarias únicas
- 2NF: Se cumple 1NF, sin dependencias parciales, dependencia completa de la clave primaria
- 3NF: Se cumple 2NF, sin dependencias transitivas, los atributos no clave dependen solo de la clave primaria
- BCNF: Toda determinante es una clave candidata
- Dependencias funcionales: Base matemática de la normalización
- Anomalías: Problemas de inserción, actualización y eliminación en datos no normalizados
- Relevancia IHK: Importante para modelado de datos y diseño de bases de datos
- Práctica: Compensación entre normalización y rendimiento
Componentes principales
- Dependencia funcional: X → Y (X determina Y unívocamente)
- Clave primaria: Identificación única de registros
- Clave candidata: Posibles claves primarias
- Dependencia parcial: Dependencia de una parte de la clave compuesta
- Dependencia transitiva: Dependencia indirecta a través de atributos no clave
- Determinante: Atributo que determina otros atributos
- Proceso de normalización: Aplicación escalonada de formas normales
- Desnormalización: Redundancia intencional para optimización del rendimiento
Ejemplos prácticos
Tabla sin normalizar (0NF)
-- Estructura problemática con redundancia y anomalías
CREATE TABLE Pedidos (
num_pedido INT,
fecha_pedido DATE,
nombre_cliente VARCHAR(100),
direccion_cliente VARCHAR(200),
num_articulo INT,
nombre_articulo VARCHAR(100),
precio DECIMAL(10,2),
cantidad INT,
precio_total DECIMAL(10,2)
);
-- Datos con problemas
INSERT INTO Pedidos VALUES
(1, '2024-01-15', 'Meier', 'Hauptstraße 1', 101, 'Laptop', 999.99, 2, 1999.98),
(1, '2024-01-15', 'Meier', 'Hauptstraße 1', 102, 'Maus', 29.99, 1, 29.99),
(2, '2024-01-16', 'Schmidt', 'Nebenstraße 2', 101, 'Laptop', 999.99, 1, 999.99);
Primera forma normal (1NF)
-- Valores atómicos, sin grupos repetidos
CREATE TABLE Pedidos_1NF (
num_pedido INT,
fecha_pedido DATE,
nombre_cliente VARCHAR(100),
direccion_cliente VARCHAR(200),
num_articulo INT,
nombre_articulo VARCHAR(100),
precio DECIMAL(10,2),
cantidad INT,
precio_total DECIMAL(10,2),
PRIMARY KEY (num_pedido, num_articulo)
);
-- Dependencias funcionales:
-- num_pedido, num_articulo → cantidad, precio_total
-- num_pedido → fecha_pedido, nombre_cliente, direccion_cliente
-- num_articulo → nombre_articulo, precio
Segunda forma normal (2NF)
-- Eliminación de dependencias parciales
CREATE TABLE Pedidos_2NF (
num_pedido INT PRIMARY KEY,
fecha_pedido DATE,
nombre_cliente VARCHAR(100),
direccion_cliente VARCHAR(200)
);
CREATE TABLE PartesDelPedido (
num_pedido INT,
num_articulo INT,
cantidad INT,
precio_total DECIMAL(10,2),
PRIMARY KEY (num_pedido, num_articulo),
FOREIGN KEY (num_pedido) REFERENCES Pedidos_2NF(num_pedido)
);
CREATE TABLE Articulos (
num_articulo INT PRIMARY KEY,
nombre_articulo VARCHAR(100),
precio DECIMAL(10,2)
);
Tercera forma normal (3NF)
-- Eliminación de dependencias transitivas
CREATE TABLE Pedidos_3NF (
num_pedido INT PRIMARY KEY,
fecha_pedido DATE,
id_cliente INT,
FOREIGN KEY (id_cliente) REFERENCES Clientes(id_cliente)
);
CREATE TABLE Clientes (
id_cliente INT PRIMARY KEY,
nombre_cliente VARCHAR(100),
direccion_cliente VARCHAR(200)
);
CREATE TABLE PartesDelPedido (
num_pedido INT,
num_articulo INT,
cantidad INT,
PRIMARY KEY (num_pedido, num_articulo),
FOREIGN KEY (num_pedido) REFERENCES Pedidos_3NF(num_pedido),
FOREIGN KEY (num_articulo) REFERENCES Articulos(num_articulo)
);
CREATE TABLE Articulos (
num_articulo INT PRIMARY KEY,
nombre_articulo VARCHAR(100),
precio DECIMAL(10,2)
);
Anomalías y sus soluciones
Anomalía de inserción (sin normalización)
-- Problema: No se puede agregar un cliente sin un pedido
-- Solución: Tabla de clientes separada
INSERT INTO Clientes (id_cliente, nombre_cliente, direccion_cliente)
VALUES (3, 'Mueller', 'Dritter Weg 3');
Anomalía de actualización (sin normalización)
-- Problema: La dirección del cliente debe actualizarse en múltiples lugares
-- Solución: Tabla de clientes centralizada
UPDATE Clientes
SET direccion_cliente = 'Hauptstraße 1a'
WHERE id_cliente = 1;
Anomalía de eliminación (sin normalización)
-- Problema: Borrar el último pedido elimina datos del cliente
-- Solución: Tablas separadas evitan eliminación inadvertida
DELETE FROM PartesDelPedido WHERE num_pedido = 1;
-- Los datos del cliente permanecen en la tabla de clientes
BCNF (Forma normal de Boyce-Codd)
Regla BCNF
Toda determinante debe ser una clave candidata.
-- Ejemplo que cumple 3NF pero no BCNF
CREATE TABLE MiembrosDelProyecto (
id_proyecto INT,
id_miembro INT,
rol VARCHAR(50),
PRIMARY KEY (id_proyecto, id_miembro)
);
-- Dependencias funcionales:
-- id_proyecto, id_miembro → rol
-- id_proyecto, rol → id_miembro (¡La determinante no es una clave candidata!)
-- Solución BCNF: Dividir la tabla
CREATE TABLE RolesDelProyecto (
id_proyecto INT,
rol VARCHAR(50),
id_miembro INT,
PRIMARY KEY (id_proyecto, rol)
);
CREATE TABLE ProyectosMiembros (
id_proyecto INT,
id_miembro INT,
PRIMARY KEY (id_proyecto, id_miembro)
);
Ventajas e inconvenientes
Ventajas de la normalización
- Integridad de datos: Evita redundancia e inconsistencias
- Mantenibilidad: Los cambios se requieren en un solo lugar
- Eficiencia de almacenamiento: Reducción de redundancia
- Consistencia: Representación uniforme de datos
Inconvenientes
- Rendimiento: Se requieren más joins
- Complejidad: Estructura de datos más compleja
- Rendimiento de escritura: Actualizaciones distribuidas entre múltiples tablas
- Curva de aprendizaje: Requiere comprensión de dependencias funcionales
Preguntas frecuentes de examen
-
¿Cuál es la diferencia entre 2NF y 3NF? 2NF elimina dependencias parciales, 3NF elimina dependencias transitivas.
-
¿Cuándo está una tabla en BCNF? Cuando toda determinante es una clave candidata (más estricto que 3NF).
-
¡Explique las dependencias funcionales! X → Y significa que el valor de X determina unívocamente el valor de Y.
-
¿Qué son las anomalías y cómo se evitan? Las anomalías de inserción, actualización y eliminación se evitan mediante normalización.
Fuentes principales
- https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
- https://www.gatech.edu/coe/cse/normalization
- https://www.sql-tutorial.ru/sql-normalization.html
Literatura recomendada: Bases de datos
Keine Bücher für Kategorie "datenbanken" gefunden.



