Database senza misteri

Che tipi di database esistono

18 min
What you'll learn
  • a distinguere le cinque famiglie di database — relazionali, chiave-valore, documentali, colonnari, a grafo — in base al modo in cui conservano i dati e agli usi più comuni
  • a scegliere l'archivio in base alle query da eseguire: database relazionale come scelta predefinita, Redis/MongoDB/ClickHouse per esigenze specifiche e non «per moda»
  • a spiegare la differenza tra e e perché il prodotto scrive su PostgreSQL mentre l'analytics legge da una colonnare
  • a riconoscere un'esigenza «documentale» che una colonna jsonb in PostgreSQL copre senza bisogno di un secondo database

Lungo il percorso verso l'inventario, QUERY rallenta davanti a una sezione buia del deposito. Dietro il vetro c'è il registro degli archivi della vecchia Terra che non hanno superato la Grande Frattura: i nodi di cache si sono spenti per primi, gli archivi documentali sono arrivati in frammenti lacerati, i cluster analitici tacciono per interi settori. Lo relazionale di Kotomarket, invece, è sopravvissuto intatto, con tutti i suoi collegamenti.

Non solo relazionali

Per Kotomarket i database relazionali sono particolarmente adatti: clienti, ordini e prodotti si dispongono in modo naturale in tabelle collegate tra loro. È a loro che è dedicato il corso. Ma nell'industria, sia nel 2024 sia oggi, si incontrano anche altri approcci:

  • chiave-valore (Redis) — un formato «chiave → valore» velocissimo, utile quando bisogna recuperare all'istante un record semplice;
  • documentali (MongoDB) — conservano documenti flessibili, in cui la struttura può cambiare da un record all'altro;
  • colonnari (ClickHouse) — forti nell'analytics, quando serve calcolare rapidamente indicatori su enormi volumi di dati.

La maggior parte dei più diffusi nello sviluppo di prodotto resta relazionale: PostgreSQL, MySQL, Oracle, MS SQL. Se padroneggi SQL qui, potrai leggere i dati con sicurezza in aziende molto diverse tra loro.

QUERY: A ogni archivio il suo compito: uno punta sulla velocità, un altro sulla flessibilità, un terzo sull'analytics. Tu e io siamo stati fortunati: ci è capitato quello in cui tutto è collegato a tutto.

Una galleria buia di archivi spenti della vecchia Terra dalle forme più diverse; in fondo brilla intatto un ologramma relazionale fatto di tabelle collegate
Gli archivi possono essere di tipi diversi: chiave-valore, documentali, colonnari. Il nostro snapshot sopravvissuto è relazionale: tabelle e collegamenti.

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.

Il registro delle famiglie, messo in ordine

Il registro dietro il vetro è l'occasione giusta per esaminare davvero le famiglie di database: «che tipi di database esistono e quando sceglierli» è una delle domande da colloquio più frequenti. Passeremo in rassegna cinque famiglie, una dopo l'altra, sempre con lo stesso schema: modalità di archiviazione, punti di forza e di debolezza, prodotti e casi d'uso.

Database relazionali: schema rigido e collegamenti

Modo di archiviazione: righe in tabelle con uno schema dichiarato in anticipo. Ogni colonna ha un tipo, tra le tabelle esistono collegamenti tramite chiavi e il protegge l'integrità da sé: non si riesce a registrare un ordine per un cliente inesistente. Le modifiche vengono eseguite come transazioni con garanzie : «ordine + decremento della giacenza» vengono scritti insieme, oppure non vengono scritti affatto.

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
Alla base, un database relazionale è una tabella: le righe sono record, le colonne hanno ciascuna il proprio tipo. I collegamenti tramite chiavi si aggiungono sopra, ma può esistere anche una sola tabella.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKproducts · banking · ordersPostgreSQL · MySQL
Quando le tabelle sono più di una, le chiavi le collegano: schema rigido e relazioni tra tabelle.
  • Punti di forza: SQL espressivo (filtri, join tra tabelle, aggregati), integrità a livello di database, transazioni.
  • Punti deboli: lo schema va progettato in anticipo e migrato a ogni cambiamento; la scalabilità orizzontale su molti server è più complessa che per le famiglie .
  • Prodotti: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Quando sceglierlo: utenti, ordini, denaro, magazzino: ovunque i dati siano collegati e un errore di scrittura sia inaccettabile. Per un nuovo prodotto è la scelta predefinita.

