Salta ai contenuti

Progetta fino alla terza forma normale, poi fai un passo indietro

Disponibile anche in 28 lingue

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A park seen from above: paths at right angles, and one diagonal shortcut that people kept walking, now deliberately paved, with the old worn track still faint beside it.
Immagine generata con l'IA

Modulo 5 di 6 del capitolo Modellare i dati per il loro significato, capitolo 2 del corso Data Architect. Ogni modulo si regge da solo. Precedente: Metti i dati dove devono stare · Successivo: Trasforma il modello in Salesforce

La domanda a cui risponde questo modulo: Quando dovrei allontanarmi intenzionalmente da un modello normalizzato pulito?

Nel modulo precedente ti ho detto di progettare fino alla terza forma normale.

Ora ti dirò di infrangerla.

A volte.

È una distinzione importante. C’è una grande differenza tra costruire per sbaglio un modello dati disordinato e denormalizzare deliberatamente un modello pulito. Se non capisci dove devono stare i dati in primo luogo, copiarli da un’altra parte non è architettura. È solo duplicazione.

Ma una volta capito il modello logico pulito, posso decidere consapevolmente di dare ai dati una forma diversa per le persone e i sistemi che li consumano.

Progetta fino alla terza forma normale dove è fattibile. Poi fai un passo indietro quando è necessario.

Nota cosa non dice quella frase. Non dice che la terza forma normale sia più facile da capire. A volte è più difficile: un modello completamente normalizzato può spargere un’unica idea di business su cinque oggetti, e chi lo usa deve rimetterla insieme a mente. La normalizzazione mi dice dove sta ogni fatto. Non promette che sia la forma più facile da leggere, da usare o su cui fare report. Proprio per questo fare un passo indietro è un’abilità di progettazione e non un fallimento.

Comincia modellando la verità. Poi decidi come quella verità deve essere consegnata.

Torniamo ai cani, e questa volta facciamo alcune scelte deliberate.

Razza: un elenco di selezione o una tabella sua? Passala attraverso le domande che ti darò più avanti in questo modulo. C’è più di una colonna di informazioni? Sì: almeno la taglia. Quanti valori? I kennel club riconoscono qualche centinaio di razze (solo l’American Kennel Club ne elenca 205), ben oltre la mia regola pratica di una ventina. Quindi Razza si guadagna una tabella sua, e ogni cane punta alla sua razza. Questo risolve la domanda che ci portiamo dietro dal modulo 1: Razza è un riquadro a sé.

Livello di abilità: un elenco di selezione. In apprendimento, Buono, Esperto. Tre etichette, nient’altro da dire su di loro, e non cambieranno. È esattamente lo scopo di un elenco di selezione.

Quanti esercizi conosce ogni cane? La risposta è già nel modello: conta i record Esercizio del cane del cane. Ma l’addestratore vuole quel numero su ogni report, per ordinare e filtrare in base a esso, senza costruire un report su due tabelle. Quindi faccio un passo indietro, e tengo un conteggio Esercizi conosciuti direttamente sul cane. È una copia. La verità vive ancora nell’Esercizio del cane; il conteggio ne è una rappresentazione, e deve restare allineato. Salesforce ci dà un modo pulito per fare esattamente questo, e lo vedremo nel modulo 6.

Ora il colpo di scena: la scuola per cani comincia ad accettare i gatti. Cosa facciamo? Un’opzione: aggiungere una tabella Gatto accanto alla tabella Cane, e un Esercizio del gatto accanto all’Esercizio del cane. Tutto raddoppia: due di ogni schermata, due di ogni report, e il giorno in cui accettano i conigli, tre. L’altra opzione: fare un passo indietro e notare che un gatto ha un proprietario, forse un allevatore, una razza, una data di nascita e, con pazienza, un esercizio o due. Gli stessi fatti e le stesse relazioni di un cane. Quindi generalizziamo: un Animale, con una Specie, cane o gatto. Anche ogni razza appartiene a una specie, ed è lì che la specie vive davvero: un Labrador è un cane. L’animale ne porta una copia, di proposito, così ogni schermata e ogni report possono partire da “cane o gatto?” senza andare a cercare la razza. Un’altra copia deliberata, e nel modulo 6 riceve un lavoro tutto suo.

