[DB] Perché denormalizzare una basedati?

Prima di parlare della denormalizzazione di una basedati, ricordiamo cos’è la sua normalizzazione: è il procedimento che ha come conseguenza la riduzione della ridondanza all’interno del database, e che quindi consente un risparmio in termini di spazio occupato. Tale operazione andrebbe eseguita in fase di progettazione, riuscendo quindi subito ad identificare i dati raggruppabili in tabelle separate da mettere in relazione. Effettuare subito questo procedimento porta anche ad una migliore comprensione del database e dei legami che intercorrono tra le varie tabelle.

Ci sono tre diverse forme di normalizzazione (dette forme normali di Boyce e Codd):

  • la 1° Forma Normale (1NF) consiste nel fare in modo di non presentare gruppi di attributi che si ripetono (ossia ciascun attributo è definito su un dominio con valori atomici) e nel far esistere una chiave primaria per ciascuna relazione (ossia esiste un insieme di attributi, che identifica in modo univoco ogni tupla della relazione)
  • una volta portato il database alla 1° Forma Normale, dobbiamo portarlo alla 2° Forma Normale (2NF), ossia per ogni relazione tutti i campi non chiave dipendono funzionalmente dall’intera chiave composta e non da una parte di essa.
  • la 3° Forma Normale (3NF) si ha quando la relazione è, innanzitutto, in 2° forma normale e tutti gli attributi non-chiave dipendono dalla chiave soltanto, ossia non esistono attributi che dipendono da altri attributi non-chiave.

Per definizione, una relazione R è in forma normale di Boyce e Codd (BCNF) se e solo se è in 3NF e, per ogni dipendenza funzionale non banale X –> Y,  dove X è una superchiave per R.

In questo modo si riducono ulteriormente sia la ridondanza dei dati nelle tabelle che la possibilità di errori umani in fase di inserimento dei dati.

La denormalizzazione, invece, è il processo che permette di ottimizzare le performance in lettura di un database aggiungendo ridondanza nei dati o raggruppandoli. Tale operazione viene effettuata spesso per risolvere l’inefficienza dei database relazionali, visto che, se normalizzati, possono soffrire di pesantezza nel caricamento dei dati.

Quando si valuta la normalizzazione tra le alternative di progettazione di una basedati, è utile tenere presente le diverse tecniche che consentono di denormalizzare intenzionalmente un database. La denormalizzazione intenzionale dei dati può essere motivata dal rilevamento di problemi di prestazioni oppure nel caso in cui si desideri semplificare la creazione di report ad-hoc. I problemi di prestazioni derivano dalle query per le quali, in produzione, è richiesto un numero troppo elevato di join di tabelle con un accesso intensivo al disco. Lo scopo della creazione di report ad-hoc è consentire anche agli utenti finali di eseguire query non strutturate, in quanto è possibile che utenti finali poco esperti non siano certi delle procedure necessarie per ottenere informazioni da più tabelle correlate.

Continua la lettura

Creative Commons License
This work by Francesco Ficetola is licensed under a Creative Commons Attribution 4.0 International License.
Based on a work at www.francescoficetola.it.
Permissions beyond the scope of this license may be available at http://www.francescoficetola.it/2012/06/07/db-perche-denormalizzare-una-basedati/.