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

Τι είδη βάσεων δεδομένων υπάρχουν

18 min
What you'll learn
  • να ξεχωρίζεις πέντε οικογένειες βάσεων δεδομένων — σχεσιακές, κλειδιού-τιμής, εγγράφων, στηλικές και γραφημάτων — από τον τρόπο αποθήκευσης και τις συνηθισμένες χρήσεις τους
  • να επιλέγεις αποθήκη με βάση τον χαρακτήρα των ερωτημάτων: σχεσιακή βάση ως αφετηρία, Redis/MongoDB/ClickHouse για συγκεκριμένη ανάγκη και όχι «επειδή είναι της μόδας»
  • να εξηγείς τη διαφορά και και γιατί το προϊόν γράφει στην PostgreSQL ενώ η αναλυτική διαβάζει από στηλικό αντίγραφο
  • να αναγνωρίζεις πότε μια ανάγκη «τύπου εγγράφου» καλύπτεται από στήλη jsonb στην PostgreSQL χωρίς δεύτερη βάση

Στον δρόμο προς το ευρετήριο, ο QUERY κοντοστέκεται σε ένα σκοτεινό τμήμα της αποθήκης. Πίσω από το τζάμι βρίσκεται το μητρώο των αρχείων της παλιάς Γης που δεν επιβίωσαν από τη Μεγάλη Ρήξη: οι κόμβοι cache έσβησαν πρώτοι, οι αποθήκες εγγράφων έμειναν σε κουρελιασμένα θραύσματα, τα αναλυτικά clusters σιωπούν σε ολόκληρους τομείς. Το σχεσιακό στιγμιότυπο του «Kotomarket» όμως επέζησε ακέραιο, μαζί με όλες του τις συνδέσεις.

Όχι μόνο σχεσιακές

Για το «Kotomarket» οι σχεσιακές βάσεις είναι ιδανικές: αγοραστές, παραγγελίες και προϊόντα μπαίνουν φυσικά σε πίνακες που συνδέονται μεταξύ τους. Σε αυτές ακριβώς είναι αφιερωμένο το μάθημα. Στον κλάδο όμως, τόσο το 2024 όσο και σήμερα, θα συναντήσεις και άλλες προσεγγίσεις:

  • κλειδιού-τιμής (Redis) — πολύ γρήγορη μορφή «κλειδί → τιμή», όταν χρειάζεται να ανασύρεις αμέσως μια απλή εγγραφή·
  • βάσεις εγγράφων (MongoDB) — αποθηκεύουν ευέλικτα έγγραφα , όπου η δομή μπορεί να διαφέρει από εγγραφή σε εγγραφή·
  • στηλικές (ClickHouse) — δυνατές στην αναλυτική, όταν χρειάζεται να υπολογίσεις γρήγορα δείκτες πάνω σε τεράστιους όγκους δεδομένων.

Τα που συναντάς συχνότερα στην ανάπτυξη προϊόντων παραμένουν σε μεγάλο βαθμό σχεσιακά: PostgreSQL, MySQL, Oracle, MS SQL. Αν μάθεις SQL εδώ, θα μπορείς να διαβάζεις δεδομένα με σιγουριά σε πολύ διαφορετικές εταιρείες.

QUERY: Κάθε αρχείο έχει τη δουλειά του: αλλού μετρά η ταχύτητα, αλλού η ευελιξία, αλλού η αναλυτική. Εμείς οι δύο σταθήκαμε τυχεροί: μας έτυχε εκείνο όπου τα πάντα συνδέονται με τα πάντα.

Μια σκοτεινή στοά από σβησμένα αρχεία της παλιάς Γης, σε διάφορα σχήματα· στην άκρη της λάμπει ακέραιο ένα σχεσιακό ολόγραμμα από συνδεδεμένους πίνακες
Οι αποθήκες δεν είναι όλες ίδιες: υπάρχουν κλειδιού-τιμής, εγγράφων, στηλικές. Το στιγμιότυπο που επέζησε είναι σχεσιακό: πίνακες και συνδέσεις.

Not only relational

For Kotomarket, relational databases suit us especially well: buyers, orders, and products fall naturally into tables with links between them. That’s what this course is about. But across the industry — in 2024 just as today — you’ll meet other approaches too:

  • key-value (Redis) — a blazingly fast "key → value" format for when you need to grab a simple record instantly;
  • document-oriented (MongoDB) — stores flexible documents whose structure can differ from record to record;
  • columnar (ClickHouse) — strong at analytics, when you need to crunch metrics over enormous volumes of data fast.

Most of the popular DBMSs for product development stay relational: PostgreSQL, MySQL, Oracle, MS SQL. Master SQL here and you’ll be able to read data confidently at very different companies.

QUERY: Each archive has its own job: one prizes speed, another flexibility, a third analytics. You and I got lucky: we inherited the one where everything is connected to everything.