Questo è progettare per il cambiamento, ed è un trade-off. Generalizza troppo presto e tutto diventa una vaga “Cosa” con un campo tipo che nessuno capisce. Io generalizzo quando il business mi porta davvero il secondo tipo, e i due condividono quasi tutto, come cani e gatti qui. Se i gatti avessero bisogno di fatti molto diversi, ci penserei due volte.

Il modello degli animali dopo i trade-off Il modello degli animali come modello dati dettagliato. Animale sta dove c'era Cane: ID dell'animale, noto anche con il numero del microchip, gli ID del proprietario, dell'allevatore e della razza, Specie (un elenco di selezione: cane o gatto), nome, data di nascita, e un conteggio Esercizi conosciuti tenuto per i report. La Razza ora è collegata (un Animale è di una Razza) e ha la propria specie, nome e taglia. L'Esercizio dell'animale, tra Animale ed Esercizio, ha il livello di abilità come elenco di selezione e la data di apprendimento; la Valutazione dell'esercizio, sotto di esso, ha la data, il livello di abilità e chi ha fatto la valutazione. Un Proprietario possiede degli Animali e un Allevatore li alleva, come prima. possiede alleva è di conosce è noto in è valutato in Proprietario ID del proprietario ID DEL RECORD Nome Telefono ZIP Città Allevatore ID dell'allevatore ID DEL RECORD Nome Città Animale ID dell'animale ID DEL RECORD Numero del microchip NOTO ANCHE COME ID del proprietario ID dell'allevatore ID della razza Specie (elenco di selezione) Nome Data di nascita Esercizi conosciuti (conteggio) Razza ID della razza ID DEL RECORD Specie (elenco di selezione) Nome Taglia Esercizio dell'animale ID dell'esercizio dell'animale ID DEL RECORD ID dell'animale ID dell'esercizio Livello di abilità (elenco di selezione) Data di apprendimento Esercizio ID dell'esercizio ID DEL RECORD Nome Difficoltà Valutazione dell'esercizio ID della valutazione dell'esercizio ID DEL RECORD ID dell'esercizio dell'animale Data Livello di abilità (elenco di selezione) Valutato da esattamente uno zero o uno uno o molti zero o molti © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Ora lo stesso tipo di scelte in Steve Trucking, dove la posta in gioco è più alta.

Il modello più pulito non è sempre il sistema migliore

Sezione intitolata “Il modello più pulito non è sempre il sistema migliore ”

Immagina una squadra a una tappa. La consegna ha i suoi articoli. L’installazione ha una checklist. Ogni passaggio richiede foto. Il Destinatario firma.

Il modello normalizzato è bellissimo: Consegna → Articolo della consegna → Checklist di installazione → Foto, ognuno al suo posto.

Poi mi siedo con le persone che lo usano davvero. Una squadra chiude una decina di tappe al giorno, nei vialetti, spesso senza segnale. Se il mio bellissimo modello le manda in un labirinto di schermate ed elenchi correlati per completare una tappa, ho un problema di architettura.

Il modello dati non è l’unica cosa che stiamo progettando.

Stiamo progettando un sistema.

È uno dei motivi per cui a volte mi allontano da un modello perfettamente normalizzato: l’esperienza utente.

Forse un concetto potrebbe tecnicamente essere un’entità a sé, ma separarlo aggiunge una complessità che porta pochissimo valore. Forse un padre con diversi livelli di figli è accademicamente pulito ma un tormento da compilare e mantenere. Forse il concetto è piccolo, stabile e usato soprattutto come selezione.

È qui che smetto di chiedermi solo “Dove sta in teoria questo fatto?” e comincio a chiedermi “Come verrà usato davvero questo sistema?”

