Βάσεις δεδομένων, χωρίς μυστήριο

Το σχήμα του «Kotomarket»

11 min
What you'll learn
  • να βρίσκεις τον σωστό πίνακα ανάμεσα στους πέντε του «Kotomarket»: users, products, orders, order_items, events
  • να διαβάζεις ένα διάγραμμα ER: να προσδιορίζεις την πληθικότητα μιας σχέσης (1:N, N:M, 1:1) από το πού βρίσκεται το ξένο κλειδί
  • να αναλύεις μια σχέση «πολλά προς πολλά» μέσω ενδιάμεσου πίνακα με δύο FK — όπως το order_items με order_id + product_id
  • να εξηγείς γιατί το περιεχόμενο μιας παραγγελίας δεν μπορεί να αποθηκευτεί ως συμβολοσειρά από id απευθείας μέσα στο orders

Σήμερα ο QUERY φέρνει στο κεντρικό τραπέζι ολόκληρο το ευρετήριο με μία κίνηση. Πέντε φωτεινά επίπεδα αιωρούνται στον αέρα και περιστρέφονται αργά: ένας χάρτης του κόσμου που επέζησε. Δίπλα τρεμοσβήνει το ημερολόγιο συντήρησης που συνοδεύει το στιγμιότυπο, και μια γραμμή του είναι υπογραμμισμένη: «Παραδίδω πέντε πίνακες και το ίχνος ενός έκτου. — K.» Μετράς τα επίπεδα. Ακριβώς πέντε. Πού είναι το ίχνος;

QUERY: Μην κολλάς στα ίχνη. Πρώτα μάθε αυτούς τους πέντε τόσο καλά ώστε να βρίσκεις τον δρόμο σου με κλειστά μάτια. Τα υπόλοιπα θα στα δείξει μόνο του το αρχείο, όταν σε κρίνει έτοιμο.

Οι πέντε πίνακες του «Kotomarket»

Από εδώ και πέρα θα δουλεύουμε με αυτή τη βάση, ένα στιγμιότυπο ηλεκτρονικού καταστήματος του 2024. Κράτα τη σαν χάρτη του καταστήματος: ποιος ήρθε, τι υπάρχει στη βιτρίνα, τι αγοράστηκε και ποιες ενέργειες έγιναν πριν από την αγορά.

ΠίνακαςΤι φυλάει
usersαγοραστές: id, όνομα, πόλη και ημερομηνία εγγραφής
productsπροϊόντα της βιτρίνας: id, ονομασία, κατηγορία, τιμή και απόθεμα
ordersπαραγγελίες: id, user_id, ημερομηνία, κατάσταση και ποσό
order_itemsπεριεχόμενο των παραγγελιών: ποιο προϊόν, πόσα τεμάχια και σε ποια τιμή
eventsσυμβάντα συμπεριφοράς: προβολές, προσθήκες στο καλάθι και αγορές

Οι συνδέσεις διαβάζονται έτσι: ένας user → πολλές orders· μία order → πολλά order_items· ένα product → πολλά order_items. Αν χαθείς, άνοιξε το σχήμα στα δεξιά: είναι σαν κάτοψη του καταστήματος.

Ας ρίξουμε μια ματιά στον πίνακα των παραγγελιών. Σε κάθε γραμμή υπάρχει το user_id, μια αναφορά στον αγοραστή. Έτσι ένας πίνακας συνδέεται με έναν άλλον, και ο χάρτης παύει να είναι πέντε ξεχωριστά νησιά.

Πέντε ολογραφικά επίπεδα-πίνακες περιστρέφονται σαν αστερισμός, συνδεδεμένα με νήματα· στο πλάι μόλις που διακρίνεται το διάστικτο ίχνος ενός έκτου περιγράμματος
Ο χάρτης του αρχείου: πέντε πίνακες και οι συνδέσεις ανάμεσά τους. Το ημερολόγιο συντήρησης υπόσχεται και «το ίχνος ενός έκτου», αλλά προς το παρόν δεν φαίνεται πουθενά.

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.