Το μητρώο των οικογενειών: με τάξη

Το μητρώο πίσω από το τζάμι είναι καλή αφορμή να βάλουμε σε σειρά τις οικογένειες των βάσεων δεδομένων. Το «τι είδη βάσεων υπάρχουν και πότε διαλέγεις ποια» είναι από τις πιο συχνές ερωτήσεις σε συνεντεύξεις. Θα δούμε πέντε οικογένειες μία-μία, με το ίδιο σχήμα για καθεμία: τρόπος αποθήκευσης, δυνατά και αδύνατα σημεία, προϊόντα και πότε τη διαλέγεις.

Σχεσιακές βάσεις: αυστηρό σχήμα και συνδέσεις

Τρόπος αποθήκευσης: γραμμές σε πίνακες, με σχήμα δηλωμένο εκ των προτέρων. Κάθε στήλη έχει τύπο, οι πίνακες συνδέονται μέσω κλειδιών και το προστατεύει μόνο του την ακεραιότητα: παραγγελία από αγοραστή που δεν υπάρχει δεν γράφεται. Οι αλλαγές εκτελούνται ως συναλλαγές με εγγυήσεις : «παραγγελία + αφαίρεση αποθέματος» είτε αποθηκεύονται μαζί είτε δεν αποθηκεύονται καθόλου.

users — a tableidPKintegerfull_nametextcitytextsignup_datedate123Artyom VolkovEkaterina AlekseevNikolay NikitinSaint PetersburgYekaterinburgAlmaty2024-10-202025-01-252024-09-21rows are records · columns are typed properties · there can be just one table
Στον πυρήνα της, μια σχεσιακή βάση είναι πίνακας: γραμμές-εγγραφές και στήλες με τον δικό τους τύπο. Οι συνδέσεις μέσω κλειδιών προστίθενται από πάνω, και ο πίνακας μπορεί να είναι ακόμη και ένας μόνο.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKproducts · banking · ordersPostgreSQL · MySQL
Όταν οι πίνακες είναι περισσότεροι, συνδέονται μέσω κλειδιών: αυστηρό σχήμα και σχέσεις ανάμεσα στους πίνακες.
  • Δυνατά σημεία: εκφραστική SQL (φίλτρα, συνενώσεις πινάκων, συναθροίσεις), ακεραιότητα σε επίπεδο βάσης, συναλλαγές.
  • Αδύνατα: το σχήμα πρέπει να το σκεφτείς από πριν και να κάνεις σε κάθε αλλαγή· η οριζόντια κλιμάκωση σε πολλούς διακομιστές είναι πιο δύσκολη απ' ό,τι στις οικογένειες .
  • Προϊόντα: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Πότε τη διαλέγεις: χρήστες, παραγγελίες, χρήματα, απόθεμα — όπου τα δεδομένα συνδέονται και ένα λάθος στην εγγραφή δεν επιτρέπεται. Για ένα νέο προϊόν είναι η προεπιλεγμένη αφετηρία.

Βάσεις κλειδιού-τιμής: λεξικό σε μέγιστη ταχύτητα

Τρόπος αποθήκευσης: ένα τεράστιο λεξικό «κλειδί → τιμή», συνήθως στη μνήμη RAM. Ούτε πίνακες, ούτε συνδέσεις: βάζεις τιμή με ένα κλειδί και την παίρνεις με το ίδιο κλειδί μέσα σε κλάσματα του χιλιοστού του δευτερολέπτου.

-- Αυτό δεν είναι SQL, είναι εντολές Redis
SET session:8f3a '{"user_id": 42}'
GET session:8f3a
keyvalueuser:42Anna · Moscowcart:42[milk, cheese]sess:9factive until 18:40lookup by key — instantcache · sessions · carts — Redis
Κλειδί-τιμή: άμεση πρόσβαση με ακριβές κλειδί, αλλά χωρίς ερωτήματα «με βάση το περιεχόμενο».
  • Δυνατά σημεία: ταχύτητα, απλότητα, εύκολη κλιμάκωση.
  • Αδύνατα: ψάχνεις μόνο με ακριβές κλειδί — την ερώτηση «βρες όλες τις συνεδρίες αγοραστών από τη Μόσχα» δεν μπορείς να την κάνεις έτσι· το εσωτερικό της τιμής είναι αδιαφανές για τη βάση.
  • Προϊόντα: Redis, Memcached, Amazon DynamoDB.
  • Πότε τη διαλέγεις: μνήμη cache, συνεδρίες, μετρητές, ουρές, βαθμολογίες — ζεστά δεδομένα δίπλα στην κύρια βάση, όχι στη θέση της.

Βάσεις εγγράφων: ευέλικτο JSON

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

