Skip to content
IRC-CodingIRC-Coding
Normalización1NF 2NF 3NF BCNFDiseño de bases de datosDependencias funcionalesAnomalías

Normalización de Bases de Datos: 1NF, 2NF, 3NF y BCNF

Aprende normalización para eliminar redundancia y anomalías. 1NF, 2NF, 3NF, BCNF con dependencias funcionales y ejemplos prácticos.

S

schutzgeist

4 min read
Normalización de Bases de Datos: 1NF, 2NF, 3NF y BCNF

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

  1. Dependencia funcional: X → Y (X determina Y unívocamente)
  2. Clave primaria: Identificación única de registros
  3. Clave candidata: Posibles claves primarias
  4. Dependencia parcial: Dependencia de una parte de la clave compuesta
  5. Dependencia transitiva: Dependencia indirecta a través de atributos no clave
  6. Determinante: Atributo que determina otros atributos
  7. Proceso de normalización: Aplicación escalonada de formas normales
  8. 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

  1. ¿Cuál es la diferencia entre 2NF y 3NF? 2NF elimina dependencias parciales, 3NF elimina dependencias transitivas.

  2. ¿Cuándo está una tabla en BCNF? Cuando toda determinante es una clave candidata (más estricto que 3NF).

  3. ¡Explique las dependencias funcionales! X → Y significa que el valor de X determina unívocamente el valor de Y.

  4. ¿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

  1. https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
  2. https://www.gatech.edu/coe/cse/normalization
  3. https://www.sql-tutorial.ru/sql-normalization.html

Literatura recomendada: Bases de datos

Keine Bücher für Kategorie "datenbanken" gefunden.

Volver al blog
Share:

Entradas relacionadas