Saltar al contenido

Un modelo completo · flujo de ventas.

Hasta acá viste las piezas por separado. Ahora juntémoslas en un modelo de verdad — un e-commerce mínimo — y cerremos la parte relacional viendo cómo todo se conecta y cómo una sola consulta puede cruzar media base de datos.

01El diagrama del modelo

Seis tablas, cinco relaciones. Clientes hacen pedidos; cada pedido tiene varios productos a través de la tabla puente items_pedido (la solución clásica al muchos a muchos); los productos viven en categorías; y cada pedido puede tener pagos. Ejecutá y explorá: arrastrá las tablas, hacé zoom, y seguí cada línea — es un REFERENCES.

~/sql-labpostgres · in-memory
query.sql
CREATE TABLE clientes (
  id     INT PRIMARY KEY,
  nombre VARCHAR(80) NOT NULL,
  email  VARCHAR(120) UNIQUE
);

CREATE TABLE categorias (
  id     INT PRIMARY KEY,
  nombre VARCHAR(40) UNIQUE NOT NULL
);

CREATE TABLE productos (
  id           INT PRIMARY KEY,
  nombre       VARCHAR(80) NOT NULL,
  categoria_id INT NOT NULL REFERENCES categorias(id),
  precio       DECIMAL(10,2) NOT NULL
);

CREATE TABLE pedidos (
  id         INT PRIMARY KEY,
  cliente_id INT NOT NULL REFERENCES clientes(id),
  fecha      DATE,
  estado     VARCHAR(20) DEFAULT 'pendiente'
);

CREATE TABLE items_pedido (
  id          INT PRIMARY KEY,
  pedido_id   INT NOT NULL REFERENCES pedidos(id),
  producto_id INT NOT NULL REFERENCES productos(id),
  cantidad    INT NOT NULL,
  precio_unit DECIMAL(10,2) NOT NULL
);

CREATE TABLE pagos (
  id        INT PRIMARY KEY,
  pedido_id INT NOT NULL REFERENCES pedidos(id),
  monto     DECIMAL(10,2) NOT NULL,
  metodo    VARCHAR(30)
);

INSERT INTO clientes (id, nombre, email) VALUES
  (1, 'Ana Torres',  '[email protected]'),
  (2, 'Luis Pérez',  '[email protected]'),
  (3, 'María Gómez', '[email protected]');

INSERT INTO categorias (id, nombre) VALUES
  (1, 'Café'), (2, 'Té'), (3, 'Snacks');

INSERT INTO productos (id, nombre, categoria_id, precio) VALUES
  (1, 'Café Sierra', 1, 32000),
  (2, 'Café Huila',  1, 28000),
  (3, 'Té verde',    2, 12000),
  (4, 'Galletas',    3,  6000);

INSERT INTO pedidos (id, cliente_id, fecha, estado) VALUES
  (1, 1, '2024-05-01', 'pagado'),
  (2, 2, '2024-05-02', 'pendiente'),
  (3, 1, '2024-05-03', 'pagado');

INSERT INTO items_pedido (id, pedido_id, producto_id, cantidad, precio_unit) VALUES
  (1, 1, 1, 2, 32000),
  (2, 1, 4, 1,  6000),
  (3, 2, 3, 3, 12000),
  (4, 3, 2, 1, 28000);

INSERT INTO pagos (id, pedido_id, monto, metodo) VALUES
  (1, 1, 70000, 'tarjeta'),
  (2, 3, 28000, 'efectivo');
listo
Aún no hay tablas. Escribe CREATE TABLE con REFERENCES y mira el diagrama.

02Consultas que cruzan todo el modelo

Lo poderoso del modelo relacional es que, una vez bien conectado, podés hacer preguntas de negocio que tocan muchas tablas a la vez. Acá la base ya está cargada — ejecutá la consulta y probá los ejemplos de abajo.

  • Facturación por cliente cruza clientes → pedidos → items_pedido con dos JOINs.
  • Ventas por categoría encadena tres JOINs hasta llegar a categorias.
  • El SUM(cantidad * precio_unit) calcula el total dentro de la agregación.
~/sql-labpostgres · in-memory
query.sql
-- Total facturado por cada cliente
SELECT c.nombre, SUM(i.cantidad * i.precio_unit) AS facturado
FROM clientes c
JOIN pedidos p ON p.cliente_id = c.id
JOIN items_pedido i ON i.pedido_id = p.id
GROUP BY c.nombre
ORDER BY facturado DESC;
listo
clientes
idINT🔑nombreVARCHAR(80)emailVARCHAR(120)
1Ana Torres[email protected]
2Luis Pérez[email protected]
3María Gómez[email protected]
categorias
idINT🔑nombreVARCHAR(40)
1Café
2
3Snacks
productos
idINT🔑nombreVARCHAR(80)categoria_idINTprecioDECIMAL(10,2)
1Café Sierra132000
2Café Huila128000
3Té verde212000
4Galletas36000
pedidos
idINT🔑cliente_idINTfechaDATEestadoVARCHAR(20)
112024-05-01pagado
222024-05-02pendiente
312024-05-03pagado
items_pedido
idINT🔑pedido_idINTproducto_idINTcantidadINTprecio_unitDECIMAL(10,2)
111232000
21416000
323312000
432128000
pagos
idINT🔑pedido_idINTmontoDECIMAL(10,2)metodoVARCHAR(30)
1170000tarjeta
2328000efectivo
Cierre de la parte relacional

Si entendiste este modelo — tablas con forma, llaves que conectan, y consultas declarativas que cruzan todo — ya tenés el núcleo de las bases relacionales. Lo demás (índices, transacciones, optimización) es profundizar sobre esta misma base. Ahora sí, saltemos a NoSQL para ver otra forma de pensar los datos.

03Desafíos · ponete a prueba

Tres consultas sobre el modelo de ventas completo, de menor a mayor dificultad. Escribí tu consulta y dale Comprobar.

Listá los productos que forman el pedido #1: mostrá el nombre del producto, la cantidad y el precio unitario.

Básico

Calculá el total gastado por cada cliente (suma de cantidad × precio unitario en todos sus pedidos). Mostrá nombre del cliente y el total, del mayor al menor.

Intermedio

Calculá los ingresos totales por categoría de producto (suma de cantidad × precio unitario). Mostrá el nombre de la categoría y el total, de mayor a menor.

Avanzado