2010-09-01 12 views
5

Mi chiedevo come implementare al meglio il "più visualizzato" "in primo piano (come YouTube) sul mio database.Implementazione del database delle funzionalità "più viste"

Lasciate che vi spieghi il "più visti" dispongono di un po 'meglio: Fondamentalmente voglio elencare il più visitato pagine/video/etc da questo giorno/settimana/mese, vedere http://www.youtube.com/charts/videos_views per un esempio .

Quindi mi chiedevo come implementare al meglio questa funzione, poiché posso pensare a molti modi di farlo ma tutti hanno i loro + e - per loro.

Inoltre, mi piacerebbe anche sentire i commenti di vari programmatori sulle idee di altri programmatori. Inoltre vorrei iniziare una buona conversazione su questo argomento.

Ps. Sto cercando in particolare su come calcolare il tempo, diciamo più visto in questo mese, senza avere una tabella enorme che salva ogni singola vista con il datetime. Ogni idea è benvenuta.
Pps. Uso Mysql e PHP, suggerimenti extra per questi due sono molto graditi.

risposta

3

hanno le seguenti tabelle: 1. Visto 2. views_hourly_summary 3. views_daily_summary 4. views_monthly_summary 5.views_alltime_summary

hanno una corsa job cron ai seguenti intervalli:

  1. corsa ogni ora e preaggregate le viste per quell'ora dalla tabella di vista e salvare il risultato preaggregated nella tabella views_hourly_summary, aggiornare anche il views_alltime_summary tavolo

  2. run alla fine di tutti i giorni e preaggregate le viste per quel giorno dal tavolo ore e salvare il risultato preaggregated nella tabella views_daily_summary

  3. run alla fine della everymonth e preaggregate le viste per quel giorno dal tavolo ore e salvare il risultato preaggregated nella tabella views_daily_summary

dopo, quando il recupero dei risultati si dovrà fare un po 'di matematica come segue:

  1. per esempio, si vuole recuperare i punti di vista per ultime 4 ore, si dovrebbe andare a prendere i 3 dati di intere ore dalla tabella oraria e per i dati rimanenti recuperano dalla tabella di vista come segue:

    seleziona item_i d, sum (views) come viste from views_hourly_summary dove ora tra concat (sinistra (ora() - intervallo 3 ore, 14), '00: 00 ') e concat (sinistra (ora(), 14), '00 : 00') gruppo da item_id

    unione

    selezionare item_id, count (1) come viste di viste dove datetime tra (ora() - intervallo di 4 ore) e concat (a sinistra (ora() - intervallo di 3 ore, 14), '00: 00 ') o datetime> concat (a sinistra (ora(), 14), '00: 00') gruppo da item_id

0

In cima alla mia testa, avrei una tabella ItemViews, che associa il numero di viste a un ID di un oggetto (assumendo che ci sia un solo tipo di oggetto). La tabella potrebbe avere 2 colonne: ItemId e ViewCount. Quando una nuova funzione riceve la sua prima vista, inserisco una nuova riga in quella tabella e inizializzo ViewCount a 0. Quindi incrementerei il contatore in quella riga ogni volta che rilevo una nuova vista.

Potrei quindi calcolare le statistiche da quella tabella. Se c'è un concetto di categorie (come in Youtube), potrei unire gli ID di categoria con ItemId e raggruppare la mia vista in quel modo.

+0

Sì questa è un'idea semplice, ma poi si finisce con un tavolo enorme, ad esempio, se ho 1 milione di pagine e ogni pagina ha qualcosa come 10k visualizzazioni quindi 1mx10k = 10 miliardi di righe. Ora immagina di calcolare il tempo per ogni riga per ottenere il massimo per questo mese. Avrei bisogno di un intero server solo per quello, sicuramente ci deve essere un modo più semplice. – StfnoPad

+0

Penso che il punto sia che tu faccia un solo inserto per la nuova pagina/oggetto. Dopo quel punto si incrementa solo il contatore - quindi si finirebbe solo con le righe 'x' - dove 'x' è il numero di elementi visualizzati. Se avessi articoli da 1m, ma solo 10K erano stati visualizzati avresti solo 10.000 righe, nemmeno il milione di articoli. Un ulteriore risparmio. Una grande idea e qualcosa che penserei di implementare anche nella mia soluzione. –

