Pregunta

Estoy tratando de crear un sistema de puntos en mi programa similar al desbordamiento de la pila, es decir, cuando el usuario realiza una buena acción (actividad), sus puntos aumentan. Me pregunto cuál es la mejor manera de implementar esto en términos de db schema + logic.

Puedo pensar en tres opciones:

  1. Agregue un campo adicional llamado puntos en la tabla de usuarios, y cada vez que un usuario haga algo, agréguelo a ese campo (pero esto no podrá mostrar una actividad de tipo)
  2. Cree una función que se ejecutará cada vez que el usuario realice una buena acción y calcule desde cero el valor y actualice el campo de puntos
  3. Calcular cada vez usando una función sin ningún campo de puntos.

¿Cuál es la mejor manera de hacer esto? Gracias por tu tiempo.

¿Fue útil?

Solución

Personalmente, usaría la segunda opción para abordar este problema.

La primera opción limita la funcionalidad, así que elimino eso de inmediato.

La tercera opción es ineficiente en términos de rendimiento: es probable que esté obteniendo ese número mucho y, si su programa es algo como stackoverflow, tal vez muestre (calcule) ese número muchas veces por página vista / acción.

Para mí, la segunda opción es una solución híbrida decente. Normalmente, odio haber duplicado datos en mi sistema (acciones y puntos, en lugar de uno u otro), pero en este caso, un campo entero es una cantidad bastante pequeña de espacio por usuario que le ahorra un lote de tiempo para volver a calcular los valores innecesariamente.

En ocasiones, debemos intercambiar espacio de almacenamiento de datos por rendimiento o viceversa, y diría que el # 2 es un compromiso que beneficia enormemente a la aplicación.

Otros consejos

Esto depende en gran medida de la cantidad de cálculos esperados que enfrentará. De hecho, SO aparentemente utiliza un método que es similar a su enfoque 1), por razones de rendimiento que asumo.

Esto también evita saltos en los números si los factores cambian (como los elementos eliminados que otorgaron puntos, o aquí en las respuestas SO que se convierten en wiki de la comunidad, cambios en las reglas de puntos, acciones externas como unirse a otra cuenta aquí en SO etc. )

Si lo que quiere es una solución de recálculo (2), puede implementar un " inteligente " almacenando en caché borrando el valor (configurándolo en NULO, lo que significaría "sucio") cada vez que se produzca una modificación de un punto, y volviéndolo a calcular cuando sea NULL, utilizando el caché de otro modo. También podría (como una medida de autocorrección cuando ocurrieran cosas no explícitas) borrar los valores después de una hora, un día o lo que crea que se activan, de modo que se forzará una recalcificación después de un cierto tiempo, independientemente del '' sucio '' estado.

Iría por 1 y 2 (ejecutar en cron cada minuto más o menos).

De modo que: - Campo adicional actuaría como un caché para la cantidad de puntos. - La función para calcular los puntos podría ser una consulta de un solo sql que recalcularía los puntos para que todos los usuarios ganaran algo de velocidad de una vez.

Creo que volver a calcular el campo cada vez que se recibe el punto sería una exageración.

Personalmente, iría con la primera opción y agregaría un " Acciones " tabla para realizar un seguimiento de su historial de actividades.

Cuando un usuario hace algo bueno, obtiene una entrada en las "Acciones" Tabla, con la acción y algún valor puntual. El valor del punto puede provenir de otra tabla, o algún archivo de configuración. Ese mismo valor se agrega al registro de usuario.

En cualquier momento, puede resumir las acciones y obtener el total del usuario, pero para el rendimiento, simplemente actualizar cuando agrega el registro de acciones sería bastante simple.

¿Qué tan simple será tu sistema de puntos? Considero que algún tipo de registro / diario es bueno para que pueda hacer un seguimiento de la actividad diaria / semanal / mensual entre todos los usuarios

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

Es de código abierto y le permite agregar puntos e insignias a su aplicación. Tiene enlaces Java, Python, PHP y Ruby.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top