Domanda

Sto cercando di creare un sistema a punti nel mio programma simile allo stack overflow, ovvero quando l'utente fa qualche buona azione (attività) i suoi punti vengono aumentati. Mi chiedo quale sia il modo migliore per implementare questo in termini di schema db + logica.

Mi vengono in mente tre opzioni:

  1. Aggiungi un campo aggiuntivo chiamato punti nella tabella degli utenti e ogni volta che un utente fa qualcosa, aggiungilo a quel campo (ma questo non sarà in grado di mostrare una sorta di attività)
  2. Crea una funzione che verrà eseguita ogni volta che l'utente compie buone azioni e calcola da zero il valore e aggiorna il campo punti
  3. Calcola ogni volta utilizzando una funzione senza campo punti.

Qual è il modo migliore per farlo? Grazie per il tuo tempo.

È stato utile?

Soluzione

Personalmente, userei la seconda opzione per affrontare questo problema.

La prima opzione limita la funzionalità, quindi la elimino immediatamente.

La terza opzione è inefficiente in termini di prestazioni: è probabile che tu stia recuperando quel numero molto e, se il tuo programma assomiglia allo stackoverflow, forse mostra (calcolando) quel numero molte volte per visualizzazione di pagina / azione.

Per me, la seconda opzione è una soluzione ibrida decente. Normalmente, odio con dati duplicati nel mio sistema (azioni e punti, piuttosto che l'uno o l'altro), ma in questo caso, un campo intero è una quantità piuttosto piccola di spazio per utente che ti salva un lotto di tempo nel ricalcolo dei valori inutilmente.

A volte, dobbiamo scambiare lo spazio di archiviazione dei dati per prestazioni o viceversa, e direi che il n. 2 è un compromesso che avvantaggia notevolmente l'applicazione.

Altri suggerimenti

Questo dipende molto dal numero di calcoli previsti che dovrai affrontare. In effetti, SO apparentemente usa un metodo simile al tuo approccio 1), per motivi di prestazioni presumo.

Ciò impedisce anche i salti nei numeri se cambiano i fattori (come gli elementi eliminati che hanno assegnato punti, o qui su risposte SO che diventano wiki della comunità, cambiamenti nelle regole dei punti, azioni esterne come unire un altro account qui su SO ecc. )

Se una soluzione di ricalcolo (2) è ciò che desideri, puoi implementare un " smart " memorizzazione nella cache cancellando il valore (impostandolo su NULL che significherebbe "sporco") ogni volta che può aver luogo una modifica del punto e rielaborandolo quando è NULL, utilizzando altrimenti la cache. Potresti anche (come misura auto-correttiva quando accadono cose non esplicite) cancellare i valori dopo un'ora, un giorno o qualunque cosa tu pensi, in modo che un ricalcolo sia forzato dopo un certo tempo, indipendentemente dallo "sporco" Stato.

Vorrei scegliere 1 e 2 (eseguire cron in ogni minuto o giù di lì).

In modo che: - il campo aggiuntivo fungerebbe da cache per la quantità di punti. - La funzione per calcolare i punti potrebbe essere una singola query sql che ricalcoli i punti per tutti gli utenti contemporaneamente per ottenere una certa velocità.

Penso che ricalcolare il campo ogni volta che si riceve il punto sarebbe eccessivo.

Personalmente, sceglierei la prima opzione e aggiungerei " Azioni " tabella per tenere traccia della cronologia delle tue attività.

Quando un utente fa qualcosa di buono, ottiene una voce in " Actions " tabella, con l'azione e un certo valore in punti. Il valore del punto può provenire da un'altra tabella o da un file di configurazione. Lo stesso valore viene aggiunto al record dell'utente.

In qualsiasi momento, è possibile riassumere le azioni e ottenere il totale dell'utente, ma per le prestazioni, l'aggiornamento semplice quando si aggiunge il record dell'azione sarebbe abbastanza semplice.

Quanto sarà semplice il tuo sistema di punti? Ritengo che una sorta di registrazione / journaling sia buona in modo da poter tenere traccia dell'attività su base giornaliera / settimanale / mensile tra tutti gli utenti

Scopri http://code.google.com/p/userinfuser/

È open source e ti consente di aggiungere punti e badge alla tua applicazione. Ha collegamenti Java, Python, PHP e Ruby.

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