Un report può essere costruito con la tecnica migliore e restituire comunque numeri sbagliati, se i dati di partenza sono sbagliati. La qualità dei dati è spesso trattata come un problema vago, «i dati sono sporchi», che nessuno sa da dove affrontare. Diventa invece gestibile quando la si scompone in dimensioni precise, ciascuna misurabile con un controllo concreto.
Le sei dimensioni
Completezza
I dati che dovrebbero esserci, ci sono? Un'anagrafica clienti in cui il 40% dei record non ha l'email è incompleta per qualunque attività che preveda comunicazioni via email, anche se ogni singolo record è corretto.
SELECT
COUNT(*) AS totale,
COUNT(email) AS con_email,
ROUND(100.0 * COUNT(email) / COUNT(*), 1) AS percentuale
FROM clienti;
La completezza va valutata rispetto all'uso: un numero di fax mancante non è un problema, un codice di spedizione mancante sì.
Validità
I valori rispettano il formato e le regole previste? Un CAP italiano ha cinque cifre, una percentuale sta tra 0 e 100, una data di nascita non è nel futuro.
SELECT id, cap FROM clienti
WHERE cap IS NOT NULL AND cap NOT SIMILAR TO '[0-9]{5}';
SELECT id, data_nascita FROM clienti
WHERE data_nascita > CURRENT_DATE;
La sintassi delle espressioni regolari varia tra i database, ma il principio è lo stesso: si cercano i valori che violano la regola.
Unicità
Ogni entità del mondo reale compare una sola volta? Lo stesso cliente registrato due volte con due codici diversi fa sembrare i clienti più numerosi e divide la sua storia di acquisti in due.
SELECT LOWER(TRIM(email)) AS email_norm, COUNT(*)
FROM clienti
GROUP BY LOWER(TRIM(email))
HAVING COUNT(*) > 1;
Normalizzare il valore prima del confronto, togliendo spazi e maiuscole, fa emergere duplicati che un confronto esatto non vedrebbe.
Coerenza
Dati collegati concordano tra loro? Un ordine non dovrebbe fare riferimento a un cliente inesistente, una data di consegna non dovrebbe precedere la data dell'ordine, il totale della fattura dovrebbe essere uguale alla somma delle righe.
SELECT f.id, f.totale, SUM(r.importo) AS somma_righe
FROM fatture f
JOIN righe_fattura r ON r.id_fattura = f.id
GROUP BY f.id, f.totale
HAVING f.totale <> SUM(r.importo);
Accuratezza
I dati corrispondono alla realtà? È la dimensione più difficile, perché un valore può essere valido, completo e unico, ma sbagliato: un indirizzo esistente che però non è più quello del cliente. L'accuratezza si verifica confrontando con una fonte di riferimento: un controllo a campione, una conferma da parte del cliente, un confronto con un registro ufficiale.
Tempestività
I dati sono abbastanza aggiornati per l'uso che se ne fa? Le giacenze di magazzino aggiornate una volta a settimana non bastano a un negozio online che vende in tempo reale.
SELECT MAX(aggiornato_il) AS ultimo_aggiornamento FROM giacenze;
Un controllo semplice ma utilissimo è verificare che l'ultimo caricamento sia avvenuto entro il tempo previsto: un flusso di dati che si è fermato in silenzio è uno dei problemi più frequenti.
Dalla misura alla prevenzione
Misurare è il primo passo, ma correggere a valle all'infinito è costoso. La regola generale è intervenire il più vicino possibile al punto in cui il dato nasce.
| Dimensione | Prevenzione alla fonte |
|---|---|
| Completezza | Colonne NOT NULL, campi obbligatori nei moduli |
| Validità | Tipi di dato corretti, vincoli CHECK, menu a tendina invece di testo libero |
| Unicità | Vincoli UNIQUE su valori normalizzati, ricerca del cliente prima della creazione |
| Coerenza | Chiavi esterne, calcolo dei totali da parte del sistema e non a mano |
| Accuratezza | Conferma dei dati da parte dell'interessato, verifica degli indirizzi |
| Tempestività | Avvisi automatici quando un caricamento non arriva |
Costruire un piccolo sistema di controlli
Non serve un software dedicato per iniziare. Un metodo pratico:
- Scegliere le tabelle critiche, quelle su cui si basano decisioni, fatture o comunicazioni.
- Scrivere una query per ogni regola, che restituisca le righe che la violano. Una query che restituisce zero righe è un controllo superato.
- Eseguire i controlli in automatico, per esempio ogni notte, salvando in una tabella la data, il nome del controllo e il numero di righe non conformi.
- Osservare l'andamento: un numero che cresce all'improvviso segnala un cambiamento a monte, come un nuovo modulo o un'importazione difettosa.
- Assegnare un responsabile per ogni controllo: un problema che riguarda tutti finisce per non essere risolto da nessuno.
Nel mio lavoro ho visto che le regole più utili sono quasi sempre quelle suggerite da chi usa i dati ogni giorno: sanno benissimo quali errori ricorrono, anche se non li hanno mai scritti.
In sintesi
- La qualità dei dati si scompone in completezza, validità, unicità, coerenza, accuratezza e tempestività.
- Ogni dimensione si misura con query concrete che cercano le righe non conformi.
- L'accuratezza richiede un confronto con la realtà, non solo con le regole.
- La prevenzione alla fonte, con vincoli e moduli ben fatti, costa meno della correzione.
- Controlli automatici con storico e responsabili trasformano il problema in un processo.