Non significa che ogni lamentela per un clic in più appiattisca il modello. Significa che l’usabilità è un input architetturale legittimo.

La reportistica è un altro motivo frequente.

Ogni Partner retail vuole una scheda di valutazione: consegne puntuali per regione, per mese. Nel modello pulito, una consegna conosce il suo centro di distribuzione, e il CD conosce la sua regione. Tecnicamente possiamo navigare quel percorso.

Ma lo strumento di reportistica può? Possono farlo le persone che costruiscono da sé i propri report? Riescono a rispondere alla domanda senza un’architettura di reportistica più complicata della domanda stessa?

È allora che potrei copiare o derivare la regione sulla consegna, più vicino a dove viene consumata.

Ora ho introdotto una duplicazione. Quindi mi serve un’altra domanda: chi possiede la verità?

Se il valore di origine cambia, cosa succede alla mia copia? Deve cambiare? O deve conservare ciò che era vero quando è avvenuta la consegna? Sono requisiti diversi.

La denormalizzazione non elimina la complessità.

La sposta.

Ecco un esempio più piccolo che gli amministratori Salesforce incontrano di continuo. L’utente deve scegliere tra un insieme di valori. Creo un’altra entità e la collego, o uso un elenco di selezione?

Prendi lo stato di una consegna: pianificata, caricata, in consegna, in arrivo, consegnata, installata, eccezione, resa. Un elenco breve e stabile di etichette. Un elenco di selezione è esattamente ciò che voglio.

Ora prendi il tipo di tappa: solo consegna, consegna con installazione, consegna con ritiro dell’usato. Questo porta informazioni proprie: quanto dura la tappa, quali competenze servono alla squadra, quale checklist di installazione si applica. Cambia in modo indipendente, e lo gestisce il business. È un’entità, non un’etichetta.

Se creo un oggetto per ogni concetto che in teoria si potrebbe normalizzare, posso costruire un sistema tecnicamente bellissimo che nessuno ha piacere di usare. Se trasformo ogni concetto in un elenco di selezione perché è facile, posso chiudermi in un angolo molto in fretta.

Quindi mi chiedo: ha informazioni proprie? Relazioni? Cambia in modo indipendente? Deve essere gestito come dato? Il business potrebbe un giorno averne bisogno per qualcosa di più di un’etichetta?

Ecco le domande che pongo davvero in una sessione di progettazione.

C’è più di una colonna di informazioni? Se il valore ha bisogno di una descrizione, una durata, un elenco di competenze, un responsabile, non è più un’etichetta.

Quanti valori? La mia regola pratica è una ventina. Oltre i 20 valori un elenco di selezione comincia a cedere, ed è ora di pensare a un oggetto. Gli stati americani, una cinquantina, sono l’eccezione con cui conviviamo, e i paesi sono peggio; sinceramente, a qualcuno piacciono gli elenchi di selezione dei paesi? Io li trovo irritanti.

I valori vengono creati nel tempo, e da chi? Aggiungere un valore a un elenco di selezione è una modifica di configurazione, il che significa un amministratore. Se il business aggiunge valori ogni settimana, e chi li aggiunge non è un amministratore, un elenco di selezione mette un ticket davanti a ogni nuovo valore.

Le persone devono filtrare e fare report su di esso? Gli elenchi di selezione sono ottimi per questo. Le relazioni di ricerca non sono altrettanto pulite. Ogni relazione di ricerca aggiunge un salto: un tipo di report segue solo una breve catena di oggetti correlati (un tipo di report personalizzato consente al massimo quattro relazioni tra oggetti), la schermata si trasforma in elenchi correlati dentro elenchi correlati, e il codice si complica.

Un elenco di valori spesso nasce come elenco di selezione e, col tempo, si guadagna un oggetto tutto suo. Lascia che se lo guadagni.

