Bases de datos sin misterios

El esquema de «Kotomarket»

11 min
Qué aprenderás
  • identificar la tabla que necesitas entre las cinco de «Kotomarket»: users, products, orders, order_items, events
  • leer un diagrama ER: determinar la cardinalidad de un vínculo (1:N, N:M, 1:1) según dónde está la clave foránea
  • descomponer un vínculo «muchos a muchos» mediante una tabla intermedia con dos FK, como order_items con order_id + product_id
  • explicar por qué el contenido de un pedido no se puede guardar directamente en orders como una cadena de identificadores

Hoy QUERY deja sobre la mesa principal todo el índice de golpe. Cinco planos luminosos quedan suspendidos en el aire y giran despacio: el mapa del mundo que logró sobrevivir. A su lado parpadea el diario de conservación adjunto a la instantánea, y una de sus líneas está subrayada: «Entrego cinco tablas y el rastro de una sexta. — K.» Cuentas los planos. Exactamente cinco. ¿Dónde está el rastro?

QUERY: No te distraigas con las pistas. Primero aprende estas cinco lo bastante bien como para orientarte de memoria: lo demás te lo mostrará el archivo cuando te considere preparado.

Las cinco tablas de «Kotomarket»

A partir de aquí vamos a trabajar con esta base: una instantánea de una tienda online de 2024. Tómala como el mapa de la tienda: quién entró, qué había en el escaparate, qué compraron y qué hicieron antes de comprar.

TablaQué guarda
usersclientes: id, nombre, ciudad y fecha de registro
productsartículos del escaparate: id, nombre, categoría, precio y stock
orderspedidos: id, user_id, fecha, estado e importe
order_itemscontenido de los pedidos: qué producto, cuántas unidades y a qué precio
eventseventos de comportamiento: vistas, añadidos al carrito y compras

Los vínculos se leen así: un user → muchos orders; un order → muchos order_items; un product → muchos order_items. Si te pierdes, abre el esquema de la derecha: es como el plano de la sala de ventas.

Asomémonos a la tabla de pedidos: en cada fila hay un user_id, una referencia al cliente. Así es como una tabla se enlaza con otra, y el mapa deja de ser cinco islas separadas.

Cinco tablas-plano holográficas giran como una constelación, unidas por hilos; a un lado, apenas perceptible, aparece el contorno punteado de una sexta
El mapa del archivo: cinco tablas y los vínculos entre ellas. El diario de conservación promete además «el rastro de una sexta», pero por ahora no se ve.

Kotomarket’s five tables

From here on we’ll be working with this database — a of an online shop from 2024. Hold it like a map of the store: who walked in, what’s on the shelves, what they bought, and what they did before buying.

TableWhat it holds
usersbuyers: id, name, city, and signup date
productsstorefront items: id, name, category, price, and stock
ordersorders: id, user_id, date, status, and total
order_itemsorder contents: which product, how many, and at what price
eventsbehavioral events: views, add-to-carts, and purchases

The links read like this: one user → many orders; one order → many order_items; one product → many order_items. If you get lost, open the schema on the right — it’s like the floor plan of the shop.

Let’s peek into the orders table: every row has a user_id — a reference to a buyer. That’s how one table links to another, and the map stops being five separate islands.

Los pedidos y su vínculo con el cliente a través de user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Cómo leer un diagrama ER

El mapa que ha desplegado QUERY se llama en el sector diagrama ER (entity–relationship): los rectángulos son tablas, las líneas entre ellos son vínculos por claves foráneas. Lo más importante de una línea es su cardinalidad: cuántas filas de un lado pueden corresponder a cuántas del otro.

  • 1:N, uno a muchos — el vínculo más frecuente. Un cliente, muchos pedidos. La clave foránea siempre está del lado de los «muchos»: user_id se guarda en orders, y no al revés. Regla práctica: si has encontrado la FK, has encontrado el lado N.
  • N:M, muchos a muchos — un pedido tiene muchos productos, y un producto aparece en muchos pedidos. Ese vínculo no se puede representar directamente en una base relacional: no hay una columna donde poner la clave foránea. Se resuelve con una tabla intermedia; en nuestro caso, order_items. Cada una de sus filas lleva un par de referencias, order_id + product_id, y convierte un único vínculo N:M en dos vínculos 1:N. Además, el propio vínculo gana atributos: la cantidad de unidades y el precio en el momento de la compra.
  • 1:1, uno a uno — aparece menos: por ejemplo, cuando los campos pesados o privados se sacan a una tabla aparte con la misma clave.
-- La resolución N:M en acción: pares «pedido — producto» de order_items
SELECT order_id, product_id, quantity
FROM order_items
LIMIT 6;
usersidnameproductsidpriceordersiduser_ideventsuser_idproduct_idorder_itemsorder_idproduct_iduser_id → idproduct_id → idPKFK (reference)
El diagrama ER de «Kotomarket»: vínculos 1:N de users a orders y resolución N:M entre orders y products a través de order_items.

Trampa habitual: guardar el contenido de un pedido directamente en orders, como una cadena '7,12,3' o un array de identificadores. Esos datos no se pueden proteger con una clave foránea, ni contar bien, ni unir con el escaparate sin acrobacias. Si ves un vínculo «muchos a muchos», crea una tabla intermedia con dos claves foráneas, como order_items.

Interview question

Pregunta de entrevista: ¿cómo se implementa un vínculo «muchos a muchos» en una base relacional?

Buena respuesta: mediante una tabla intermedia con dos claves foráneas hacia las tablas que se vinculan, como order_items con order_id y product_id: convierte un N:M en dos vínculos 1:N. Además, en ella se guardan los atributos del propio vínculo: la cantidad y el precio en el momento de la compra. La clave primaria de esa tabla puede ser compuesta por las dos FK o bien un id subrogado.

Check yourself
¿Dónde se ve en el esquema qué producto acabó en qué pedido?