Database chiave-valore: un dizionario alla massima velocità

Modo di archiviazione: un unico, gigantesco dizionario «chiave → valore», quasi sempre tenuto in memoria. Niente tabelle, niente collegamenti: inserisci un valore con una chiave, lo recuperi con quella chiave in una frazione di millisecondo.

-- Questo non è SQL, sono comandi 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
Chiave-valore: accesso istantaneo tramite una chiave esatta, ma nessuna query «per contenuto».
  • Punti di forza: velocità, semplicità, scalabilità facile.
  • Punti deboli: si interroga solo tramite chiave esatta: la domanda «trova tutte le sessioni dei clienti di Mosca» non si può porre in questo formato; per il database il contenuto interno del valore è opaco.
  • Prodotti: Redis, Memcached, Amazon DynamoDB.
  • Quando sceglierlo: cache, sessioni, contatori, code, classifiche: dati usati di continuo accanto al database principale, non al suo posto.

Database documentali: JSON flessibile

Modo di archiviazione: i record sono documenti raggruppati in collezioni. Lo schema non viene dichiarato in anticipo: uno smartwatch ha un campo «durata della batteria», una felpa ha una «tabella delle taglie», e i due documenti convivono senza problemi nella stessa collezione. Le strutture annidate vengono conservate direttamente dentro il documento, senza tabelle separate.

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
Il modello documentale: documenti JSON flessibili, con insiemi di campi diversi, convivono in un'unica collezione.
  • Punti di forza: struttura flessibile, lettura dell'intero documento con un solo accesso, pratico per cataloghi con attributi eterogenei e prototipi rapidi.
  • Punti deboli: i collegamenti tra documenti sono responsabilità dell'applicazione, e i veri e propri quasi non esistono; senza disciplina, una collezione diventa un miscuglio di formati incompatibili.
  • Prodotti: MongoDB, Couchbase, Firestore.
  • Quando sceglierlo: contenuti, cataloghi con campi molto diversi tra loro, profili e impostazioni.

Il confine tra le famiglie, tra l'altro, è sfumato: PostgreSQL sa conservare documenti in una colonna di tipo jsonb e costruirci sopra degli indici. Spesso basta questo per coprire un'esigenza «documentale» senza introdurre un secondo database:

-- Un esempio fuori dal nostro snapshot: attrs è una colonna di tipo jsonb
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Database colonnari: analytics su miliardi di righe

Modo di archiviazione: i valori non vengono conservati per riga, ma per colonna: tutti i prezzi vicini, tutte le date vicine. La query «scontrino medio per mese» legge dal disco solo due colonne invece dell'intera tabella, e valori dello stesso tipo si comprimono benissimo. Da qui arriva la velocità sugli aggregati.

-- Il genere preferito di un database colonnare (dialetto ClickHouse: toYYYYMM è una sua funzione)
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
Archiviazione colonnare: un aggregato legge dal disco solo le colonne che gli servono, non l'intera tabella riga per riga.
  • Punti di forza: aggregati e scansioni su miliardi di righe, compressione molto efficace.
  • Punti deboli: aggiornamenti e cancellazioni puntuali sono costosi; leggere una singola riga per intero è più lento che in un database orientato alle righe; non sono pensati per carichi transazionali.
  • Prodotti: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Quando sceglierlo: analytics, report, eventi, log, metriche: di solito accanto al database relazionale «di produzione».

