El modelado relacional es la base para diseñar bases de datos eficientes y mantenibles.
Una base de datos relacional organiza datos en tablas relacionadas entre sí.
Componentes:
- Tabla: Colección de filas y columnas
- Fila (registro): Una instancia de datos
- Columna (campo): Un atributo del dato
- Clave primaria (PK): Identificador único
- Clave foránea (FK): Referencia a otra tabla
Identifica de forma única cada fila.
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY, -- Clave primaria
nombre VARCHAR(100),
email VARCHAR(100) UNIQUE
);Establece relación con otra tabla.
CREATE TABLE ventas (
id SERIAL PRIMARY KEY,
usuario_id INTEGER REFERENCES usuarios(id), -- Clave foránea
producto_id INTEGER REFERENCES productos(id),
fecha_venta DATE,
total DECIMAL(10,2)
);La normalización reduce redundancia y mejora la integridad de datos.
- Cada columna contiene un solo valor
- No hay grupos repetitivos
- Cada fila es única
-- ❌ No normalizado
CREATE TABLE ventas (
id INT,
productos VARCHAR(200) -- "Laptop, Mouse, Teclado"
);
-- ✅ Normalizado
CREATE TABLE ventas (
id INT PRIMARY KEY,
fecha_venta DATE
);
CREATE TABLE ventas_items (
venta_id INT REFERENCES ventas(id),
producto_id INT REFERENCES productos(id),
cantidad INT
);- Cumple 1NF
- Todos los atributos no clave dependen completamente de la clave primaria
- Cumple 2NF
- No hay dependencias transitivas (atributos que dependen de otros atributos no clave)
-- Un usuario tiene muchas ventas
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE ventas (
id SERIAL PRIMARY KEY,
usuario_id INTEGER REFERENCES usuarios(id) -- Muchas ventas, un usuario
);-- Muchos productos en muchas ventas
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE ventas (
id SERIAL PRIMARY KEY,
fecha_venta DATE
);
-- Tabla intermedia
CREATE TABLE ventas_productos (
venta_id INTEGER REFERENCES ventas(id),
producto_id INTEGER REFERENCES productos(id),
cantidad INTEGER,
PRIMARY KEY (venta_id, producto_id)
);Estructura:
- Tabla de hechos (Fact): Eventos/transacciones
- Tablas de dimensiones (Dimensions): Contexto descriptivo
-- Tabla de hechos
CREATE TABLE fact_ventas (
id SERIAL PRIMARY KEY,
fecha_id INTEGER,
usuario_id INTEGER,
producto_id INTEGER,
cantidad INTEGER,
total DECIMAL(10,2)
);
-- Dimensión de tiempo
CREATE TABLE dim_fecha (
fecha_id SERIAL PRIMARY KEY,
fecha DATE,
año INTEGER,
mes INTEGER,
dia INTEGER,
dia_semana VARCHAR(20)
);
-- Dimensión de producto
CREATE TABLE dim_producto (
producto_id SERIAL PRIMARY KEY,
nombre VARCHAR(100),
categoria VARCHAR(50),
precio DECIMAL(10,2)
);- Consultas más rápidas (menos JOINs)
- Fácil de entender
- Optimizado para analytics
-- ✅ Claro
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nombre_completo VARCHAR(100),
correo_electronico VARCHAR(100)
);
-- ⚠️ Confuso
CREATE TABLE usr (
id SERIAL PRIMARY KEY,
nm VARCHAR(100),
eml VARCHAR(100)
);-- ✅ Específico
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100),
precio DECIMAL(10,2), -- Para dinero
stock INTEGER,
activo BOOLEAN
);CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
edad INTEGER CHECK (edad >= 0),
fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);- Diseña un esquema para un sistema de e-commerce
- Normaliza una tabla con datos redundantes
- Crea un star schema para análisis de ventas
- Diseña relaciones entre usuarios, productos y pedidos
Practica con los Ejercicios del repositorio.