Skip to content
StackPractices
intermediate Por Mathias Paulenko

Normalización de Bases de Datos — 1NF a 5NF Explicado

Guía visual de normalización de bases de datos: aprende 1NF a 5NF con ejemplos prácticos, cuándo aplicar cada forma y cómo balancear normalización con rendimiento.

Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.

Overview

La normalización de bases de datos es el proceso de organizar datos para minimizar la redundancia y eliminar anomalías durante operaciones de inserción, actualización y eliminación. Las formas normales — desde 1NF hasta 5NF — proporcionan reglas progresivas para estructurar bases de datos relacionales. Entender cuándo aplicar cada forma, y cuándo romperlas intencionalmente por rendimiento, separa a diseñadores competentes de expertos.

When to Use

  • For alternatives, see Composite Entity Pattern.

  • Diseñar esquemas relacionales desde cero

  • Refactorizar bases de datos legacy con datos duplicados

  • Preparar esquemas para cargas transaccionales (OLTP)

  • Antes de decidir qué desnormalizar para reportes (OLAP)

1NF — Valores Atómicos

Regla: Cada columna contiene solo valores atómicos (indivisibles). Sin grupos repetidos.

Antes (viola 1NF):

order_idcustomerproducts
1AliceApple, Banana, Cherry

Después (cumple 1NF):

order_idcustomerproduct
1AliceApple
1AliceBanana
1AliceCherry

2NF — Sin Dependencias Parciales

Regla: Todos los atributos no-clave dependen de la clave primaria completa (relevante para claves compuestas).

Antes (viola 2NF):

course_idstudent_idcourse_namestudent_namegrade
CS101S1Intro to CSAliceA

course_name depende solo de course_id; student_name solo de student_id.

Después (cumple 2NF):

Enrollments:

course_idstudent_idgrade
CS101S1A

Courses:

course_idcourse_name
CS101Intro to CS

Students:

student_idstudent_name
S1Alice

3NF — Sin Dependencias Transitivas

Regla: Los atributos no-clave dependen solo de la clave primaria, no de otros atributos no-clave.

Antes (viola 3NF):

employee_idnamedepartment_iddepartment_namedepartment_head
E1BobD1EngineeringCarol

department_name y department_head dependen de department_id, no de employee_id.

Después (cumple 3NF):

Employees:

employee_idnamedepartment_id
E1BobD1

Departments:

department_iddepartment_namedepartment_head
D1EngineeringCarol

BCNF — Forma Normal de Boyce-Codd

Regla: Para toda dependencia funcional X → Y, X debe ser superclave.

Antes (viola BCNF):

studentcourseprofessor
AliceCS101Prof. Smith
BobCS101Prof. Smith

course → professor, pero course no es superclave.

Después (cumple BCNF):

Enrollments:

studentcourse
AliceCS101
BobCS101

CourseAssignments:

courseprofessor
CS101Prof. Smith

4NF — Sin Dependencias Multivaluadas

Regla: Sin dependencias multivaluadas excepto sobre superclaves.

Antes (viola 4NF):

employeeskilllanguage
AliceJavaEnglish
AliceJavaSpanish
AlicePythonEnglish
AlicePythonSpanish

Skills y languages son hechos multivaluados independientes.

Después (cumple 4NF):

EmployeeSkills:

employeeskill
AliceJava
AlicePython

EmployeeLanguages:

employeelanguage
AliceEnglish
AliceSpanish

5NF — Dependencia de Unión

Regla: Toda dependencia de unión está implicada por las claves candidatas.

Antes (viola 5NF):

agentcompanyproduct
SmithFordTruck
SmithFordCar
SmithToyotaCar
JonesToyotaCar

Después (cumple 5NF):

AgentCompany:

agentcompany
SmithFord
SmithToyota
JonesToyota

AgentProduct:

agentproduct
SmithTruck
SmithCar
JonesCar

CompanyProduct:

companyproduct
FordTruck
FordCar
ToyotaCar

Resumen de Normalización

FormaReglaElimina
1NFValores atómicosGrupos repetidos
2NFDependencia de clave completaDependencias parciales
3NFDependencia solo de claveDependencias transitivas
BCNFDeterminante superclaveAnomalías restantes
4NFSin dependencias multivaluadasValores multi-independientes
5NFDependencias de uniónUniones reconstruibles

Cuándo Detener la Normalización

  • 3NF/BCNF es el punto práctico para la mayoría de sistemas OLTP
  • 4NF importa cuando tienes atributos verdaderamente multivaluados (raro)
  • 5NF es mayormente teórico para aplicaciones productivas
  • Desnormaliza intencionalmente cuando el rendimiento de lectura importa más que la integridad de escritura