A questo punto compaiono due termini che piacciono molto ai colloqui: (online processing — molte operazioni brevi di scrittura e lettura, il mondo di PostgreSQL) e (online analytical processing — letture analitiche pesanti su tutta la storia, il mondo di ClickHouse). Il prodotto scrive nel database OLTP, l'analytics legge dalla copia OLAP.

E l'ultima famiglia: i database a grafo

Quando i collegamenti contano più dei record stessi — «amici degli amici», percorsi di consegna, catene di raccomandazioni — si scelgono i database a grafo (Neo4j, Memgraph). Al loro interno i dati sono nodi (i record) e archi (i collegamenti tra i record); attraversare collegamenti a qualunque profondità è un'operazione nativa. In un database relazionale, lo stesso attraversamento diventa una scala di join tra tabelle, sempre più pesante man mano che aumenta la profondità.

friendAnnBobCaraDanEvenodes are records, edges are links; "friends of friends" = two edges away
Un grafo: i cerchi-nodi sono i record (per esempio persone), le linee-archi sono i collegamenti tra loro. «Amici degli amici» è semplicemente uno spostamento lungo gli archi.

Mini-guida: come scegliere il database per un progetto

  1. Parti dalle domande, non dai dati. Quali query farà il prodotto: puntuali «per chiave», relazionali «chi ha comprato cosa», analitiche «quanto in un mese»?
  2. Come scelta predefinita, relazionale. Quando i dati sono collegati e l'errore costa caro (ordini, pagamenti, giacenze), la risposta è PostgreSQL. È il punto di partenza più sicuro per quasi qualsiasi prodotto.
  3. I database specializzati servono a un compito specifico, non come soluzione predefinita. Le letture più frequenti rallentano il sistema? Aggiungi una cache su Redis. L'analytics è cresciuta? Replica gli eventi in ClickHouse. I campi variano in modo estremo? Prima prova jsonb in PostgreSQL, e solo quando non basta più passa a un database documentale.
  4. Considera il costo di un secondo database. Ogni nuovo significa sincronizzazione dei dati, backup, monitoraggio e una tecnologia in più da mantenere per il team.

Trappola: scegliere il database «per moda». «Prendiamo MongoDB: senza schema è più veloce» spesso finisce con il progettare comunque uno schema, solo che ora le sue regole vivono nel codice dell'applicazione invece che sotto la protezione del database. Esiste anche la trappola opposta: introdurre ClickHouse per volumi che PostgreSQL aggrega in millisecondi. Il database si sceglie in base al tipo di query e al costo dell'errore, non in base all'hype.

ClickHouse è un colonnare per l'analytics: è apprezzato per i calcoli veloci su grandi tabelle di eventi e ordini. Ha un suo dialetto di SQL; sulla piattaforma c'è un trainer dedicato a ClickHouse. Il nostro , invece, è relazionale: più avanti QUERY apre l'inventario e mostra di che cosa è fatto — tabelle, righe e fili-chiave che le legano.

Interview question

Domanda da colloquio: quali tipi di database conosci e come sceglieresti l'archivio per un nuovo servizio?

Risposta efficace: relazionali (PostgreSQL, MySQL) — schema rigido, collegamenti, transazioni ; chiave-valore (Redis) — cache, sessioni, contatori; documentali (MongoDB) — documenti flessibili; colonnari (ClickHouse, BigQuery) — analytics su grandi volumi; a grafo (Neo4j) — collegamenti profondi. Nella scelta parto dal tipo di query: come fonte di verità uso un database relazionale, e collego quelli specializzati per compiti specifici (cache, analytics), non al suo posto.

Domanda di approfondimento: qual è la differenza tra e ?

Risposta efficace: OLTP — molte transazioni brevi di scrittura e lettura (l'evasione degli ordini), orientati alle righe come PostgreSQL; OLAP — letture analitiche pesanti e aggregati sulla storia, DBMS colonnari come ClickHouse. Spesso lavorano in coppia: il prodotto scrive su OLTP, l'analytics legge una OLAP.

Check yourself
Che tipo di database si sceglie di solito per l'analytics su grandi volumi di dati?