0Pricing
SQL Academy · Lezione

Modellazione: quando JSONB supera la normalizzazione

Decida tra una colonna JSONB e una tabella separata: attributi flessibili o schemi rigidi.

Modellazione: quando JSONB supera la normalizzazione è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

La scelta

Per ogni dato che si potrebbe memorizzare: una colonna o una chiave JSONB? La risposta influisce sulla progettazione dello schema, sulle prestazioni delle query e sulla manutenibilità.

Quando le colonne sono preferibili

Usare colonne reali quando i dati sono:

  • Noti e stabili
  • Interrogati frequentemente con gli indici
  • Convalidati da vincoli CHECK o FK
  • Usati nei report o nelle join

Quando JSONB è preferibile

Usare JSONB quando:

  • La struttura varia da una riga all'altra (campi definiti dal tenant, metadati dei plugin)
  • Lo schema evolve rapidamente (per evitare le migrazioni)
  • La lettura o la scrittura dell'intero documento è la norma
  • Si memorizzano payload opachi (corpi dei webhook)

Il modello ibrido

Il meglio di entrambi: colonne strutturate per il nucleo stabile, JSONB per la parte variabile:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  data JSONB NOT NULL DEFAULT '{}'::JSONB
);

La trappola EAV

Il classico modello «entity-attribute-value», una tabella con righe composte da (key, value), un tempo era l'unica scelta per i dati sparsi. JSONB sostituisce EAV con una singola colonna documento:

-- Old EAV:
CREATE TABLE user_attrs (
  user_id BIGINT,
  attr TEXT,
  val TEXT
);

-- Modern:
ALTER TABLE users ADD COLUMN attrs JSONB NOT NULL DEFAULT '{}';

-- JSONB queries are faster and easier than the EAV joins.

Strategia di migrazione

Aggiungere una colonna a una tabella molto utilizzata significa 5 minuti di indisponibilità per una tabella grande. Con JSONB, aggiungere un campo richiede solo una modifica al codice dell'applicazione.

Vincoli su JSONB

Aggiungere vincoli CHECK per imporre una struttura minima:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type'),
  ADD CONSTRAINT type_is_string CHECK (jsonb_typeof(data->'type') = 'string');

Promuovere i campi più utilizzati

Se un campo JSONB viene interrogato frequentemente, promuoverlo a colonna reale. Uno script UPDATE, un nuovo indice e una nuova colonna lo rendono veloce.

Operazioni di modifica JSONB

Aggiornare un singolo campo:

UPDATE users
SET attrs = jsonb_set(attrs, '{plan}', '"pro"')
WHERE id = 1;

Non memorizzare gli importi in JSONB

I valori finanziari richiedono tipi NUMERIC esatti e vincoli. Usare sempre colonne reali.

Quando JSONB è svantaggioso

Se ci si ritrova a estrarre e convertire la stessa chiave JSONB in ogni query, è un segnale che dovrebbe diventare una colonna. Il costo cumulativo di (data->>'k')::INT su milioni di righe diventa significativo.

Documentazione dello schema

Le colonne JSONB sono facili da scrivere, ma difficili da documentare. Mantenere uno schema esterno (JSON Schema o codice dell'applicazione), in modo che i collaboratori sappiano cosa aspettarsi.

Riepilogo

JSONB è uno strumento potente: usarlo per le parti variabili e colonne reali per il nucleo stabile. Promuovere i campi più utilizzati quando emergono schemi ricorrenti.

Verifica rapida

Si stanno memorizzando eventi di audit. Il tipo di evento è sempre presente; alcuni eventi hanno un array di "attori" la cui struttura varia. Come lo si modella?

Domande Frequenti

La lezione «Modellazione: quando JSONB supera la normalizzazione» è gratuita?

Sì — il testo completo di «Modellazione: quando JSONB supera la normalizzazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Modellazione: quando JSONB supera la normalizzazione»?

Decida tra una colonna JSONB e una tabella separata: attributi flessibili o schemi rigidi. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Modellazione: quando JSONB supera la normalizzazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. JSONB e JSON: quando usare ciascuno
  2. Operatori per i percorsi: -> ->> @>
  3. Indicizzare JSONB con GIN
  4. Modellazione: quando JSONB supera la normalizzazione
← Torna a SQL Academy