A volte la struttura dei dati non si adatta alle classiche stringhe e numeri. Per esempio, un utente può avere una lista di hobby, impostazioni personalizzate del profilo o parametri annidati di un ordine. Creare tabelle separate per tutto questo è scomodo. Qui entra in gioco JSON.
PostgreSQL supporta due formati per lavorare con questi dati: JSON e JSONB. Entrambi permettono di salvare dati strutturati in una singola colonna, ma ci sono differenze importanti tra loro.
Vediamo come funziona, quando usare un formato o l’altro e quali possibilità ti danno.
Cos’è JSON
JSON (JavaScript Object Notation) è un formato testuale per lo scambio di dati, creato per rappresentare dati strutturati in modo semplice. È un formato che ogni dev web conosce bene, e si può descrivere come “facile da leggere per gli umani” e “facile da parsare per i computer”. In PostgreSQL questo formato viene usato per salvare e gestire dati strutturati.
Ecco un esempio di oggetto JSON:
{
"name": "Alex Lin",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JavaScript"],
"address": {
"city": "Berlin",
"postal_code": "10115"
}
}
Nota: JSON è solo testo, ma con delle regole. Ad esempio, i nomi delle chiavi sono sempre tra virgolette.
JSONB: Binary JSON
JSONB è il “JSON binario”, anch’esso supportato da PostgreSQL. A differenza di JSON, JSONB viene indicizzato ed è ottimizzato per ricerche e modifiche veloci. La differenza principale tra JSON e JSONB in PostgreSQL sta nel modo in cui vengono salvati:
- JSON viene salvato come stringa di testo, esattamente come lo passi.
- JSONB converte i dati in formato binario, che è più efficiente per la maggior parte delle operazioni.
JSONB ti dà feature come filtraggio, indicizzazione, confronto di strutture annidate complesse.
Principali vantaggi di JSONB
Perché scegliere JSONB invece di JSON? Ecco qualche motivo:
- Ricerche e filtri più veloci
JSONB è pensato per estrarre dati rapidamente. Per esempio, se hai un grande array di oggetti, JSONB ti permette di trovare quello che ti serve senza scorrere tutto.
- Possibilità di indicizzazione
Con l’indicizzazione puoi cercare per chiavi e valori dentro JSONB, rendendo le query super veloci. Considerare JSON come testo (in formato JSON) non permette l’indicizzazione.
- Gestione comoda di dati annidati
JSONB è una bomba con le strutture annidate. Non devi creare mille tabelle per gestire dati gerarchici — puoi tenere tutto compatto.
Quando usare JSON e quando JSONB
- JSON va bene se vuoi salvare i dati “così come sono” in formato testo. Per esempio, se ti serve la registrazione esatta dei dati o vuoi la minima elaborazione.
- JSONB è perfetto se vuoi fare query, filtri e modifiche attive sui dati, o se ti serve l’indicizzazione.
Esempi di oggetti JSON
Vediamo qualche esempio di oggetto JSON per capire come possono essere strutturati.
Oggetto JSON semplice.
Struttura chiave-valore:
{
"name": "Ekaterina",
"age": 29
}
Array in JSON
JSON supporta gli array:
{
"skills": ["Python", "SQL", "Analisi Dati"]
}
Oggetti annidati
JSON permette di creare strutture per salvare dati complessi:
{
"name": "Andrey",
"contacts": {
"email": "andrey@example.com",
"phone": "+79012345678"
}
}
Combinare array e oggetti
Puoi combinare array e oggetti:
{
"team": [
{
"name": "Elena",
"role": "manager"
},
{
"name": "Pavel",
"role": "sviluppatore"
}
]
}
JSON e PostgreSQL
PostgreSQL supporta due tipi di dato separati per lavorare con JSON:
JSON: formato testuale.JSONB: formato binario.
Creare una tabella con colonne JSON e JSONB
Vediamo come usare JSON/JSONB nelle tabelle PostgreSQL. Ad esempio, creiamo una tabella per salvare info sui dipendenti di un’azienda:
-- Creiamo una tabella con colonne JSON e JSONB
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
details JSON, -- JSON testuale
profile JSONB -- JSON binario
);
A prima vista sembra che non ci sia differenza tra queste colonne. Ma non è così: JSON è perfetto per salvare dati immutati, mentre JSONB è meglio per filtri e ricerche.
-- Inseriamo dati
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "Tallinn"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "calcio"}'),
('Maya Novak', '{"age": 25, "city": "Riga"}', '{"skills": ["Python", "Machine Learning"], "hobby": "lettura"}');
Estrarre dati da JSONB
Puoi estrarre dati da JSONB usando funzioni speciali che vedremo nella prossima lezione. Per esempio, per vedere le skill dei dipendenti:
-- Estrazione delle skill
SELECT name, profile->'skills' AS skills
FROM employees;
Risultato:
| name | skills |
|---|---|
| Alex Lin | ["SQL", "PostgreSQL"] |
| Maya Novak | ["Python", "Machine Learning"] |
Uso di JSON nella vita reale
JSON (e JSONB) è usato tantissimo nelle app reali. Ecco qualche esempio:
- API e microservizi. JSON è il formato standard per lo scambio dati nei RESTful API. PostgreSQL lo supporta sia per il salvataggio che per la gestione.
- Integrazione dati. Se il tuo database riceve dati da sistemi diversi, lavorare con JSONB è molto più comodo.
- Gestione di strutture complesse. Ad esempio, JSONB è ottimo per salvare dati di questionari, impostazioni utente o metadati aziendali.
GO TO FULL VERSION