Etichetta o entità? Lo stato e il tipo di tappa Due schede. Lo stato della consegna, un elenco di selezione: otto valori stabili, ognuno una sola parola o parole unite da un trattino (Pianificata, Caricata, In-consegna, In-arrivo, Consegnata, Installata, Eccezione, Resa), e ognuno è solo un'etichetta. Il tipo di tappa, un'entità: ventiquattro valori e in crescita, come solo consegna, consegna più installazione di una lavatrice o di una cucina a gas, consegna più ritiro dell'usato, solo ritiro dell'usato, ritiro per reso, e altri diciotto; ognuno ha la propria durata della tappa, le competenze richieste alla squadra e la checklist di installazione. Una nota sotto: oltre una ventina di valori, o con attributi propri, è un'entità, non un'etichetta. Stato della consegna un elenco di selezione I VALORI: 8, E STABILI Pianificata Caricata In-consegna In-arrivo Consegnata Installata Eccezione Resa OGNI VALORE È Solo un'etichetta Tipo di tappa un'entità I VALORI: 24, E IN CRESCITA Solo consegna Consegna + installazione: lavatrice Consegna + installazione: cucina a gas Consegna + ritiro dell'usato Solo ritiro dell'usato Ritiro per reso …e altri 18 OGNI VALORE HA I SUOI Durata della tappa Competenze richieste alla squadra Checklist di installazione Oltre una ventina di valori, o con attributi propri: è un'entità, non un'etichetta. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Un progetto che funziona benissimo con qualche migliaio di record può comportarsi in modo molto diverso con milioni.

Quindi non guardare solo il diagramma. Conosci i numeri.

Steve Trucking fa circa un milione di consegne all’anno, con una crescita del 30 per cento l’anno. Ogni consegna raccoglie circa otto aggiornamenti di stato. Sono otto milioni di record di stato quest’anno, e circa 13,5 milioni l’anno entro il terzo anno. Aggiungi quattro o cinque milioni di foto all’anno.

Stesso modello. Architettura molto diversa.

Andremo molto più a fondo in Architecting at Scale. Per ora ricorda: il volume può cambiare una decisione di modellazione dei dati. Una relazione logicamente corretta non è automaticamente il miglior progetto fisico a ogni scala.

Finora abbiamo pensato al sistema operativo. I coordinatori assegnano le consegne ai percorsi. Le squadre chiudono le tappe. Il sistema cambia mentre il business lavora.

Ma il business vuole anche analizzare anni di storico. Quali partner e regioni sono in ritardo? Come è cambiato il tempo di consegna? Quanto spesso un’installazione richiede una seconda visita?

Un sistema analitico può volere le stesse informazioni organizzate in modo diverso. Sentirai termini come data warehouse, fatto, dimensione e schema a stella. Non li sviscereremo qui; in Steve Trucking è il data warehouse Snowflake, e ci torneremo più avanti nel corso.

Per ora: consumatori diversi possono aver bisogno di forme diverse della stessa verità.

E ora c’è un altro consumatore: l’IA.

Un Destinatario scrive: “Dov’è la mia consegna?”. Un assistente IA potrebbe trovare questo:

Consegna 10427, Percorso 3312, Tappa 7, Camion 117, Fascia 13:00–15:00.

Un’applicazione tradizionale è perfettamente contenta di seguire quelle relazioni. Ma per rispondere al Destinatario, l’assistente ha bisogno di un contesto raccolto da più punti:

La tua lavastoviglie Redrock è la settima tappa del percorso di oggi dal centro di distribuzione di Phoenix. Il camion è a tre tappe da te, e sei ancora nella tua fascia 13–15.

Abbiamo preso informazioni da diverse entità correlate e costruito una rappresentazione più piatta e ricca di contesto per un consumatore specifico.

Non significa che distruggo il mio modello normalizzato. E di certo non significa “all’IA piacciono i dati piatti, quindi metti tutto in un unico oggetto gigante”. Non farlo.

