Πίνακες, γραμμές και κλειδιά
What you'll learn
- να ξεχωρίζεις πίνακες, γραμμές και στήλες και να εξηγείς γιατί κάθε γραμμή χρειάζεται πρωτεύον κλειδί (συνήθως
id) - να εντοπίζεις τις συνδέσεις ανάμεσα στους πίνακες μέσω ξένου κλειδιού:
orders.user_id → users.id - να ξεχωρίζεις ένα υποκατάστατο κλειδί (
IDENTITY, ) από ένα φυσικό (email, ISBN) και να αιτιολογείς γιατί το πρωτεύον κλειδί δεν πρέπει να αλλάζει - να κατοχυρώνεις τη μοναδικότητα ενός πεδίου όπως το
emailμε περιορισμόUNIQUE, χωρίς να το κάνεις πρωτεύον κλειδί
Το ευρετήριο άνοιξε. Ο QUERY ξεδιπλώνει πάνω από το γραφείο ένα ολόγραμμα: χιλιάδες εγγραφές αιωρούνται σε τακτικό πλέγμα, και ανάμεσα σε ορισμένες τεντώνονται λεπτά κεχριμπαρένια νήματα. Αγγίζεις ένα· ηχεί σαν χορδή. Δεν είναι σωρός αρχείων. Είναι οργανωμένο πλέγμα.
Πίνακες, γραμμές, στήλες
Μια σχεσιακή βάση μοιάζει με τακτοποιημένο κατάλογο: τα δεδομένα μπαίνουν σε πίνακες, και μέσα σε κάθε πίνακα υπάρχουν στήλες (ποιες ιδιότητες κρατάμε) και γραμμές (οι συγκεκριμένες εγγραφές).
Πάρε τον πίνακα αγοραστών users: κάθε γραμμή είναι ένας αγοραστής της παλιάς Γης, και οι στήλες περιγράφουν το id, το full_name, το email, τη country, την city, την signup_date του.
Για να μην μπερδεύονται άνθρωποι με το ίδιο όνομα, κάθε γραμμή έχει ένα πρωτεύον κλειδί (), ένα μοναδικό αναγνωριστικό, συνήθως τη στήλη id. Με αυτό, άλλοι πίνακες μπορούν να δείχνουν σε αυτή τη γραμμή μέσω ενός ξένου κλειδιού (). Για παράδειγμα, στην παραγγελία orders υπάρχει το user_id: έτσι η παραγγελία θυμάται τον αγοραστή της. Αυτά ακριβώς τα κεχριμπαρένια νήματα στο ολόγραμμα είναι οι συνδέσεις μέσω κλειδιών.
QUERY: Όσο μένει ακέραιο το κλειδί, μένει ακέραιο και το νήμα. Πέρασε ενάμισης αιώνας, κι όμως κάθε παραγγελία θυμάται ακόμη τον άνθρωπό της.
Τρέξε το ερώτημα και δες πώς φαίνονται οι αγοραστές του «Kotomarket», εγγραφές που κανείς δεν είχε ανοίξει από την εποχή του παλιού Δικτύου:

