La denormalizzazione è un approccio per accelerare le prestazioni di recupero dei dati in lettura in un database relazionale, dove l’amministratore del database aggiunge selettivamente istanze specifiche di dati ridondanti dopo che la struttura dei dati è stata normalizzata. Un database denormalizzato non dovrebbe essere confuso con un database che non è mai stato normalizzato.
Utilizzando la normalizzazione in SQL, un database memorizza tipi di dati diversi ma correlati in tabelle logiche separate, chiamate relazioni. Quando una query combina dati da più tabelle in una singola tabella dei risultati, si chiama join. Le prestazioni di tali join di fronte a query complesse sono spesso l’occasione per l’amministratore di esplorare l’alternativa della denormalizzazione.
Normalizzazione vs. denormalizzazione
Molteplici join nella stessa query possono avere un impatto negativo sulle prestazioni. Man mano che il numero di tabelle generate dal progetto aumenta, la complessità delle join può creare un overhead di calcolo inaccettabile. Le giunzioni possono essere ad alta intensità di I/O, e l’esecuzione della query correlata può consumare una quantità smodata di tempo, a volte persino mandare in crash le applicazioni.
Con la denormalizzazione del database, i progettisti di dati cuciono insieme tabelle disparate. Questo avviene a spese di una serie di ridondanze di dati, ma può essere utile per ridurre il numero di join, e quindi velocizzare le operazioni. Il compromesso per il progettista di database sta nel creare sistemi di database che hanno meno tabelle grandi o più tabelle piccole, in base alle risorse e ai requisiti di interattività delle query. Il progettista deve anche soppesare questo contro i problemi di ridondanza dei dati, specialmente la possibilità di aumentare l’incoerenza dei dati.
Dopo che i dati sono stati duplicati, il progettista di database deve prendere in considerazione come saranno mantenute le istanze multiple dei dati. Un modo per denormalizzare un database è permettere al sistema di gestione del database di memorizzare i dati ridondanti su disco. Questo ha l’ulteriore vantaggio di assicurare la coerenza delle copie ridondanti. Dato che i costi del disco sono diminuiti nel corso degli anni, questi approcci sono cresciuti in popolarità. I produttori di database relazionali hanno migliorato i database per assicurare una migliore coerenza quando viene impiegata la denormalizzazione.
Design dei dati logici
Uno degli approcci alla denormalizzazione è quello di denormalizzare l’attuale design dei dati logici. Questo può portare rapidamente a dati incoerenti. Le regole chiamate vincoli possono essere usate per specificare come le copie ridondanti di informazioni sono sincronizzate, ma aumentano la complessità del design del database e corrono anche il rischio di avere un impatto sulle prestazioni di scrittura.
Casi comuni in cui la denormalizzazione può essere efficacemente usata includono tabelle pre-congiunte che raggruppano i dati per usi comuni, tabelle divise su misura per specifici gruppi di utenti e tabelle combinate che consolidano le relazioni uno-a-uno e uno-a-molti.
Denormalizzazione in data warehousing e NoSQL
Nei data warehouse relazionali, la denormalizzazione gioca spesso un ruolo importante. Questo è particolarmente vero nei database dimensionali come prescritto dall’influente architetto e autore di data warehouse Ralph Kimball. La sua enfasi sulle strutture dimensionali che usano la denormalizzazione è intesa a velocizzare l’esecuzione delle query, che può essere particolarmente importante nei magazzini di dati usati per la business intelligence. La denormalizzazione aiuta gli amministratori di data warehouse a garantire prestazioni più prevedibili.
Esempi di denormalizzazione vanno oltre la denormalizzazione in SQL. Un tipo di denormalizzazione ha anche un uso al di fuori dei database relazionali. La tecnica è spesso impiegata in applicazioni basate su database NoSQL, in particolare database NoSQL orientati ai documenti. Tali database sono spesso alla base di architetture di gestione dei contenuti per pagine di profili web che beneficiano di ottimizzazioni di lettura. L’obiettivo della denormalizzazione in questo contesto è quello di ridurre la quantità di tempo necessaria per assemblare le pagine che comprendono dati di profilo disparati. In questi casi, mantenere la coerenza dei dati diventa il lavoro dell’applicazione e, a sua volta, dello sviluppatore dell’applicazione.