I imagine that de-normalizing too much would waste space and time
Lo spazio non deve preoccuparsi della maggior parte delle applicazioni OLTP Line of Business di medie dimensioni. Quindi lascia lo spazio da parte. Tempo e presumendo che tu intenda le prestazioni della query, è qualcosa che di solito può essere migliorato e non causa un problema reale a meno che tu non abbia una progettazione errata, risorse insufficienti, un database estremamente grande, un numero molto elevato di transazioni o tutte quanto sopra. La maggior parte delle applicazioni che utilizzano i database di oggi raramente presentano problemi di prestazioni solo perché il database è normalizzato.
giant blobs are duplicated or it because harder to maintain consistency because you have to update multiple fields using a transaction.
Normalizzare il tuo database ti assicura che la progettazione sarà:
-
Non disponi di dati ridondanti.
-
Non causa la creazione di un enorme numero di enterite di log (ad esempio, con una tabella di 2 milioni di clienti: UPDATE Customer Set Country="USA" WHERE Country="US")
-
Essere supportati completamente da query SQL. Questo punto è molto importante.
-
Troverà un codice di applicazione pulito.
-
Forza un alto grado di coerenza dei dati tramite il database senza appesantire l'applicazione.
-
Condividi le regole aziendali definite nel database da diverse applicazioni senza codificare lo stesso codice in diverse applicazioni.
Detto questo, la normalizzazione produce una struttura ottimale per tutte le colonne e le tabelle. Questo potrebbe non essere sempre necessario nella tua particolare applicazione, quindi potresti determinare, dato che hai compreso il tuo dominio e la tua applicazione, per de-normalizzare alcune delle tabelle / colonne come un compromesso per la velocità. Tuttavia, sarebbe una decisione consapevole piuttosto che una supervisione.
Given a 3NF FD set, and a set of queries, how do I predict the speedup/slowdown of de-normalization?
Non è possibile prevedere con precisione le prestazioni senza test (cosa che si può fare prima di scrivere il codice dell'applicazione). Tuttavia, è possibile eliminare e rilevare i fattori che potrebbero causare prestazioni errate in base alla progettazione. Ad esempio, è possibile identificare quale strategia di indice utilizzare come segue (potrebbero esistere altre tecniche):
-
Crea una matrice di query e colonne interessate da tali query.
-
Trova le colonne più utilizzate.
-
Considera la possibilità di creare indici su tali colonne.
Questo è principalmente un lavoro in cui il tuo DBA potrebbe aiutarti. C'è più prestazioni rispetto alla normalizzazione. Ci sono aspetti della distribuzione dei dati su volumi del disco, divisione verticale della tabella, partizionamento, tipi di indice e buffering dell'indice per nominarne alcuni. Tutte queste tecniche dovrebbero essere trattate nei libri e nella documentazione del fornitore in "Database Design" e "Database Performance Tuning". Tutte le discussioni precedenti presuppongono che l'applicazione sia un'applicazione OLTP.