Domanda

Spesso ho a che fare con aggregati o entità padre che hanno attributi derivati dal loro costituenti, o figli di soci.Per esempio:

  • Il byte_count e packet_count di un TcpConnection oggetto viene calcolato dalla gli stessi attributi dei suoi due costituenti TcpStream gli oggetti, che a loro volta sono calcolate dal costituente TcpPacket oggetti.

  • Un Invoices oggetto potrebbe avere un total che in pratica è la SOMMA() del suo costituente InvoiceLineItems'i prezzi, con un po' di merci, sconto e fiscali la logica del linguaggio.

Quando ha a che fare con milioni di pacchetti o milioni di fatturato voci (lo spero!), su richiesta di calcolo di questi attributi derivati -- in VISTA o, più comunemente, in una logica di presentazione, come le relazioni o interfacce web-è spesso troppo lento.

Come si fa a decidere, prima di problemi di prestazioni di forzare la mano, se per "promuovere" gli attributi derivati di pre-calcolate campi?

È stato utile?

Soluzione

Io personalmente non utilizzo della denormalizzazione fino a compromessi in termini di prestazioni forza la mia mano (perché il rovescio della medaglia di denormalizations sono troppo drastiche IMHO), ma si potrebbe anche prendere in considerazione:

  1. Convenienza:ad es.se due diverse applicazioni client desidera calcolare gli stessi attributi derivati, entrambi hanno a che codice della query per eseguire i calcoli.La denormalizzazione offre entrambe le applicazioni client, l'attributo derivato in un modo più semplice.
  2. La stabilità nel tempo:ad es.se la formula per il calcolo di un attributo derivato è mutevole, la denormalizzazione consente di catturare e memorizzare il valore calcolato in un punto nel tempo in modo calcoli futuro non sarà mai sbagliata
  3. Più semplice query:aggiungere complessità al DB struttura può significare la query Select è più semplice, e presso il cliente finale.
  4. Prestazioni:Selezionare query su denormalizzato dati può essere più veloce.

Rif: Il Programmatore Di Database:L'Argomento per la denormalizzazione.Assicurarsi di leggere il suo articolo su Talmente Semplice Mantenere Aggiornati I Denormalizzato Valori Corretti - la sua raccomandazione è di utilizzare i trigger.Che porta a casa il tipo di trade-off la denormalizzazione richiede.

Altri suggerimenti

Sostanzialmente, non si.Hai lasciato riguardanti le prestazioni di forzare la mano.

Che è la risposta migliore, perché il 99% del tempo, si dovrebbe non essere pre-ottimizzazione come questa, è meglio calc on the fly.

Tuttavia, è abbastanza comune per cliente-gli sviluppatori di applicazioni per venire al server-side sbagliati preconcetti come "su richiesta di calcolo di ...attributi derivati...-- è spesso lentezza inaccettabile"e questo semplicemente NON È vero.La corretta formulazione qui sarebbe "è raramente lentezza inaccettabile".

Come tale, a meno che non sono un esperto in questo (un DB di Sviluppo, Architetto, etc.), si dovrebbe non essere coinvolto in precoce di ottimizzazione.Attendere fino a quando è ovvio che deve essere fissato, quindi guardate pre-aggregazione.

Come corrente, i dati devono essere determina come viene implementata, davvero.

Assumo 2 semplici stati:corrente o non corrente.

  • Corrente:indicizzate viste, trigger, stored procedure per mantenere le tabelle di aggregazione ecc
  • Non corrente:Servizio di segnalazione di istantanee, di registro per la spedizione e la replica dei dati di magazzino ecc

Detto questo, vorrei sviluppare contro la stessa quantità di dati che ho in prod quindi ho un po ' di fiducia nel tempo di risposta.Raramente essere sorpreso dal tuo codice di prestazioni...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top