Quanto lontano dovresti andare con la normalizzazione?


30

Ho una discreta quantità di dati in un database. Ho tabelle ben formate e buone relazioni tra loro con una certa ridondanza nei miei dati. Ma quanto lontano dovrei andare con la normalizzazione? Ci sono svantaggi delle prestazioni a troppa normalizzazione?

Risposte:


37

Dovresti andare fino in fondo e non oltre. Ovviamente. ~ Il problema potrebbe essere che questo è un po 'un'arte, ed è per questo che questa non è una scienza pura.

Il nostro prodotto principale è un sistema di analisi e rendicontazione, e quindi a tale riguardo, disponiamo di alcuni record di dettagli. Inizialmente l'abbiamo progettato con molti join su un ID comune per alcuni dei record figlio, ma abbiamo scoperto che se avessimo denormalizzato un paio di campi avremmo potuto tagliare MOLTI join e potremmo eliminare molti mal di testa nelle prestazioni.

Ma lo sapevamo solo perché 1) abbiamo creato un design "normalizzato", 2) abbiamo iniziato a usarlo, 3) abbiamo profilato le prestazioni effettive dopo centinaia di milioni di righe su dozzine di tabelle.

La storia finale è che fino alla profilazione non potevamo sapere con certezza cosa avrebbe funzionato per noi. Ci è piaciuta l'idea di normalizzare in modo da poter aggiornare più facilmente, ma alla fine le prestazioni effettive sono state il fattore decisivo. Questo è il mio consiglio per te: profilo, profilo, profilo.


4
l'arte e non una scienza mi presta a credere che sia voodoo. Qualche riferimento?
Abel

3
@Abel che ne dici del mio aneddoto in generale? Un profiler può essere in grado di suggerire regole per la denormalizzazione, ma tali regole provengono da un programmatore per esperienza. Tutta la programmazione è un'arte. Troverò qualcuno più famoso che ha detto la stessa cosa quando arrivo a una tastiera completa più tardi.
jcolebrand

1
@Abel oh bene allora tutto in ('forgiven','pardoned');): p
jcolebrand

2
@Fergus felice che ti sia piaciuto. Ho sempre trovato che gli aneddoti funzionano meglio.
jcolebrand

2
@abel - "Un'arte è una scienza con più di 7 gradi di libertà". Al di là di un certo livello di complessità, approcci esaurienti a un problema diventano impossibili. A quel punto gli approcci euristici basati sull'esperienza sono i più efficaci. Purtroppo, nel campo dell'informatica quel livello di complessità è abbastanza facile da ottenere su qualsiasi cosa tranne che su sistemi software banali.
ConcernedOfTunbridgeWells l'

10

La normalizzazione è un obiettivo solo quando supporta il tuo modello di dati abbastanza bene da giustificarlo. È pensato per essere una guida per consentire crescita, gestione e manutenibilità. Ricorda che il libro sulla normalizzazione, né i suoi autori costruiranno o manterranno il tuo database o la sua applicazione.

Una buona lettura sul tema della "troppa normalizzazione" è qui.

E sì, ci possono essere impatti sulle prestazioni a troppa normalizzazione. Questo sarebbe in un attraversamento più profondo della tabella per raccogliere cose come le tabelle degli indicatori di stato quando sono state estratte in una tabella separata. Alcuni diranno che questo è di solito negato nella velocità di aggiornamento (cambiando il testo dello stato da "Buono" a "BUONO" o qualcosa di simile) o nella manutenibilità.


2
Ecco un'altra buona lettura sull'argomento e molto più divertente qntm.org/gay
jcolebrand

5

Consiglio di leggere la seguente appendice trovata in alcuni dei libri più recenti di Chris Date :

Due applausi per la normalizzazione

La normalizzazione è lungi dall'essere una panacea, come possiamo facilmente vedere considerando quali sono i suoi obiettivi e quanto bene si confronta con loro ...

Devo chiarire che non voglio che i miei commenti in questa sezione vengano visti come un qualsiasi tipo di attacco. Credo fermamente che qualcosa di meno di un design completamente normalizzato sia fortemente controindicato ...


2

Penso che sia altrettanto importante esaminare le denormalizzazioni esplicite aggiunte, i valori aggregati aggiunti o alcuni campi da una tabella principale copiati in una copia di dettaglio.

L'argomento è principalmente un argomento di prestazione.

In tal caso, i campi vengono aggiornati dai trigger e spetta al database mantenerli coerenti.


2

Sono totalmente d'accordo con @jcolebrand. Quando si progetta un modello per l'applicazione, è necessario normalizzare tutto ciò che è possibile. Ma poi dovresti profilare le query costruite sul tuo modello, specialmente quelle eseguite frequentemente.

Esperienza personale: gli attributi che sono stati raggiunti da due join (il che significa che tre tabelle sono state unite) saranno principalmente un vantaggio per le prestazioni. E per peggiorare le cose, viene utilizzato nelle transazioni online. Denormalizzo l'attributo, quindi ho solo bisogno di un join e ho chiesto al programmatore di modificare la propria app per la query e l'aggiornamento dell'attributo. Ora funziona molto meglio ...

In altre parole, dovresti bilanciare la normalizzazione con le prestazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.