document 1document 2{name: "Mouse",price: 390,tags: ["hit"]}{name: "Food",brand: "Kote",specs: {weight: "2 kg"}}fields and nesting differ — schema is flexiblecatalogs · profiles · CMS — MongoDB
Το μοντέλο εγγράφων: ευέλικτα έγγραφα JSON με διαφορετικά πεδία ζουν στην ίδια συλλογή.
  • Δυνατά σημεία: ευέλικτη δομή, το έγγραφο διαβάζεται ολόκληρο με μία προσπέλαση, βολικό για καταλόγους με ανομοιογενή χαρακτηριστικά και για γρήγορα πρωτότυπα.
  • Αδύνατα: οι συνδέσεις ανάμεσα στα έγγραφα μένουν κυρίως στην εφαρμογή, πλήρες σχεδόν δεν υπάρχει· χωρίς πειθαρχία η συλλογή γίνεται χαοτική και γεμίζει ασύμβατες μορφές.
  • Προϊόντα: MongoDB, Couchbase, Firestore.
  • Πότε τη διαλέγεις: περιεχόμενο, κατάλογοι με πεδία που διαφέρουν πολύ μεταξύ τους, προφίλ και ρυθμίσεις.

Παρεμπιπτόντως, τα όρια ανάμεσα στις οικογένειες είναι θολά: η PostgreSQL μπορεί να αποθηκεύει έγγραφα σε στήλη τύπου jsonb και να φτιάχνει ευρετήρια πάνω τους. Συχνά αυτό καλύπτει την ανάγκη «τύπου εγγράφου» χωρίς δεύτερη βάση:

-- Παράδειγμα εκτός του στιγμιότυπού μας: attrs — στήλη τύπου jsonb
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Στηλικές βάσεις: αναλυτική σε δισεκατομμύρια γραμμές

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

-- Το αγαπημένο είδος της στηλικής βάσης (διάλεκτος ClickHouse: toYYYYMM — δική της συνάρτηση)
SELECT toYYYYMM(created_at) AS month, avg(total_amount) AS avg_check
FROM orders
GROUP BY month;
columnar storage: the table is laid out by columnsuser_ideventpricets39029905901490990AVG(price): only one column is readevent analytics · metrics — ClickHouse
Στηλική αποθήκευση: μια συνάθροιση διαβάζει από τον δίσκο μόνο τις στήλες που χρειάζεται, όχι ολόκληρο τον πίνακα γραμμή-γραμμή.
  • Δυνατά σημεία: συναθροίσεις και σαρώσεις σε δισεκατομμύρια γραμμές, ισχυρή συμπίεση.
  • Αδύνατα: οι μεμονωμένες ενημερώσεις και διαγραφές είναι ακριβές· το να διαβάσεις μία ολόκληρη γραμμή είναι πιο αργό απ' ό,τι σε βάση που αποθηκεύει ανά γραμμή· το συναλλακτικό φορτίο δεν είναι ο σκοπός τους.
  • Προϊόντα: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Πότε τη διαλέγεις: αναλυτική, αναφορές, συμβάντα, αρχεία καταγραφής, μετρικές — συνήθως δίπλα στην «επιχειρησιακή» σχεσιακή βάση.

Εδώ εμφανίζονται και δύο όροι που αγαπούν στις συνεντεύξεις: (online processing — πολλές σύντομες λειτουργίες εγγραφής και ανάγνωσης, ο κόσμος της PostgreSQL) και (online analytical processing — βαριές αναλυτικές αναγνώσεις πάνω σε όλο το ιστορικό, ο κόσμος της ClickHouse). Το προϊόν γράφει στη βάση OLTP, η αναλυτική διαβάζει από το αντίγραφο OLAP.

Και η τελευταία οικογένεια — βάσεις γραφημάτων

Όταν οι συνδέσεις είναι πιο σημαντικές από τις ίδιες τις εγγραφές — «φίλοι των φίλων», διαδρομές παράδοσης, αλυσίδες συστάσεων — επιλέγεις βάσεις γραφημάτων (Neo4j, Memgraph). Τα δεδομένα σε αυτές είναι κόμβοι (οι εγγραφές) και ακμές (οι συνδέσεις ανάμεσα στις εγγραφές)· η διάσχιση συνδέσεων οποιουδήποτε βάθους είναι εγγενής λειτουργία. Σε μια σχεσιακή βάση η ίδια διάσχιση γίνεται με μια σκάλα από συνενώσεις πινάκων, που όσο βαθαίνει τόσο βαραίνει.

friendAnnBobCaraDanEvenodes are records, edges are links; "friends of friends" = two edges away
Γράφημα: οι κύκλοι-κόμβοι είναι εγγραφές (για παράδειγμα, άνθρωποι), οι γραμμές-ακμές είναι οι συνδέσεις τους. Οι «φίλοι των φίλων» είναι απλώς κίνηση κατά μήκος των ακμών.

