Adatbázisok ködök nélkül

A „Kotomarket” sémája

11 min
What you'll learn
  • megtalálni a megfelelő táblát a „Kotomarket” öt táblája közül: users, products, orders, order_items, events
  • olvasni egy ER-diagramot: meghatározni a kapcsolat kardinalitását (1:N, N:M, 1:1) abból, hol fekszik az idegen kulcs
  • kibontani a „több a többhöz” kapcsolatot egy köztes táblán keresztül, két FK-val — mint az order_items az order_id + product_id párral
  • elmagyarázni, miért nem tárolható a rendelés tartalma id-sztringként közvetlenül az orders-ben

Ma a QUERY a teljes jegyzéket egyszerre hozza fel a fő asztalra. Öt fénylő sík lebeg a levegőben, és lassan forog — a fennmaradt világ térképe. Mellettük a pillanatképhez csatolt konzerválási napló pislákol, és egy sora alá van húzva: „Átadok öt táblát és egy hatodik nyomát. — K.” Megszámolod a síkokat. Pontosan öt. Hol a nyom?

QUERY: Ne hagyd, hogy a nyomok eltérítsenek. Előbb tanuld meg ezt az ötöt annyira, hogy csukott szemmel is megtaláld az utat — a többit majd megmutatja az archívum magától, amikor felkészültnek ítél.

A „Kotomarket” öt táblája

A továbbiakban ezzel az adatbázissal fogunk dolgozni — egy 2024-es webáruház pillanatképével. Tartsd úgy, mint a bolt térképét: ki jött be, mi van a kirakatban, mit vettek, és milyen műveleteket végeztek a vásárlás előtt.

TáblaMit tárol
usersvásárlókat: id, név, város és a regisztráció dátuma
productsa kirakat termékeit: id, név, kategória, ár és készlet
ordersrendeléseket: id, user_id, dátum, állapot és összeg
order_itemsa rendelések tartalmát: melyik termék, hány darab és milyen áron
eventsviselkedési eseményeket: megtekintések, kosárba helyezések és vásárlások

A kapcsolatok így olvasandók: egy user → sok orders; egy order → sok order_items; egy product → sok order_items. Ha elveszel, nyisd meg a sémát jobbra — olyan, mint az eladótér alaprajza.

Nézzünk bele a rendelések táblájába: minden sorban van egy user_id — hivatkozás a vásárlóra. Így kapcsolódik az egyik tábla a másikhoz, és a térkép megszűnik öt különálló sziget lenni.

Öt holografikus tábla-sík forog csillagképként, fonalakkal összekötve; oldalt alig kivehető egy hatodik kontúr szaggatott nyoma
Az archívum térképe: öt tábla és a köztük lévő kapcsolatok. A konzerválási napló „egy hatodik nyomát” is ígéri — de az egyelőre sehol sem látszik.

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.

A rendelések és a vásárlóhoz fűződő kapcsolatuk a user_id-n keresztül:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Hogyan olvass ER-diagramot

A térképet, amelyet a QUERY kibontott, az iparágban ER-diagramnak (entity–relationship) nevezik: a téglalapok a táblák, a köztük lévő vonalak az idegen kulcsok menti kapcsolatok. A vonalon a legfontosabb a kardinalitás: hány sor felel meg az egyik oldalon hány sornak a másikon.

  • 1:N, egy a többhöz — a leggyakoribb kapcsolat. Egy vásárló — sok rendelés. Az idegen kulcs mindig a „több” oldalon fekszik: a user_id az orders-ben tárolódik, nem fordítva. Ez maga az olvasási szabály: megtaláltad az FK-t — megtaláltad az N oldalt.
  • N:M, több a többhöz — egy rendelésben sok termék van, és egy termék sok rendelésben fordul elő. Ilyen kapcsolatot relációs adatbázisban közvetlenül nem lehet kifejezni: nincs hova tenni az idegen kulcsot. Ezt egy köztes táblán keresztül bontják ki — nálunk ez az order_items. Minden sora egy order_id + product_id hivatkozáspárt hordoz, és egy N:M kapcsolatot két 1:N kapcsolattá alakít. Ráadásként: magának a kapcsolatnak attribútumai is lesznek — a darabszám és a vásárlás pillanatában érvényes ár.
  • 1:1, egy az egyhez — ritkábban fordul elő: például a nagy méretű vagy bizalmas mezőket egy azonos kulcsú külön táblába emelik ki.
-- Az N:M feloldás működés közben: „rendelés — termék” párok az order_items-ből
SELECT order_id, product_id, quantity
FROM order_items
LIMIT 6;
usersidnameproductsidpriceordersiduser_ideventsuser_idproduct_idorder_itemsorder_idproduct_iduser_id → idproduct_id → idPKFK (reference)
A „Kotomarket” ER-diagramja: 1:N kapcsolatok a users-től az orders-ig, és N:M feloldás az orders és a products között az order_items-en keresztül.

Buktató: a rendelés tartalmát közvetlenül az orders-ben tárolni — egy '7,12,3' alakú sztringként vagy azonosítók tömbjeként. Az ilyen adatokat nem lehet idegen kulccsal védeni, tisztességesen megszámolni, vagy a kirakattal összekapcsolni akrobatika nélkül. Ha „több a többhöz” kapcsolatot látsz — hozz létre egy köztes táblát két idegen kulccsal, mint az order_items.

Interview question

Interjúkérdés: hogyan valósítható meg relációs adatbázisban a „több a többhöz” kapcsolat?

Erős válasz: egy köztes táblán keresztül, két idegen kulccsal az összekapcsolandó táblákra — mint az order_items az order_id és a product_id párral: ez két 1:N kapcsolattá alakítja az N:M-et. Egyúttal magának a kapcsolatnak az attribútumait is tárolja benne — a darabszámot, a vásárlás pillanatában érvényes árat. Az ilyen tábla elsődleges kulcsa vagy a két FK összetett kulcsa, vagy egy helyettesítő id.

Check yourself
Hol látszik a sémában, melyik termék került melyik rendelésbe?