
Snapshots and slow change management
Snapshot and slow change management. Lesson on SCD type-2 and snapshots in dbt.
What you will learn
- Configurare uno snapshot dbt con strategia timestamp o check
- Ricostruire lo stato storico di una dimensione con filtri sul periodo di validità
- Testare unicità della chiave e assenza di buchi temporali negli snapshot
Snapshots and slow change management
Prima o poi ogni team dati incontra la stessa domanda: come faccio a sapere com’era un cliente, un piano o un attributo in un momento preciso del passato? Lo stato attuale del database non basta, perché la storia che spiegava una decisione presa sei mesi fa è sparita. Gli snapshot di dbt conservano quella storia, e in questa lezione impari a configurarli e a interrogarli senza buchi temporali.
L’idea in una frase
Gli snapshot di dbt conservano la storia completa di una dimensione registrando ogni cambiamento di attributo con il suo periodo di validità.
La procedura in cinque passi
- Scegli la tabella da storicizzare e la chiave immutabile che identifica ogni entità.
- Dichiara la strategia di rilevamento:
timestampse la colonna di modifica è affidabile,checkotherwise. - Schedula lo snapshot con una frequenza superiore al ritmo di cambiamento dei dati.
- Interroga sempre con il filtro sul periodo di validità per ricostruire lo stato storico corretto.
- Testa unicità della chiave, completezza delle righe e assenza di buchi temporali a ogni run.
Il problema che cambia le decisioni
Un cliente cambia segmento, piano, stato CRM e owner commerciale nel tempo. Se guardi solo lo stato attuale del database, perdi la storia che spiegava una decisione presa sei mesi fa. Gli snapshot servono a questo: tenere traccia di come un attributo è cambiato, così da ricostruire il contesto corretto di una metrica in qualsiasi momento del passato.
Cosa sono le slowly changing dimensions
Una Slowly Changing Dimension (SCD) è una dimensione i cui attributi cambiano nel tempo, e di cui ti serve il valore storico e non solo l’ultimo. Lo stato attuale non basta: devi poter rispondere quale fosse, ad esempio, il piano di abbonamento di un cliente a una data passata precisa.
I tipi più usati si distinguono per come trattano il valore vecchio.
| Type | Strategy | Usage | Example |
|---|---|---|---|
| Type 1 | Overwrite | When the old value is no longer needed | Fix a typo in the name |
| Type 2 | New row with validity date | When full history is needed | Subscription plan change |
| Type 3 | "Previous value" column + "current value" | When only the immediately preceding change is needed | Previous vs current registered office |
Il Type 2 è il più usato, perché conserva la storia completa con colonne di validità temporale.
Verdetto: il Type 2 vince quando serve lo storico completo: conserva ogni cambiamento con periodo di validità, mentre Type 1 e Type 3 restano per correzioni e cambiamenti immediatamente precedenti.
| customer_id | plan | valid_from | valid_to | is_current |
|---|---|---|---|---|
| C001 | free | 2023-01-10 | 2023-06-15 | false |
| C001 | pro | 2023-06-15 | 2023-12-01 | false |
| C001 | enterprise | 2023-12-01 | NULL | true |
Con questa struttura filtri per il periodo che ti interessa, con la data di analisi compresa tra inizio e fine validità.
Gli snapshot di dbt come Type 2 automatico
dbt offre un modulo per gli snapshot che automatizza il versionamento. Tu dichiari la strategia e dbt la applica a ogni esecuzione. Nel caso più comune definisci customer_id come chiave unica e usi una strategia basata sulla colonna updated_at.
A ogni esecuzione dello snapshot accade questo:
- Legge la tabella sorgente
- Confronta ogni riga con la versione salvata
- If
customer_idè nuovo, inserisce una riga con inizio validità uguale al momento corrente e fine validità vuota - If
updated_atè cambiato, chiude la riga precedente e ne crea una nuova - Se nulla è cambiato, ignora
Le due strategie principali coprono casi diversi. Con la strategia timestamp ti affidi a una colonna di ultima modifica. Con la strategia check confronti un insieme di colonne e lo snapshot scatta se almeno una è cambiata, utile quando non ti fidi del campo di timestamp.
Gli errori che rovinano uno snapshot
Quasi tutti i problemi nascono da poche scelte sbagliate all’inizio. Una chiave unica non immutabile è la prima trappola: usa ID generati dal sistema, mai email o altri campi che il cliente può modificare. Quando updated_at non è affidabile, passa alla strategia check sulle colonne che contano. Una query storica senza filtro temporale restituisce risultati sbagliati, quindi usa sempre il range di validità. Infine la frequenza: se i dati cambiano più volte al giorno, uno snapshot giornaliero perde le variazioni intermedie.
Un esempio che ha fatto scuola
Monzo, banca digitale con 8 milioni di clienti, usa gli snapshot di dbt per tracciare ogni cambiamento di stato conto, piano tariffario e dati anagrafici con la data esatta. Senza snapshot la stessa logica avrebbe richiesto migliaia di righe di codice e mesi di lavoro; con dbt sono bastate poche righe e qualche settimana. Dai dati storici emerge un dettaglio operativo: i clienti che passano da standard a plus entro 30 giorni hanno un LTV del 43 per cento più alto di chi aspetta 90 giorni. È un’informazione che esiste solo se conservi la storia, e ha portato a rivedere l’onboarding.
Domande per verificare la comprensione
- Quando basta sovrascrivere un attributo e quando serve invece uno storico completo?
- Quale chiave immutabile scegli per lo snapshot e perché non usi la email?
- Come ricostruisci il valore di un attributo a una data passata precisa?
- Quale controllo ti segnala che lo snapshot sta perdendo cambiamenti intermedi?
Bloccato su questo argomento o vuoi applicarlo al tuo caso? Prenota una call di 15 minuti con un analista esperto.
Related Path
Lessons to read together
Questi collegamenti portano la lezione dentro il resto del corso: basi da riprendere, passaggi successivi e connessioni tematiche tra moduli.