Μίνι οδηγός: πώς να διαλέξεις βάση για ένα έργο

  1. Ξεκίνα από τις ερωτήσεις, όχι από τα δεδομένα. Τι ερωτήματα θα κάνει το προϊόν: σημειακά «με βάση το κλειδί», ερωτήματα σχέσεων «ποιος αγόρασε τι», αναλυτικά «πόσα τον μήνα»;
  2. Εξ ορισμού — σχεσιακή. Συνδεδεμένα δεδομένα συν υψηλό κόστος λάθους (παραγγελίες, πληρωμές, αποθέματα) σημαίνουν PostgreSQL. Είναι η ασφαλέστερη αφετηρία σχεδόν για κάθε προϊόν.
  3. Οι εξειδικευμένες βάσεις — για συγκεκριμένη ανάγκη, όχι «για παν ενδεχόμενο». Σε πιέζουν οι ζεστές αναγνώσεις — πρόσθεσε cache με Redis. Μεγάλωσε η αναλυτική — στείλε αντίγραφο των συμβάντων στο ClickHouse. Αν τα πεδία αλλάζουν συνέχεια — πρώτα jsonb στην PostgreSQL, και μόνο όταν δεν αρκεί, βάση εγγράφων.
  4. Μέτρα το κόστος της δεύτερης βάσης. Κάθε νέο σημαίνει συγχρονισμό δεδομένων, αντίγραφα ασφαλείας, παρακολούθηση και άλλη μία τεχνολογία που πρέπει να συντηρεί η ομάδα.

Παγίδα: να διαλέγεις βάση «επειδή είναι της μόδας». Το «ας πάρουμε MongoDB — χωρίς σχήμα θα πάμε πιο γρήγορα» συχνά καταλήγει στο να σχεδιάζεις σχήμα έτσι κι αλλιώς, μόνο που τώρα οι κανόνες ζουν στον κώδικα της εφαρμογής αντί να τους προστατεύει η βάση. Υπάρχει και η αντίστροφη παγίδα: να κουβαλάς ClickHouse για όγκους που η PostgreSQL συναθροίζει σε χιλιοστά του δευτερολέπτου. Τη βάση τη διαλέγεις ανάλογα με τον χαρακτήρα των ερωτημάτων και το κόστος του λάθους, όχι ανάλογα με τον ντόρο.

Το ClickHouse είναι στηλικό για αναλυτική: το αγαπούν επειδή υπολογίζει γρήγορα πάνω σε μεγάλους πίνακες συμβάντων και παραγγελιών. Έχει τη δική του διάλεκτο SQL· στην πλατφόρμα υπάρχει ξεχωριστό περιβάλλον εξάσκησης για το ClickHouse. Το στιγμιότυπό μας όμως είναι σχεσιακό. Παρακάτω ο QUERY ανοίγει το ευρετήριο και δείχνει από τι αποτελείται: πίνακες, γραμμές και νήματα-κλειδιά ανάμεσά τους.

Interview question

Ερώτηση συνέντευξης: τι τύπους βάσεων δεδομένων ξέρεις και πώς θα διάλεγες αποθήκη για μια νέα υπηρεσία;

Δυνατή απάντηση: σχεσιακές (PostgreSQL, MySQL) — αυστηρό σχήμα, συνδέσεις, συναλλαγές · κλειδιού-τιμής (Redis) — cache, συνεδρίες, μετρητές· εγγράφων (MongoDB) — ευέλικτα έγγραφα · στηλικές (ClickHouse, BigQuery) — αναλυτική σε μεγάλους όγκους· γραφημάτων (Neo4j) — βαθιές συνδέσεις. Στην επιλογή ξεκινώ από τον χαρακτήρα των ερωτημάτων: ως πηγή αλήθειας προτιμώ σχεσιακή βάση, ενώ τις εξειδικευμένες τις προσθέτω για συγκεκριμένη ανάγκη (cache, αναλυτική), όχι στη θέση της κύριας βάσης.

Συμπληρωματική ερώτηση: σε τι διαφέρει το από το ;

Δυνατή απάντηση: OLTP — πολλές σύντομες συναλλαγές εγγραφής και ανάγνωσης (καταχώρηση παραγγελιών), που αποθηκεύουν ανά γραμμή όπως η PostgreSQL· OLAP — βαριές αναλυτικές αναγνώσεις και συναθροίσεις πάνω στο ιστορικό, στηλικά DBMS όπως το ClickHouse. Συχνά δουλεύουν μαζί: το προϊόν γράφει στην OLTP, η αναλυτική διαβάζει το αντίγραφο OLAP.

Check yourself
Ποιον τύπο βάσης δεδομένων διαλέγουμε συνήθως για αναλυτική πάνω σε μεγάλους όγκους δεδομένων;