Οι παραγγελίες και η σύνδεσή τους με τον αγοραστή μέσω του user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Πώς διαβάζουμε ένα διάγραμμα ER

Τον χάρτη που ξεδίπλωσε ο QUERY ο κλάδος τον λέει διάγραμμα ER (entity–relationship): τα ορθογώνια είναι πίνακες, οι γραμμές ανάμεσά τους είναι οι σχέσεις μέσω ξένων κλειδιών. Το πιο σημαντικό πάνω στη γραμμή είναι η πληθικότητα: πόσες γραμμές από τη μία πλευρά αντιστοιχούν σε πόσες από την άλλη.

  • 1:N, ένα-προς-πολλά — η πιο συχνή σχέση. Ένας αγοραστής, πολλές παραγγελίες. Το ξένο κλειδί βρίσκεται πάντα στην πλευρά των «πολλών»: το user_id φυλάγεται στο orders, όχι το αντίστροφο. Αυτός είναι ο κανόνας ανάγνωσης: βρήκες το FK, βρήκες την πλευρά N.
  • N:M, πολλά-προς-πολλά — σε μία παραγγελία μπαίνουν πολλά προϊόντα, και ένα προϊόν εμφανίζεται σε πολλές παραγγελίες. Μια τέτοια σχέση δεν αποτυπώνεται απευθείας σε σχεσιακή βάση: το ξένο κλειδί δεν έχει πού να μπει. Την αναλύεις μέσω ενός ενδιάμεσου πίνακα· σε εμάς είναι ο πίνακας order_items. Κάθε γραμμή του κουβαλά ένα ζεύγος αναφορών order_id + product_id και μετατρέπει μία σχέση N:M σε δύο σχέσεις 1:N. Πρόσθετο κέρδος: στην ίδια τη σχέση εμφανίζονται χαρακτηριστικά, όπως το πλήθος των τεμαχίων και η τιμή τη στιγμή της αγοράς.
  • 1:1, ένα-προς-ένα — εμφανίζεται πιο σπάνια: για παράδειγμα, βαριά ή ιδιωτικά πεδία μεταφέρονται σε ξεχωριστό πίνακα με το ίδιο κλειδί.
-- Η ανάλυση του N:M στην πράξη: ζεύγη «παραγγελία — προϊόν» από το 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)
Το διάγραμμα ER του «Kotomarket»: σχέσεις 1:N από τον πίνακα users προς τον πίνακα orders και η ανάλυση N:M ανάμεσα σε orders και products μέσω του order_items.

Παγίδα: να αποθηκεύεις το περιεχόμενο της παραγγελίας απευθείας στο orders, ως συμβολοσειρά '7,12,3' ή ως πίνακα αναγνωριστικών. Τέτοια δεδομένα δεν μπορείς να τα προστατεύσεις με ξένο κλειδί, να τα μετρήσεις σωστά ή να τα συνενώσεις με τη βιτρίνα χωρίς ακροβασίες. Όταν βλέπεις σχέση «πολλά προς πολλά», φτιάξε ενδιάμεσο πίνακα με δύο ξένα κλειδιά, όπως ο πίνακας order_items.

Interview question

Ερώτηση συνέντευξης: πώς υλοποιείς σε μια σχεσιακή βάση μια σχέση «πολλά προς πολλά»;

Δυνατή απάντηση: μέσω ενδιάμεσου πίνακα με δύο ξένα κλειδιά προς τους πίνακες που συνδέονται — όπως ο πίνακας order_items με order_id και product_id. Έτσι το N:M γίνεται δύο σχέσεις 1:N. Στον ίδιο πίνακα αποθηκεύονται και τα χαρακτηριστικά της ίδιας της σχέσης, όπως το πλήθος και η τιμή τη στιγμή της αγοράς. Το πρωτεύον κλειδί ενός τέτοιου πίνακα μπορεί να είναι είτε σύνθετο από τα δύο FK είτε ένα υποκατάστατο id.

Check yourself
Πού στο σχήμα φαίνεται ποιο προϊόν μπήκε σε ποια παραγγελία;