Tables, rows, columns
A relational database is like a tidy catalog: the data is sorted into tables, and inside each table there are columns (what properties we store) and rows (the individual records).
Take the buyers’ table users: each row is one buyer from old Earth, and the columns describe their id, full_name, email, country, city, signup_date.
So that people with the same name don’t get confused, every row has a — a unique identifier, usually the id column. Through it, other tables can reference this row using a . For example, an order in orders has a user_id — that’s how an order remembers its buyer. Those amber threads on the hologram are exactly these key-based links.
QUERY: As long as the key holds, the thread holds. A century and a half on, every order still remembers its person.
Run the query and see what Kotomarket’s buyers look like — records no one has opened since the days of the old Net:
| id | full_name | city | signup_date |
|---|---|---|---|
| 1 | Артём Волков | Санкт-Петербург | 2024-10-20 |
| 2 | Екатерина Алексеев | Екатеринбург | 2025-01-25 |
| 3 | Николай Никитин | Алматы | 2024-09-21 |
| 4 | Екатерина Иванов | Новосибирск | 2024-05-04 |
| 5 | Елена Петров | Казань | 2025-01-05 |
| 6 | Ирина Кузнецов | Новосибирск | 2024-09-12 |
Το πρωτεύον κλειδί σε βοηθά να βρεις με βεβαιότητα μία γραμμή (συνήθως το id). Το ξένο κλειδί συνδέει πίνακες: για παράδειγμα, το orders.user_id → users.id δείχνει ποιανού είναι η παραγγελία. Παρακάτω ο QUERY θα ξεδιπλώσει μπροστά σου όλο τον χάρτη του στιγμιότυπου, και τους πέντε πίνακες ολόκληρους.
orders.user_id παραπέμπει στο πρωτεύον κλειδί users.id: έτσι η παραγγελία θυμάται τον αγοραστή της.Φυσικό ή υποκατάστατο κλειδί
Από πού προκύπτει το πρωτεύον κλειδί; Υπάρχουν δύο δρόμοι. Το φυσικό κλειδί είναι ένα πραγματικό χαρακτηριστικό που είναι ήδη μοναδικό: το email του αγοραστή, το ISBN ενός βιβλίου, ο κωδικός ενός νομίσματος. Το υποκατάστατο κλειδί είναι τεχνητό αναγνωριστικό χωρίς νόημα έξω από τη βάση: αυτόματη αρίθμηση ή . Στο «Kotomarket» χρησιμοποιούνται παντού υποκατάστατα id, και αυτή είναι συνηθισμένη επιλογή:
-- Υποκατάστατο κλειδί: η βάση δίνει μόνη της τον επόμενο αριθμό (PostgreSQL)
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE, -- ο φυσικός υποψήφιος ζει δίπλα ως UNIQUE
full_name TEXT NOT NULL
);
Γιατί έτσι; Η βασική ιδιότητα του πρωτεύοντος κλειδιού είναι ότι δεν πρέπει να αλλάζει. Στο PK παραπέμπουν ξένα κλειδιά από άλλους πίνακες, και μια αλλαγή τιμής θα απαιτούσε να ενημερωθούν όλα τα νήματα μαζί: στο orders, στο events, παντού. Και «αιώνια» φυσικά χαρακτηριστικά σχεδόν δεν υπάρχουν: οι άνθρωποι αλλάζουν email και επώνυμα, τα τηλέφωνα μεταφέρονται, ακόμη και τα ISBN επανεκδίδονται. Το υποκατάστατο id δεν αλλάζει ποτέ ακριβώς επειδή δεν σημαίνει τίποτα.
Κάθε πρωτεύον κλειδί πρέπει να είναι μοναδικό, όχι NULL, και σταθερό. Τα φυσικά κλειδιά άφησέ τα για μικρούς, αμετάβλητους πίνακες αναφοράς, για παράδειγμα τον κωδικό νομίσματος 'RUB' του ISO 4217. Και τη μοναδικότητα ενός φυσικού υποψηφίου όπως το email κατοχύρωσέ τη με ξεχωριστό περιορισμό UNIQUE, όπως στο παραπάνω παράδειγμα: οι συνδέσεις μένουν στη θέση τους, τα δεδομένα παραμένουν συνεπή, και ο αγοραστής μπορεί να αλλάξει email.
Προτρέχουμε λίγο: η σύνταξη για τη δημιουργία πινάκων και περιορισμών (CREATE TABLE, PRIMARY KEY, UNIQUE) ανήκει στο Κεφάλαιο 9. Εδώ κοίτα τη δομή του κλειδιού, όχι την εντολή: ένα υποκατάστατο id έγινε πρωτεύον κλειδί, ενώ το email μένει δίπλα ως UNIQUE.
Interview question
Ερώτηση συνέντευξης: σε τι διαφέρει ένα υποκατάστατο κλειδί από ένα φυσικό και ποιο θα διάλεγες για έναν πίνακα χρηστών;
Δυνατή απάντηση: το φυσικό κλειδί είναι πραγματικό μοναδικό χαρακτηριστικό (email, ISBN), ενώ το υποκατάστατο είναι τεχνητό αναγνωριστικό (στήλη IDENTITY ή ). Για χρήστες θα διάλεγα υποκατάστατο: το πρωτεύον κλειδί δεν πρέπει να αλλάζει, επειδή σε αυτό παραπέμπουν τα ξένα κλειδιά, ενώ οι άνθρωποι αλλάζουν email. Η μοναδικότητα του email κατοχυρώνεται με ξεχωριστό περιορισμό UNIQUE. Το φυσικό κλειδί έχει νόημα σε σταθερούς πίνακες αναφοράς, όπως οι κωδικοί νομισμάτων ISO 4217.