Domanda

scusate se il titolo non è molto chiaro.Cercherò di spiegare ora:

Ho due tabelle:tabella A e tabella B.La relazione tra di loro è una (per Un tavolo) per molti (per la tabella B).Quindi, qualcosa di simile a un master-detail situazione.Ho una colonna "Quantità" nella tabella B, che è ovviamente decimale e una colonna 'TotalAmount' nella tabella A.Sto cercando ti capire come mantenere il valore in tabella Un aggiornato.Il mio suggerimento è di fare una visualizzazione basata su Una tabella con una query di aggregazione contare gli Importi della tabella B.Naturalmente con il corretto indici ...Ma, il mio compagno di squadra suggeriscono di aggiornare il valore nella tabella a ogni volta che si cambia qualcosa nella tabella B dalla nostra applicazione.Mi chiedo, quale sarà la soluzione migliore qui?Potrebbe essere una terza variante?

Alcuni chiarimenti ...Ci aspettavamo questa tabelle di essere la più rapida crescita tabelle nel nostro database.E La tabella B crescerà molto più velocemente tabella A.Il più frequente operazione nella tabella B verrà inserita ...e quasi niente altro.Il più frequente operazione nella tabella A, verrà selezionare ...ma non solo.

È stato utile?

Soluzione

Vedo una serie di opzioni:

  1. Utilizzare un trigger insert nella tabella B e fare l'aggiornamento della tabella di Un vostro amico, suggerisce.Ciò manterrà la tabella B, il più aggiornato possibile.
  2. Avere un lavoro programmato che aggiorna la tabella per ogni x minuti (x = qualsiasi senso per la tua applicazione).
  3. Quando si aggiorna la tabella B, fare un aggiornamento nella tabella A nella logica dell'applicazione.Questo potrebbe non funzionare se si aggiorna la tabella B in molti luoghi.

Altri suggerimenti

Se si dispone di un singolo posto nella vostra app in cui è possibile inserire nuove righe alla tabella B, quindi la soluzione più semplice è quello di inviare un UPDATE A set TotalAmount=TotalAmount + ? where ID = ? e passare i valori che hai appena usato per inserire in B.Assicurarsi di avvolgere entrambe le query (l'inserimento e l'aggiornamento) in una transazione, in modo da risultare sia succedere, o nessuno.

Se questo non è semplice, allora la vostra opzione successiva è un trigger di database.Leggere i documenti per il tuo database come crearli.Fondamentalmente un trigger è un piccolo pezzo di codice che viene eseguito quando succede qualcosa in DB (nel tuo caso, quando qualcuno inserisce i dati nella tabella B).

La vista è un'altra opzione, ma può causare problemi di prestazioni durante seleziona il quale potrete trovare difficile da risolvere.Provate una vista materializzata" o una "colonna calcolata" invece (ma questi possono causare problemi di prestazioni quando si inserisce/rimuovi colonne).

Se questo valore è destinata a cambiare molto, è meglio utilizzare una visualizzazione:È sicuramente più sicuro di attuazione.Ma ancora meglio sarebbe l'utilizzo di trigger (se il database supporta.)

Credo che il tuo compagno suggerisce di aggiornare il valore di ogni inserto perché pensa che è necessario il valore abbastanza spesso e potrebbe portare ad un rallentamento ricalcolando il valore di ogni tempo.Se questo è il caso:

  • Il database dovrebbe prendere cura di caching, quindi questo probabilmente non sarà un problema.
  • Se, tuttavia, è possibile aggiungere funzionalità in una fase successiva, in questo modo è possibile verificare il funzionamento dell'applicazione in caso contrario, avrà una molto più facile il tempo di debug che la colonna di cache.

Mi sarebbe sicuramente consigliamo di utilizzare un trigger utilizzando la logica dell'applicazione, che assicura che il database che mantiene il valore di up-to-date, piuttosto che fare affidamento su tutti i chiamanti.Tuttavia, da un punto di vista, vorrei diffidare di memorizzazione di dati generati nella stessa tabella non di dati generata: credo che sia importante mantenere una netta separazione, in modo che la gente non confondersi tra i dati che devono essere conservate e che sarà mantenuto per loro.

Tuttavia, in generale, preferiscono vista trigger -- in questo modo non si deve preoccuparsi di mantenere il valore.Profilo per determinare se le prestazioni sono un problema.In Postgres, credo che si potrebbe anche creare un indice su valori calcolati, in modo che il database non guardare la tabella di dettaglio.

Il terzo modo, il ricalcolo periodicamente, sarà molto più lento di trigger e probabilmente più lento di vista.Che non è appropriato per il vostro uso, comunque, è la ciliegina sulla torta :).

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