Domanda

Ho lavorato su una funzione della mia applicazione per implementare una classifica, sostanzialmente impilare gli utenti in base al loro punteggio. Attualmente sto monitorando il punteggio su base individuale. Il mio pensiero è che questa classifica dovrebbe essere relativa anziché assoluta, ovvero anziché avere i primi 10 utenti con il punteggio più alto sul sito, è tra i primi 10 nella rete di amici di un utente. Questo sembra migliore perché ognuno ha la possibilità di essere il numero 1 nella propria rete e c'è una forma di competizione amichevole per coloro che sono interessati a questo genere di cose. Sto già memorizzando il punteggio per ciascun utente, quindi la sfida è come calcolare il grado di quel punteggio in tempo reale in modo efficiente. Sto usando Google App Engine, quindi ci sono alcuni vantaggi e limitazioni (es. IN [array]) le query eseguono una sottoquery per ogni elemento dell'array e sono anche limitate a 30 elementi per istruzione

Ad esempio

1st Jack 100

2 ° Giovanni 50

Ecco gli approcci che mi sono venuti in mente ma sembrano tutti inefficienti e ho pensato che questa comunità potesse trovare qualcosa di più elegante. La mia sensazione è che qualsiasi soluzione verrà probabilmente eseguita con un cron e che memorizzerò un ordine giornaliero di classifica e elenco per ottimizzare le operazioni di lettura, ma sarebbe bello se ci fosse qualcosa di più leggero e in tempo reale

  1. Estrai l'elenco di tutti gli utenti del sito ordinati per punteggio. Per ogni utente scegli i loro amici da quell'elenco e crea nuove classifiche. Memorizza il grado e l'ordine della lista. Aggiornamento quotidiano. Contro: se ricevo molti utenti, ciò richiederà sempre

2a. Per ogni utente scegli i loro amici e per ogni amico scegli il punteggio. Ordina quell'elenco. Memorizza il grado e l'ordine della lista. Aggiornamento quotidiano. Registra l'ultima posizione di ciascun utente in modo che l'elenco preesistente possa essere utilizzato per riordinare il prossimo aggiornamento al fine di renderlo più efficiente (può risparmiare tempo di smistamento)

2b. Come sopra, tranne calcolare solo il rango e l'ordine delle liste per le persone i cui profili sono stati visualizzati nell'ultimo giorno Il contro è aggiornato solo per la seconda persona che visualizza il profilo

È stato utile?

Soluzione

Se le scritture sono molto rare rispetto alle letture (un presupposto chiave nella maggior parte dei negozi di valori-chiave, e non solo in quelli ;-), allora potresti preferire fare un salto nel tempo quando devi aggiornare i punteggi (una scrittura) piuttosto che ottenere le relative classifiche (una lettura). In particolare, quando cambia il punteggio di un utente, metti in coda le attività per ciascuno dei suoi amici per aggiornare le loro "relative classifiche". e mantenere quelle classifiche come attributi di elenco (che mantengono l'ordine! -) opportunamente ordinati (sì, quest'ultimo è una denormalizzazione - spesso è necessario denormalizzare, cioè duplicare le informazioni in modo appropriato, per sfruttare al meglio i negozi di valori-chiave! -) .

Naturalmente aggiornerai anche le relative classifiche quando un'amicizia (connessione utente-utente) scompare o appare, ma quelle dovrebbero (immagino) essere anche più rare degli aggiornamenti dei punteggi ;-).

Se le scritture sono piuttosto frequenti, dal momento che non hai bisogno di informazioni aggiornate perfettamente precise (ad esempio, non si tratta di elementi finanziari / contabili ;-), hai ancora molti approcci praticabili da provare.

Ad esempio, grandi cambiamenti di punteggio (più rari) potrebbero innescare i ricalcoli delle classifiche relative, mentre quelli più piccoli (più frequenti) vengono nascosti e applicati solo una volta ogni tanto "quando ci si avvicina". È difficile essere più specifici senza numeri di ballpark sulla frequenza di aggiornamenti di varia grandezza, dimensioni tipiche dei cluster di amicizia di rete, ecc. Ecc. So che, come tutti gli altri, vuoi un approccio perfetto che si applichi indipendentemente da quanto siano diverse le dimensioni e le frequenze in questione ... ma non ne troverai uno! -)

Altri suggerimenti

È disponibile una libreria Python per l'archiviazione delle classifiche:

http://code.google.com/p/google- app-motore-ranklist /

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