Les bases de données, sans brouillard

Le schéma de « Kotomarket »

11 min
What you'll learn
  • retrouver la bonne table parmi les cinq de « Kotomarket » : users, products, orders, order_items, events
  • lire un diagramme ER : déterminer la cardinalité d'un lien (1:N, N:M, 1:1) à partir de l'endroit où se trouve la clé étrangère
  • mettre en œuvre une relation « plusieurs à plusieurs » avec une table intermédiaire à deux FK — comme order_items avec order_id + product_id
  • expliquer pourquoi le contenu d'une commande ne doit pas être stocké sous forme de chaîne d'id directement dans orders

Aujourd'hui, QUERY fait apparaître tout l'index d'un coup au-dessus de la table principale. Cinq plans lumineux flottent dans l'air et tournent lentement — la carte du monde qui a survécu. À côté scintille le journal de conservation joint à l'instantané, avec une ligne soulignée : « Je transmets cinq tables et la trace d'une sixième. — K. » Tu comptes les plans. Exactement cinq. Où est la trace ?

QUERY : Ne te laisse pas distraire par les traces. Apprends d'abord à connaître ces cinq-là au point de retrouver ton chemin les yeux fermés — l'archive te montrera le reste d'elle-même quand elle te jugera prêt.

Les cinq tables de « Kotomarket »

À partir d'ici, nous travaillerons avec cette base — l'instantané d'une boutique en ligne de l'année 2024. Pense-la comme le plan du magasin : qui est entré, ce qui était en vitrine, ce qui a été acheté et quelles actions ont précédé l'achat.

TableCe qu'elle conserve
usersles acheteurs : id, nom, ville et date d'inscription
productsles articles en vitrine : id, nom, catégorie, prix et stock
ordersles commandes : id, user_id, date, statut et montant
order_itemsle contenu des commandes : quel produit, en quelle quantité et à quel prix
eventsles événements comportementaux : vues, ajouts au panier et achats

Les liens se lisent ainsi : un user → plusieurs orders ; une order → plusieurs order_items ; un product → plusieurs order_items. Si tu te perds, ouvre le schéma à droite — c'est le plan de la surface de vente.

Jetons un œil à la table des commandes : chaque ligne possède un user_id — une référence vers un acheteur. C'est ainsi qu'une table se relie à une autre, et la carte cesse d'être composée de cinq îlots séparés.

Cinq plans de tables holographiques tournent en constellation, reliés par des fils ; à l'écart, à peine perceptible, apparaît le contour pointillé d'une sixième table
La carte de l'archive : cinq tables et les liens entre elles. Le journal de conservation promet aussi « la trace d'une sixième » — mais elle reste invisible pour l'instant.

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.

Les commandes et leur lien avec l'acheteur via user_id :
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Comment lire un diagramme ER

La carte que QUERY a déroulée porte, dans l'industrie, le nom de diagramme ER (entity–relationship) : les rectangles sont des tables, les lignes entre eux sont des liens par clés étrangères. Le plus important sur une ligne, c'est sa cardinalité : combien de lignes d'un côté peuvent correspondre à combien de lignes de l'autre.

  • 1:N, un-à-plusieurs — le lien le plus fréquent. Un acheteur, plusieurs commandes. La clé étrangère se trouve toujours du côté « plusieurs » : user_id est stocké dans orders, et non l'inverse. C'est la règle de lecture : tu as trouvé la FK, tu as trouvé le côté N.
  • N:M, plusieurs-à-plusieurs — une commande contient plusieurs produits, et un produit peut se retrouver dans plusieurs commandes. Un tel lien ne peut pas s'exprimer directement dans une base relationnelle : la clé étrangère n'a nulle part où aller. On le déploie via une table intermédiaire — chez nous, c'est order_items. Chacune de ses lignes porte une paire de références order_id + product_id et transforme un lien N:M en deux liens 1:N. Mieux : le lien lui-même reçoit ses attributs — la quantité et le prix au moment de l'achat.
  • 1:1, un-à-un — plus rare : on extrait par exemple des champs volumineux ou privés vers une table séparée portant la même clé.
-- La résolution N:M en action : les paires « commande — produit » depuis 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)
Le diagramme ER de « Kotomarket » : des liens 1:N de users vers orders, et une relation N:M entre orders et products résolue via order_items.

Piège : stocker le contenu d'une commande directement dans orders — sous forme de chaîne '7,12,3' ou de tableau d'identifiants. De telles données ne peuvent ni être protégées par une clé étrangère, ni comptées proprement, ni jointes à la vitrine sans acrobaties. Quand tu vois un lien « plusieurs à plusieurs », crée une table intermédiaire à deux clés étrangères, comme order_items.

Interview question

Question d'entretien : comment implémenter un lien « plusieurs à plusieurs » dans une base relationnelle ?

Bonne réponse : avec une table intermédiaire qui contient deux clés étrangères vers les tables à relier — comme order_items avec order_id et product_id. Elle transforme un lien N:M en deux liens 1:N. Au passage, on y stocke les attributs du lien lui-même : la quantité, le prix au moment de l'achat. La clé primaire d'une telle table peut être composée des deux FK, ou bien être un id de substitution.

Check yourself
Où, dans le schéma, voit-on quel produit s'est retrouvé dans quelle commande ?