Quando dovresti denormalizzare?


45

Penso che tutti abbiamo familiarità con la normalizzazione del database .

La mia domanda è: quali sono alcune linee guida che usi quando vuoi denormalizzare le tabelle?


3
I siti StackExchange hanno un vantaggio unico rispetto ad altri siti su Internet in quanto 1) consentono alle risposte migliori di diventare le più facilmente reperibili e 2) le risposte migliori sono determinate dalla community. Per questo motivo, credo che questo sito e Internet trarrebbero beneficio da questa domanda, nonostante sia in qualche modo contrario alla domanda frequente .
Richard,


1
Possibili informazioni duplicate / correlate Quando denormalizzare la progettazione del database
John Sansom,

Risposte:


34

Denormalizza quando si tratta di operazioni OLAP, normalizza quando OLTP (dall'articolo collegato nella sezione Denormalizzazione)

I database destinati all'elaborazione delle transazioni online (OLTP) sono in genere più normalizzati rispetto ai database destinati all'elaborazione analitica online (OLAP). Le applicazioni OLTP sono caratterizzate da un elevato volume di piccole transazioni come l'aggiornamento di un record di vendite presso una cassa di un supermercato. L'aspettativa è che ogni transazione lasci il database in uno stato coerente. Al contrario, i database destinati alle operazioni OLAP sono principalmente database "letti principalmente". Le applicazioni OLAP tendono ad estrarre dati storici che si sono accumulati per un lungo periodo di tempo. Per tali database, i dati ridondanti o "denormalizzati" possono facilitare le applicazioni di business intelligence. In particolare, le tabelle dimensionali in uno schema a stella spesso contengono dati denormalizzati. I dati denormalizzati o ridondanti devono essere attentamente controllati durante l'elaborazione di estrazione, trasformazione, caricamento (ETL) e agli utenti non dovrebbe essere consentito di vedere i dati fino a quando non si trovano in uno stato coerente. L'alternativa normalizzata allo schema a stella è lo schema a fiocco di neve. In molti casi, la necessità di denormalizzazione è diminuita man mano che i computer e il software RDBMS sono diventati più potenti, ma poiché i volumi di dati sono generalmente aumentati insieme alle prestazioni hardware e software, i database OLAP spesso utilizzano ancora schemi denormalizzati.

La denormalizzazione viene anche utilizzata per migliorare le prestazioni su computer più piccoli come nei registratori di cassa informatici e sui dispositivi mobili, poiché questi possono utilizzare i dati solo per la ricerca (ad es. Ricerche di prezzo). La denormalizzazione può essere utilizzata anche quando non esiste un RDBMS per una piattaforma (come Palm), oppure non è necessario apportare modifiche ai dati e una risposta rapida è fondamentale.


4
Denormalizzo quando creo report o analisi e voglio risultati rapidi. Tutti gli indici del mondo con più join non sono mai così veloci come una tabella denormalizzata che rappresenta i dati memorizzati nella cache che non cambieranno.
kevinsky,

Succinto e molto utile. Ho lavorato alla periferia di DBA e questo mi aiuta a portare molte cose al punto di partenza.
Jason P Sallinger,

Molte applicazioni hanno requisiti sia OLAP che OLTP, quindi ogni sviluppatore di back-end dovrebbe imparare a mescolarli entrambi e a mantenere aggiornati i dati denormalizzati.
JustAMartin,

22

Normalizza fino a quando non fa male, denormalizza fino a quando non funziona (ovvero: le prestazioni diventano accettabili) :)


5
Questa probabilmente non è la risposta migliore, ma è una delle migliori battute che ho visto su Stack Overflow :)
Owen,

15

Un motivo potenzialmente sensato per applicare la denormalizzazione controllata è se consente di applicare un vincolo di integrità ai dati che altrimenti non sarebbe possibile. La maggior parte dei DBMS SQL ha un supporto estremamente limitato per i vincoli multi-tabella. In SQL a volte l'unico modo efficace per implementare determinati vincoli è garantire che gli attributi coinvolti nel vincolo siano tutti presenti nella stessa tabella, anche quando la normalizzazione impone che appartengano a tabelle separate.

Denormalizzazione controllata significa che vengono implementati meccanismi per garantire che non possano sorgere incoerenze a causa di dati ridondanti. Il costo di questi controlli extra e il rischio di dati incoerenti devono essere considerati quando si decide se la denormalizzazione è utile.

