2009-02-07 21 views
33

He estado pensando en cómo implementar la función de insignia similar a SO en un nuevo sitio web. ¿Cuál es la mejor manera de almacenar criterios para insignias?¿La mejor manera de almacenar los criterios de identificación?

dos ideas:

  • Todo el código
  • 'segundo sistema' - crear una arquitectura de meta para la definición de insignias y sus criterios. Almacene información en la base de datos y solicite un código para averiguar las insignias y sus criterios.

¿Hay formas mejores?

Respuesta

37

Reglas.

Crea eventos en el sistema y usa reglas dentro de un procesador de secuencia de eventos.

Específicamente, supongamos que tiene una insignia "hecha 10 publicaciones". No ejecute "select count (*) desde publicaciones donde user =: user" para cada publicación. Por el contrario, tiene una regla simple que observa cada publicación y "cuenta" almacenando el estado de las reglas en el perfil del usuario.

De esa manera "hecho 10 mensajes" es tan barato como "hecho 1,000,000" puestos.

Esto también hace que el sistema sea mucho más extensible.

+9

Si sigue esta ruta, tenga cuidado con los casos cuando agrega una nueva insignia y necesita analizar qué usuarios ya deberían haberla obtenido. –

+0

Sí, es absolutamente una desventaja del sistema, pero aún así es más flexible y escalable ya que (normalmente) agregar nuevas insignias sucede mucho menos que probarlas y otorgarlas. –

+0

Entonces, ¿cómo manejarías la adición de insignias en el futuro? Digamos que tengo una nueva insignia como la insignia "woot" que SO agregó. ¿Cómo lo harías retroactivo? – Micah

18

Estoy de acuerdo con Will en este caso.

Crea "eventos" en las páginas, por lo que cada vez que ocurre un evento, es decir. un usuario borra una publicación, consultará el módulo de evento con el evento, digamos, EVENT_USER_DELETE_POST y luego puede seleccionar ese evento y generar una consulta basada en él. A continuación, puede decidir si se otorga una insignia o no.

Esto mantendrá las dos lógicas separadas y mantendrá un diseño modular. Debería ser muy fácil de implementar de esta manera.

El único inconveniente es que si el evento no fue "capturado", entonces un usuario puede haber ganado un criterio de identificación pero aún no ha sido recompensado. Sin embargo, esto nunca debería ocurrir. La única situación en la que puedo pensar es si la base de datos se manipula manualmente.

Cuestiones relacionadas