Bazele de date, fără mistere

Schema „Kotomarket”

11 min
What you'll learn
  • să găsești tabelul potrivit printre cele cinci din „Kotomarket”: users, products, orders, order_items, events
  • să citești o diagramă ER: să determini cardinalitatea legăturii (1:N, N:M, 1:1) după locul în care se află cheia externă
  • să descompui o legătură „mulți la mulți” printr-un tabel intermediar cu două FK — precum order_items cu order_id + product_id
  • să explici de ce conținutul unei comenzi nu trebuie păstrat ca un șir de id-uri direct în orders

Astăzi, QUERY aduce pe masa principală tot inventarul deodată. Cinci planuri luminoase plutesc în aer și se rotesc încet — harta lumii care a supraviețuit. Alături pâlpâie jurnalul de conservare atașat copiei, iar o linie din el este subliniată: „Predau cinci tabele și urma celui de-al șaselea. — K.” Numeri planurile. Exact cinci. Unde e urma?

QUERY: Nu te lăsa distras de urme. Învață mai întâi aceste cinci tabele atât de bine încât să-ți găsești drumul cu ochii închiși. Restul ți-l va arăta arhiva singură, când te va socoti pregătit.

Cele cinci tabele „Kotomarket”

Mai departe vom lucra cu această bază — o copie de arhivă a unui magazin online din 2024. Gândește-te la ea ca la harta magazinului: cine a intrat, ce era pe raft, ce s-a cumpărat și ce acțiuni au avut loc înainte de cumpărare.

TabelCe păstrează
userscumpărătorii: id, nume, oraș și data înregistrării
productsprodusele de pe raft: id, denumire, categorie, preț și stoc
orderscomenzile: id, user_id, dată, status și sumă
order_itemsconținutul comenzilor: ce produs, câte bucăți și la ce preț
eventsevenimentele comportamentale: vizualizări, adăugări în coș și cumpărături

Legăturile se citesc așa: un user → multe orders; un order → multe order_items; un product → multe order_items. Dacă te rătăcești, deschide schema din dreapta: e ca planul sălii de vânzare.

Să aruncăm o privire în tabelul comenzilor: în fiecare rând există user_id — o referință către cumpărător. Așa se leagă un tabel de altul, iar harta încetează să mai fie cinci insule separate.

Cinci tabele-planuri holografice se rotesc ca o constelație, unite prin fire; într-o parte abia se zărește conturul punctat al unui al șaselea plan
Harta arhivei: cinci tabele și legăturile dintre ele. Jurnalul de conservare promite și „urma celui de-al șaselea”, dar deocamdată nu se vede.

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.

Comenzile și legătura lor cu cumpărătorul prin user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Cum se citește o diagramă ER

Harta desfășurată de QUERY se numește în industrie diagramă ER (entity–relationship): dreptunghiurile sunt tabele, liniile dintre ele sunt legături prin chei externe. Cel mai important lucru de pe o linie este cardinalitatea: câte rânduri dintr-o parte corespund câtor rânduri din cealaltă.

  • 1:N, unu-la-mulți — cea mai frecventă legătură. Un cumpărător — multe comenzi. Cheia externă stă mereu pe partea „celor mulți”: user_id se păstrează în orders, nu invers. Regula de citire e simplă: ai găsit FK — ai găsit partea N.
  • N:M, mulți-la-mulți — o comandă are multe produse, iar un produs apare în multe comenzi. O astfel de legătură nu poate fi exprimată direct într-o bază relațională: nu ai unde să pui cheia externă. Ea se descompune printr-un tabel intermediar — la noi, acesta este order_items. Fiecare rând al lui poartă o pereche de referințe order_id + product_id și transformă o singură legătură N:M în două legături 1:N. În plus, relația însăși primește atribute — numărul de bucăți și prețul din momentul cumpărării.
  • 1:1, unu-la-unu — se întâlnește mai rar: de exemplu, câmpurile voluminoase sau sensibile se mută într-un tabel separat, cu aceeași cheie.
-- Desfacerea N:M în acțiune: perechile „comandă — produs” din 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)
Diagrama ER „Kotomarket”: legături 1:N de la users la orders și descompunerea N:M dintre orders și products prin order_items.

Capcană: să păstrezi conținutul comenzii direct în orders — ca un șir '7,12,3' sau un tablou de identificatori. Astfel de date nu pot fi protejate de o cheie externă, numărate corect sau îmbinate cu raftul fără acrobații. Când vezi o legătură „mulți la mulți”, creează un tabel intermediar cu două chei externe, precum order_items.

Interview question

Întrebare de interviu: cum se implementează într-o bază relațională o legătură „mulți la mulți”?

Răspuns puternic: printr-un tabel intermediar cu două chei externe către tabelele legate — precum order_items cu order_id și product_id: el transformă N:M în două legături 1:N. În același tabel se păstrează și atributele relației — cantitatea, prețul din momentul cumpărării. Cheia primară a unui astfel de tabel este fie compusă din cele două FK, fie un id surogat.

Check yourself
Unde se vede în schemă ce produs a ajuns în ce comandă?