Un altro motivo comune per la denormalizzazione è consentire alcune modifiche alle strutture di archiviazione o consentire altre ottimizzazioni fisiche che il DBMS non consentirebbe altrimenti. Secondo il principio di indipendenza dei dati fisici, un DBMS dovrebbe disporre dei mezzi per configurare le strutture di archiviazione interne senza alterare inutilmente la rappresentazione logica dei dati nel database. Sfortunatamente molti DBMS sono molto restrittivi delle opzioni di implementazione fisica disponibili per ogni dato schema di database. Tendono a compromettere l'indipendenza fisica del database supportando solo un'implementazione non ottimale del modello logico desiderato.

Dovrebbe essere ovvio, ma deve ancora essere detto: in ogni caso sono solo i cambiamenti nelle funzionalità di implementazione fisica che possono dettare le prestazioni, come strutture interne di dati, file, indicizzazione, hardware e così via. La normalizzazione e la denormalizzazione non hanno nulla a che fare con l'ottimizzazione delle prestazioni o dell'archiviazione.


4

Denormalizza se accedi frequentemente ai dati calcolati, come suggerito nelle risposte a questa domanda . Il costo per l'archiviazione e la gestione dei dati calcolati sarà spesso inferiore al costo di ripeterli ripetutamente se il profilo di carico è pesante.


Si noti che ciò è particolarmente utile se la denormalizzazione è semplicemente memorizzare nella cache i valori. In modo che vi sia ancora una raccolta normalizzata sottostante di tabelle / campi. Cioè, per ogni valore, dovrebbe esserci una singola cella "master" che contiene quel valore - altri valori sono noti per essere semplicemente copie o calcoli da quel master - e se non ci sono dei forti benefici nel fare diversamente, mantenere tutte le celle master nelle relazioni normalizzate.
ToolmakerSteve

3

Denormalizzo sistematicamente in modo da poter applicare l'integrità dei dati con vincoli. Un esempio è una domanda recente su questo sito : replica una colonna in un'altra tabella, in modo da poter utilizzare un vincolo CHECK per confrontarlo con un'altra colonna. Un altro esempio di questa tecnica è il mio post sul blog .

Non è possibile utilizzare i vincoli CHECK per confrontare colonne in righe diverse o in tabelle diverse, a meno che non si avvolga tale funzionalità in UDF scalari invocati da un vincolo CHECK. Che cosa succede se devi effettivamente confrontare colonne in righe diverse o in tabelle diverse per applicare una regola aziendale? Ad esempio, supponiamo che tu conosca l'orario di lavoro di un medico e desideri assicurarti che tutti gli appuntamenti rientrino nell'orario di lavoro? Naturalmente, è possibile utilizzare un trigger o una procedura memorizzata per implementare questa regola aziendale, ma né un trigger né una procedura memorizzata possono garantire al 100% che tutti i dati siano puliti: qualcuno può disabilitare o rilasciare il trigger, inserire alcuni dati sporchi e riattivare o ricreare il trigger. Inoltre, qualcuno può modificare direttamente la tabella ignorando le stored procedure.

Consentitemi di dimostrare come implementare questa regola aziendale utilizzando solo i vincoli FK e CHECK - ciò garantirà che tutti i dati soddisfino la regola aziendale purché tutti i vincoli siano attendibili.

Ancora un altro esempio è un modo per far rispettare che i periodi di tempo non hanno lacune e sovrapposizioni .


1
"Denormalizzo sistematicamente in modo da poter applicare l'integrità dei dati con vincoli." Anch'io. È un grande compromesso: denormalizzi un po 'ma guadagni DRI .
Nick Chammas,

@NickChammas - questo è molto interessante. Puoi condividere scenari quando fai queste cose?
AK,

1
Certamente. Abbiamo un sistema di evasione che include una coda di articoli da soddisfare. C'è una Fulfillabletabella con tutti i dettagli su ogni elemento soddisfacente e quindi c'è una FulfillableQueuetabella che implementa la coda in SQL Server . Solo i Gestibili con un determinato StateIDpossono essere in coda. StateIDè nella Fulfillabletabella, ma lo replica FulfillableQueuee quindi imposto questo vincolo con FOREIGN KEYe CHECKvincoli.
Nick Chammas,
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.