JSON (JavaScript Object Notation) è un formato di dati super popolare per scambiare info tra sistemi. È leggero, leggibile da chiunque e perfetto per rappresentare dati strutturati tipo oggetti o array.
PostgreSQL supporta due tipi di dato per lavorare con JSON:
JSON: salva i dati come stringa. È una rappresentazione testuale pura di JSON, senza ottimizzazione interna.JSONB: rappresentazione binaria di JSON. È più efficiente per leggere, filtrare e processare, perché PostgreSQL fa il parsing e ottimizza lo storage in anticipo.
Perché di solito si sceglie JSONB? Perché:
- È più veloce nelle query grazie allo storage binario.
- Si può indicizzare, quindi è top per grandi moli di dati.
- Ordina le chiavi e toglie i duplicati, rendendo tutto più semplice da gestire.
Esempio di struttura JSON:
{
"name": "Alice",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JSONB"]
}
Perché JSONB è utile?
Salvare dati semistrutturati. Nel mondo reale i dati spesso arrivano come oggetti complessi (tipo metadati, impostazioni, profili utente). JSONB ti permette di salvarli senza dover creare centinaia di tabelle e relazioni.
Gestire dati che cambiano. Quando la struttura di un oggetto cambia spesso (tipo si aggiungono o tolgono campi), JSONB ti dà la flessibilità per gestire questi dati.
Lavorare con API. Tante web app mandano dati in formato JSON. Invece di convertire le richieste, puoi salvarle "così come sono" e lavorarci direttamente.
Creare una tabella con JSONB
Facciamo un po' di pratica! Immagina che stiamo creando un database per salvare i profili degli utenti.
La colonna profile conterrà tutte le info extra (tipo età, interessi, contatti) in formato JSON. È comodo se la struttura dei dati cambia da utente a utente.
| id | name - VARCHAR(100) | profile - JSONB |
|---|---|---|
| 1 | Alice | {"età": 25, "competenze": ["SQL", "PostgreSQL", "JSONB"], "posizione": "New York"} |
| 2 | Bob | {"età": 30, "interessi": ["escursionismo", "fotografia"], "posizione": "Denver"} |
| 3 | Charlie | {"email": "charlie@example.com", "verificato": true} |
| 4 | Diana | {"età": 22, "competenze": ["Python"], "bio": "Appassionata di dati", "posizione": "Berlin"} |
| 5 | Eve | {"età": 28, "competenze": [], "preferenze": {"tema": "scuro", "notifiche": false}} |
I dati JSON si possono inserire come stringhe. PostgreSQL li converte in automatico in formato JSONB.
Estrarre dati da JSONB
Ora che abbiamo dei dati, vediamo come tirarli fuori. PostgreSQL offre un sacco di operatori per lavorare con JSONB.
Accedere al valore di un campo
Usiamo l’operatore -> per prendere il valore di un campo:
-- Mostra l'età dell'utente
SELECT profile->'età' AS età FROM users;
Convertire il valore in testo
L’operatore ->> ti permette di estrarre il valore come stringa:
-- Mostra la posizione dell'utente
SELECT profile->>'posizione' AS posizione FROM users;
Filtrare dati con JSONB
La vera potenza di JSONB si vede nelle query con filtri. Possiamo usare gli operatori SQL standard per lavorare con JSON.
Esempio di filtro per chiave:
-- Trova gli utenti che hanno come posizione "New York"
SELECT * FROM users
WHERE profile->>'posizione' = 'New York';
Cercare in un array
JSON supporta gli array e PostgreSQL sa cercare dentro di essi:
-- Trova gli utenti che conoscono SQL
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'competenze'));
La funzione jsonb_array_elements_text trasforma gli elementi dell’array in stringhe, così puoi confrontarli.
C’è anche una versione più corta usando l’operatore @>:
-- Trova gli utenti che conoscono SQL
SELECT * FROM users
WHERE profile->'competenze' @> '["SQL"]';
Parleremo meglio di funzioni e modi di lavorare con JSON più avanti, quando sarà il momento :P
Riassunto veloce: quando usare JSONB
JSONB è perfetto per:
- Salvare strutture dati complesse.
- Gestire dati che arrivano da API esterne.
- Situazioni in cui la struttura dell’oggetto cambia spesso.
Però occhio: usare troppo JSONB può rendere più difficile indicizzare e gestire il database. Se la struttura dei dati è stabile, meglio andare di modello relazionale.
GO TO FULL VERSION