Errores Comunes

  • Sobrenormalizar hasta 5NF — añade complejidad con mínimo beneficio práctico
  • Subnormalizar hasta 1NF — lleva a anomalías de actualización e inconsistencia de datos
  • Normalizar antes de entender las queries — el esquema debe servir la carga de trabajo
  • Ignorar BCNF — 3NF no maneja todas las anomalías; BCNF es el estándar más estricto

Ejemplo: Pasos de Normalizacion

-- 1NF: Eliminar grupos repetitivos
-- Desnormalizado: orders(id, customer_name, items_csv)
-- 1NF:            orders(id, customer_name, item_name, qty)

-- 2NF: Eliminar dependencias parciales (clave compuesta)
-- 1NF:  order_items(order_id, product_id, product_name, qty)
-- 2NF:  orders(order_id, customer_id)
--       products(product_id, product_name)
--       order_items(order_id, product_id, qty)

-- 3NF: Eliminar dependencias transitivas
-- 2NF:  orders(order_id, customer_id, customer_name, customer_city)
-- 3NF:  orders(order_id, customer_id)
--       customers(customer_id, customer_name, customer_city)

CREATE TABLE customers (
  customer_id SERIAL PRIMARY KEY,
  customer_name VARCHAR(200) NOT NULL,
  customer_city VARCHAR(100)
);

CREATE TABLE orders (
  order_id SERIAL PRIMARY KEY,
  customer_id INT REFERENCES customers(customer_id),
  order_date DATE NOT NULL DEFAULT CURRENT_DATE
);

CREATE TABLE order_items (
  order_id INT REFERENCES orders(order_id),
  product_id INT REFERENCES products(product_id),
  qty INT NOT NULL CHECK (qty > 0),
  PRIMARY KEY (order_id, product_id)
);

Troubleshooting

  • Query is slow after an index change: check execution plans and cardinality estimates. Rebuild statistics and verify the index is being used.
  • Replication lag grows: monitor network, disk I/O, and long transactions. Split large writes and consider parallel replication.
  • Connections exhausted: review connection pool size, idle timeouts, and leaked connections. Use prepared statements and close connections in finally blocks.
  • Backup takes too long: enable compression, incremental backups, and off-peak scheduling. Test restore times against RTO targets.
  • Deadlocks in high concurrency: access tables and rows in a consistent order. Keep transactions short and retry deadlocked operations.

FAQ

¿Las bases de datos NoSQL necesitan normalización? No de la misma forma. Las bases de datos documentales a menudo embeben datos relacionados (desnormalización) y usan consistencia a nivel de aplicación.

¿Debería siempre apuntar a 3NF? Apunta a BCNF en sistemas transaccionales. Para analítica heavy de lectura, desnormaliza deliberadamente.

¿Cómo afecta la normalización al indexing? Los esquemas normalizados necesitan más joins, que requieren indexing cuidadoso. Los esquemas desnormalizados necesitan menos joins pero más almacenamiento y lógica de actualización.

¿Cómo empiezo con esto en un proyecto existente?

Empieza con una parte pequeña y aislada de tu codebase. Aplica los conceptos de esta guía a un módulo o servicio. Mide el impacto, luego expande a otras áreas.

¿Qué herramientas necesito?

Las herramientas mencionadas throughout esta guía se listan en cada sección. La mayoría son open-source y ampliamente adoptadas. Consulta los recursos relacionados para instrucciones de setup.

¿Cómo mido el éxito después de implementar esto?

Define métricas claras antes de empezar: benchmarks de rendimiento, tasas de error o indicadores de mantenibilidad. Compara antes y después. Itera basándote en datos, no en suposiciones.

Errores Comunes en Producción

  • Tratar la guía como un checklist para completar una vez en lugar de una práctica por evolucionar.
  • Adoptar cada recomendación de golpe en lugar de comenzar con un cambio medido.
  • Saltar la evaluación de madurez e imponer prácticas avanzadas a un equipo no preparado.
  • No actualizar runbooks y expectativas de guardia al introducir nuevas prácticas.
  • Ignorar datos reales de incidentes al priorizar qué partes de la guía aplicar primero.
  • No asignar un responsable que revise decisiones trimestralmente.
  • Copiar ejemplos sin adaptarlos a las herramientas y restricciones reales del equipo.
  • Olvidar medir resultados antes de agregar la siguiente mejora.