La fonte di verità resta pulita. L’IA riceve una rappresentazione costruita per il lavoro che deve fare. È la stessa idea che abbiamo appena visto con le analisi:

Un’unica fonte di verità può sostenere più forme di consumo.

Andremo molto più a fondo nel grounding e nel recupero delle informazioni più avanti nel corso.

Qui c’è un pericolo.

Se copio la regione sulla consegna per la reportistica, mando una versione appiattita a Snowflake e costruisco una versione ricca di contesto per l’assistente IA, quale di queste è corretta?

Quella domanda ha bisogno di una risposta. Voglio sapere dove risiede il valore autorevole. Tutto il resto è una rappresentazione di quella verità per uno scopo.

Quel posto è il system of record (sistema di registrazione). Le copie denormalizzate possono essere utili: la schermata della tappa, la scheda di valutazione, Snowflake e il contesto dell’IA fanno ciascuno meglio il proprio lavoro con una forma costruita per loro, e consultarle va benissimo. Ma quando qualcosa cambia, la modifica parte dal system of record, di solito il modello relazionale, e si propaga verso ogni copia. Nessuno corregge la regione in Snowflake, o modifica a mano il contesto dell’IA. Correggila alla fonte, e lascia che la modifica si propaghi.

Il system of record: la modifica si propaga verso l'esterno Un riquadro in alto, il system of record, relazionale, dove partono le modifiche, con frecce che scendono verso quattro copie costruite a partire da esso: la schermata della tappa per la squadra, con una tappa tutta in una pagina; la scheda di valutazione del partner, consegne in ritardo per regione; il data warehouse Snowflake, anni di storico; e il contesto di consegna dell'IA, per “Dov'è la mia consegna?”. Una nota sotto: la modifica parte dal system of record e si propaga a ogni copia; non correggere mai una copia. Il system of record relazionale: le modifiche partono da qui Schermata della tappa una tappa, tutta in una pagina Scheda di valutazione del partner consegne in ritardo per regione Data warehouse Snowflake anni di storico Contesto di consegna dell'IA “Dov'è la mia consegna?” La modifica parte dal system of record e si propaga a ogni copia. Non correggere mai una copia. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

E conta soprattutto quando i dati cambiano. Se oggi un centro di distribuzione passa a un’altra regione, le consegne del mese scorso devono mostrare la nuova regione? Forse. Forse no. Per lo storico potrebbe servirmi la regione che era vera quando è avvenuta la consegna. Non è più un problema di sincronizzazione. È una decisione di business.

Ecco perché la denormalizzazione non dovrebbe mai avvenire per caso. Ogni fatto duplicato solleva domande su responsabilità, sincronizzazione, storico e fiducia. È il ragionamento sui trade-off del capitolo 1: sappi cosa stai comprando (una schermata più facile, un report più semplice, un contesto migliore per l’IA) e cosa stai pagando (dati duplicati, sincronizzazione, una titolarità della verità più complicata). E siccome siamo partiti da un modello logico pulito, possiamo indicare ogni copia e dire: “So che questo sta laggiù. Ne metto qui una rappresentazione per via di questo requisito.” È una decisione che possiamo rivedere, mettere in discussione e mettere per iscritto, così chi verrà dopo saprà perché.

Quando valuto una denormalizzazione, decido:

  • Dove risiede la fonte autorevole di ogni fatto di business.
  • Se il modello pulito crea problemi reali per gli utenti, la reportistica, la scala o le prestazioni.
  • Se una rappresentazione più semplice vale la duplicazione, e come la copia resta affidabile.
  • Se i valori storici debbano cambiare quando cambia la fonte attuale.
  • Se le analisi o l’IA hanno bisogno di una forma dei dati diversa da quella del sistema operativo.

Il punto di partenza non cambia mai: sappi dove sta la verità. Poi, quando i requisiti lo giustificano, dagli la forma giusta per consegnarla.

Ora Salesforce torna in scena. Trasformeremo ciò che abbiamo progettato in un modello dati fisico.