Quali sono i vantaggi e gli svantaggi dell'archiviazione del numero di commenti in una colonna di numeri interi rispetto al calcolo al volo?

3

Prendiamo la pagina CodeReview come esempio. Se vai qui , vedrai l'elenco delle domande con i loro numeri di voto e i numeri dei commenti

Ora mi chiedo se questi numeri siano calcolati al volo (ad esempio contiamo i commenti totali in db per questa domanda), oppure c'è un campo effettivo nella tabella questions chiamata voteCount ed è incrementato di uno quando qualcuno vota per questa domanda?

Solo un'altra domanda. Sia VoteCount che CommentCount sono solo numeri interi, e le informazioni utente visualizzate per ogni domanda?

Spero che questo sia il posto giusto per porre questa domanda.

    
posta Optimus 11.01.2012 - 23:33
fonte

1 risposta

3

Dipende molto dal traffico del sito e probabilmente non dovresti preoccuparti di prendere decisioni del genere a meno che:

  1. Hai identificato un vero collo di bottiglia
  2. Hai identificato un vero collo di bottiglia in uno scenario molto simile in passato

L'ottimizzazione prematura è la parola chiave e lo descrive Donald Knuth 1 meglio di quanto avrei potuto:

Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.

L'approccio più semplice è avere una tabella vote , in cui si registrano tutti i voti. I campi tipici sarebbero voteID , voterID , questionID , voteTimestamp e potresti calcolare i totali per ogni richiesta. Ma probabilmente questo diventerà un problema di prestazioni molto presto, specialmente con un sito ad alto traffico come StackOverflow 2 .

In questo caso, il mio approccio sarebbe quello di eseguire un processo in background pianificato 3 che calcola i totali e li memorizza in una tabella diversa (o nella tabella delle domande), ed eventualmente anche in un database di archiviazione dei documenti 4 . Oppure, anche in una cache di memoria 5 , se ha senso.

Ci sono altri modi per memorizzare i totali calcolati, questi sono i più semplici (credo).

Per quanto riguarda le informazioni dell'utente, ci si aspetta che cambino meno spesso, quindi è probabile che tu riesca a farla finita con la cache, senza alcun approccio speciale al realm di database.

In generale, reads è molto più veloce di writes e negli scenari a basso traffico comuni staresti bene semplicemente mettendo in cache sensibilmente le tue visualizzazioni. Non esiste un approccio definitivo, mescolare e abbinare quando si identificano i colli di bottiglia.

1 Attenzione! Link PDF.
2 Non possiamo davvero isolare CodeReview, è basato sulla piattaforma comune, se qualcosa è un collo di bottiglia su StackOverflow, per impostazione predefinita è (o lo sarà) su CodeReview. < br> 3 Cron è il tuo migliore amico!
4 Supponendo che il database principale sia relazionale.
5 Memcached è il tuo altro migliore amico!

    
risposta data 11.01.2012 - 23:42
fonte

Leggi altre domande sui tag