Le schéma de « Kotomarket »
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_itemsavecorder_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.
| Table | Ce qu'elle conserve |
|---|---|
users | les acheteurs : id, nom, ville et date d'inscription |
products | les articles en vitrine : id, nom, catégorie, prix et stock |
orders | les commandes : id, user_id, date, statut et montant |
order_items | le contenu des commandes : quel produit, en quelle quantité et à quel prix |
events | les é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.

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.
| Table | What it holds |
|---|---|
users | buyers: id, name, city, and signup date |
products | storefront items: id, name, category, price, and stock |
orders | orders: id, user_id, date, status, and total |
order_items | order contents: which product, how many, and at what price |
events | behavioral 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.
user_id :| id | user_id | status | total_amount |
|---|---|---|---|
| 1 | 18 | paid | 5980.00 |
| 2 | 10 | paid | 19750.00 |
| 3 | 26 | cancelled | 9560.00 |
| 4 | 26 | paid | 15530.00 |
| 5 | 8 | paid | 26710.00 |
| 6 | 37 | paid | 42110.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_idest stocké dansorders, 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érencesorder_id+product_idet 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;
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.