Saltar al contenido
Diseño de Base de Datos y Modelado de Datos

31 de mayo de 2026

Diseño de Base de Datos y Modelado de Datos

Esquemas normalizados vs desnormalizados, modelado relacional y cuándo usar cada enfoque.

Data Software
Base de Datos Modelado de Datos SQL Normalización

Un buen diseño de base de datos es la base de cualquier sistema fiable. Entender la normalización y desnormalización te ayuda a tomar las decisiones correctas.

Normalizado vs Desnormalizado

AspectoNormalizadoDesnormalizado
Duplicación de datosSin redundanciaRedundancia intencional
Rendimiento escrituraEscrituras rápidasEscrituras más lentas
Rendimiento lecturaNecesita JOINs (más lento)Lecturas rápidas (sin JOINs)
ConsistenciaFácil de mantenerRiesgo de inconsistencia
Caso de usoOLTP (transaccional)OLAP (analítico)

Normalización

La normalización organiza los datos para reducir la redundancia. Cada nivel se llama “Forma Normal.”

1NF — Primera Forma Normal

  • Cada celda tiene un solo valor (atómico)
  • Cada fila es única
Mal:                          Bien:
| nombre | teléfonos        |  | nombre | teléfono     |
|--------|------------------|  |--------|--------------|
| Alice  | 555-1234, 555-5678|  | Alice  | 555-1234     |
                               | Alice  | 555-5678     |

2NF — Segunda Forma Normal

  • Cumple 1NF
  • Sin dependencias parciales (cada columna no clave depende de toda la clave primaria)

3NF — Tercera Forma Normal

  • Cumple 2NF
  • Sin dependencias transitivas (columnas no clave no dependen de otras columnas no clave)
Mal:                                      Bien:
| order_id | cliente  | ciudad     |    pedidos:  | order_id | cliente_id |
|----------|----------|------------|    clientes: | cliente_id | nombre | ciudad |

Ejemplo Normalizado

-- Tablas separadas, vinculadas por claves foráneas
CREATE TABLE clientes (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE pedidos (
    id SERIAL PRIMARY KEY,
    cliente_id INTEGER REFERENCES clientes(id),
    fecha_pedido DATE,
    total DECIMAL(10,2)
);

CREATE TABLE items_pedido (
    id SERIAL PRIMARY KEY,
    pedido_id INTEGER REFERENCES pedidos(id),
    producto_id INTEGER REFERENCES productos(id),
    cantidad INTEGER,
    precio DECIMAL(10,2)
);

Desnormalización

Añadir redundancia intencionalmente para mejorar el rendimiento de lectura. Común en data warehouses y analítica.

Ejemplo Desnormalizado

-- Una sola tabla ancha para analítica
CREATE TABLE ventas_fact (
    pedido_id INTEGER,
    fecha_pedido DATE,
    nombre_cliente VARCHAR(100),
    email_cliente VARCHAR(100),
    ciudad_cliente VARCHAR(100),
    nombre_producto VARCHAR(100),
    categoria_producto VARCHAR(50),
    cantidad INTEGER,
    precio DECIMAL(10,2),
    total DECIMAL(10,2)
);
-- ¡No se necesitan JOINs para consultas!

Esquema Estrella (Star Schema)

El patrón desnormalizado más común para data warehouses.

        ┌──────────┐
        │ dim_fecha │
        └────┬─────┘
             │
┌──────────┐ │ ┌──────────────┐
│dim_producto├─┼─┤ fact_ventas   │
└──────────┘ │ └──────┬───────┘
             │        │
        ┌────┴──────┐ │
        │dim_cliente │─┘
        └───────────┘
  • Tabla de hechos — medidas y métricas (importe de venta, cantidad)
  • Tablas de dimensión — atributos descriptivos (nombre producto, fecha, cliente)
-- Tabla de hechos
CREATE TABLE fact_ventas (
    fecha_key INTEGER REFERENCES dim_fecha(key),
    producto_key INTEGER REFERENCES dim_producto(key),
    cliente_key INTEGER REFERENCES dim_cliente(key),
    cantidad INTEGER,
    ingresos DECIMAL(10,2)
);

-- Tabla de dimensión
CREATE TABLE dim_producto (
    key SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    categoria VARCHAR(50),
    marca VARCHAR(50)
);

Esquema Copo de Nieve (Snowflake Schema)

Como el esquema estrella, pero las dimensiones están más normalizadas.

dim_categoria → dim_producto → fact_ventas ← dim_cliente → dim_ciudad → dim_pais

Conceptos Clave

Clave Primaria

Identifica de forma única cada fila.

Clave Foránea

Enlaza con la clave primaria de otra tabla.

Índices

Aceleran las consultas en columnas específicas.

CREATE INDEX idx_pedidos_cliente ON pedidos(cliente_id);
CREATE INDEX idx_pedidos_fecha ON pedidos(fecha_pedido);

Tipos de Relaciones

TipoEjemplo
Uno a UnoUsuario → Perfil
Uno a MuchosCliente → Pedidos
Muchos a MuchosEstudiantes ↔ Cursos (tabla intermedia)

Cuándo Normalizar vs Desnormalizar

EscenarioEnfoque
App transaccional (OLTP)Normalizar
Analítica / reportes (OLAP)Desnormalizar
Dashboards en tiempo realDesnormalizar
Formularios de entrada de datosNormalizar
Data warehouseEsquema Estrella/Copo de Nieve
Datasets pequeñosAmbos funcionan

Resumen

ConceptoIdea Clave
NormalizaciónReducir redundancia, garantizar consistencia
DesnormalizaciónAñadir redundancia para lecturas más rápidas
Esquema EstrellaTablas de hechos + dimensiones para analítica
3NFEstándar para bases de datos transaccionales
ÍndicesAcelerar consultas de lectura