+0

Sì, ma se si dispone solo di un contatore, non è possibile calcolare il più visualizzato per dire questa settimana poiché non si dispone di informazioni su data e ora. Sono sicuro che deve esserci un modo semplice altrimenti mi chiedo come faccia a fare YouTube con i loro miliardi di video e milioni di visualizzazioni per video. Comunque, molte grazie ragazzi. – StfnoPad

1

Innanzitutto proverei a monitorare gli utenti utilizzando un cookie, fornendo loro un ID univoco come una visita e per quella visita. Questo dovrebbe aiutare con l'identificazione.

Proverei a spostare la logica per aggiornare gli elementi più visualizzati fuori dal codebase del sito web. Quindi, questo significa che ogni richiesta web pubblica le informazioni sulla visita in una coda di messaggi, probabilmente includendo l'ora/data, l'elemento visualizzato, le informazioni tracciate dal cookie e forse l'intestazione di indirizzo/richiesta IP.

Avrei quindi creato un servizio per leggere da quella coda ed elaborare le informazioni. Ciò consentirebbe di aggiornare/modificare quella logica senza influenzare il sito. Probabilmente vorrai gestire più aggiornamenti, ecc. Per impedire alle persone di interferire con i risultati - sia in modo fraudolento che per errore. Inoltre, estraendo questa elaborazione dal sito principale non stai rallentando il tempo di richiesta della tua pagina, puoi fare in modo che la logica determini/aggiorni le viste degli articoli nel modo più complesso possibile.

1

Un approccio semplice che mi viene in mente incrementare il valore del campo ViewCount sulla tabella di 1 per ciascun IP univoco degli utenti che hanno caricato quella pagina.

+0

Solo utilizzando l'indirizzo IP si sarebbe limitati a registrare una richiesta per azienda se il proprio sito è stato utilizzato da più persone dietro un proxy aziendale, ecc. –

+0

Sì, ma non si può calcolare il "più visualizzato" nel tempo come si è non salvare nessuna delle informazioni sull'ora. Quindi, facendo questo non posso calcolare il più visto per questa settimana come esempio. – StfnoPad

+0

Ohh sì, sono necessarie anche le informazioni sull'ora. Questo è stato un approccio molto semplice pensato solo 10 secondi :)) comunque porterà all'approccio corretto. Sì, anche controllare solo l'IP univoco non sarà sufficiente, le informazioni sui cookie sono buone. Quindi aggiungi tutti questi alla soluzione, IP univoco, cookie, tempo di visita, anche la coda per aggiornare db, e avere tutte le informazioni in una tabella separata piuttosto che un semplice campo. Sembra già abbastanza sofisticato. – apprich

0

Ecco una soluzione molto semplice. Non è completamente ottimale, ma potrebbe essere migliorato per essere migliore senza troppo dolore.

Fondamentalmente basta dividere il tempo in intervalli, ad esempio 5 minuti ciascuno. Avere un record in db con una colonna per videoID e una colonna che identifica un intervallo di tempo specifico, quindi una colonna per quante visualizzazioni ha ricevuto il video durante quell'intervallo di tempo. Quindi, se vuoi sapere quante visualizzazioni ha ricevuto un video nell'ultimo giorno, sommi tutte quelle in cui l'intervallo/timestamp è maggiore di un giorno fa. Non è del tutto ottimale perché l'ultimo intervallo sarà solo parzialmente riempito di visualizzazioni, il che ti dà le visualizzazioni per un po 'di tempo in più o un po' meno tempo a seconda di quando lo calcoli. Ma è abbastanza buono per una soluzione che richiede due secondi. Per calcolare le visualizzazioni annuali, fare la stessa cosa tranne che con una tabella completamente separata in cui gli intervalli di tempo sono espressi per 1 giorno, in modo che non sia necessario memorizzare i dati e riassumere oltre 100.000 intervalli di cinque minuti per effettuare un anno completo.

Assicurati solo di avere un indice composto su [videoId, timestamp] in modo da poter riassumere rapidamente le viste.

Problemi correlati