Το σχήμα του «Kotomarket»
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.
| 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 |
Πώς διαβάζουμε ένα διάγραμμα 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;
Παγίδα: να αποθηκεύεις το περιεχόμενο της παραγγελίας απευθείας στο orders, ως συμβολοσειρά '7,12,3' ή ως πίνακα αναγνωριστικών. Τέτοια δεδομένα δεν μπορείς να τα προστατεύσεις με ξένο κλειδί, να τα μετρήσεις σωστά ή να τα συνενώσεις με τη βιτρίνα χωρίς ακροβασίες. Όταν βλέπεις σχέση «πολλά προς πολλά», φτιάξε ενδιάμεσο πίνακα με δύο ξένα κλειδιά, όπως ο πίνακας order_items.
Interview question
Ερώτηση συνέντευξης: πώς υλοποιείς σε μια σχεσιακή βάση μια σχέση «πολλά προς πολλά»;
Δυνατή απάντηση: μέσω ενδιάμεσου πίνακα με δύο ξένα κλειδιά προς τους πίνακες που συνδέονται — όπως ο πίνακας order_items με order_id και product_id. Έτσι το N:M γίνεται δύο σχέσεις 1:N. Στον ίδιο πίνακα αποθηκεύονται και τα χαρακτηριστικά της ίδιας της σχέσης, όπως το πλήθος και η τιμή τη στιγμή της αγοράς. Το πρωτεύον κλειδί ενός τέτοιου πίνακα μπορεί να είναι είτε σύνθετο από τα δύο FK είτε ένα υποκατάστατο id.