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.
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');
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_pedidocon 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.
-- 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;
| idINT🔑 | nombreVARCHAR(80) | emailVARCHAR(120) |
|---|---|---|
| 1 | Ana Torres | [email protected] |
| 2 | Luis Pérez | [email protected] |
| 3 | María Gómez | [email protected] |
| idINT🔑 | nombreVARCHAR(40) |
|---|---|
| 1 | Café |
| 2 | Té |
| 3 | Snacks |
| idINT🔑 | nombreVARCHAR(80) | categoria_idINT↗ | precioDECIMAL(10,2) |
|---|---|---|---|
| 1 | Café Sierra | 1 | 32000 |
| 2 | Café Huila | 1 | 28000 |
| 3 | Té verde | 2 | 12000 |
| 4 | Galletas | 3 | 6000 |
| idINT🔑 | cliente_idINT↗ | fechaDATE | estadoVARCHAR(20) |
|---|---|---|---|
| 1 | 1 | 2024-05-01 | pagado |
| 2 | 2 | 2024-05-02 | pendiente |
| 3 | 1 | 2024-05-03 | pagado |
| idINT🔑 | pedido_idINT↗ | producto_idINT↗ | cantidadINT | precio_unitDECIMAL(10,2) |
|---|---|---|---|---|
| 1 | 1 | 1 | 2 | 32000 |
| 2 | 1 | 4 | 1 | 6000 |
| 3 | 2 | 3 | 3 | 12000 |
| 4 | 3 | 2 | 1 | 28000 |
| idINT🔑 | pedido_idINT↗ | montoDECIMAL(10,2) | metodoVARCHAR(30) |
|---|---|---|---|
| 1 | 1 | 70000 | tarjeta |
| 2 | 3 | 28000 | efectivo |
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.
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.
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.