Posibilidades del usuario en el sitio

Quiero construir un sistema en el sitio web que permita a los usuarios hacer algunas cosas dependiendo de su calificación. Por ejemplo, tengo una regla para el valor de calificación X:

  • 1 publicación en 3 días
  • 10 comentarios en 1 día
  • 20 votos en 2 días

para el valor de calificación Y, la regla puede ser la siguiente:

  • 3 publicaciones en 1 día
  • 50 comentarios en 1 día
  • 30 votos en 1 día

Cada noche vuelvo a calcular las calificaciones de los usuarios, así sé lo que cada usuario es capaz de hacer. Las posibilidades no se suman ni se restablecen en el nuevo cálculo de cada calificación.

Una cosa más importante es que el administrador puede llenar las posibilidades concretas del usuario en cualquier momento.

¿Cuál es la estructura óptima de la base de datos (MySQL) deseada?

Puedo contar lo que ha hecho el usuario concreto:

SELECT COUNT(*) FROM posts WHERE UserID=XXX AND DateOfPost >= 'YYY'
SELECT COUNT(*) FROM comments WHERE UserID=XXX AND CommentOfPost >= 'YYY'

Pero, ¿cómo puedo administrar las posibilidades de llenado en este caso?

preguntado el 09 de enero de 11 a las 12:01

+1 - buena pregunta. Lo siento, no puedo en realidad llamadas de ayuda tú en él ;-P -

¿Qué significa "el administrador puede cumplir con las responsabilidades de un usuario concreto"? -

Significa que si el usuario ya usó algunas posibilidades propias (por ejemplo, publicaciones de blog y 5 comentarios) y todas sus posibilidades son "PUBLICACIONES: 1, COMENTARIOS: 10", el administrador puede hacer que este usuario tenga nuevamente todas las posibilidades "POSTES: 1, COMENTARIOS: 10 ". -

y estas posibilidades se darán constantemente o como cualquier otra se recalcularán a medianoche? Si no es así, ¿qué pasa si el usuario acumula puntos (o lo que sea que acumule en su sitio) y debería obtener más grande Posibilidades: ¿deberían reescribirse las especificadas por el administrador? -

No constantemente. Las posibilidades dependen de la calificación de los usuarios. La calificación se vuelve a calcular cada noche. Cada noche tengo conocimiento, qué posibilidades tiene cada usuario. Las posibilidades de la noche siguiente pueden ser diferentes (más pequeñas / más grandes). El administrador puede llenar todas las posibilidades del usuario para este conocimiento. Lo siento por mi inglés :) Si el usuario ya usó algunas de sus propias posibilidades, el administrador puede hacerlo en cualquier momento (puede hacerlo muchas veces por día, hora ...), ese usuario tiene nuevamente todas las posibilidades (recibió la noche anterior) -

4 Respuestas

Registraría el número de acciones de cada usuario cada día y usaría esa tabla para comparar.

Esta tabla contendría los siguientes campos:

  • datos: el día en que tuvo lugar la acción
  • contar: el número de acciones realizadas ese día
  • ID de usuario: quien hizo esta acción
  • Térmica: qué acción publicar / comentar / votar / ...
  • pasar por alto: booleano, si está configurado, el administrador ha restablecido los valores

Comprobando una regla: SELECCIONE SUM (count) FROM log DONDE userId = XXX AND action = YYY AND ignore = 0 AND DATEDIFF (date, NOW ()) <= DAYS

Restablecer una regla: ACTUALIZAR ignorar = 1 DESDE el registro DONDE userId = XXX

Si su calificación cambia, el resultado sigue siendo válido (solo se comparará con el otro total)

Cuando crea una tabla de reglas:

  • Térmica
  • cupos
  • días
  • rating_min
  • rating_max

Puede consultar permisos como este:

SELECT action, IF(SUM(count) < MIN(limits), 1, 0) as can_do_action FROM log LEFT JOIN rules ON rules.action = log.action WHERE userId = XXX AND rating_min <= RATING AND rating_max >= RATING AND ignore = 0 AND DATEDIFF(date, NOW()) <= days

Entonces obtienes un registro de tabla como este: - comentario => 1 - votos => 0

Debe actualizar esta tabla en cada acción (cree una nueva fila si es la primera acción del día o actualice el recuento de la fila)

La ausencia de una regla significa que no se han realizado acciones, por lo que podemos ignorarla.

Respondido el 09 de enero de 11 a las 16:01

¡Gracias! ¡Usar ignorar campo es una solución muy agradable y simple! - Lari13

Si te entiendo correctamente, tienes un usuario que puede publicar 1 blog y comentar 10 veces. Ahora ha comentado 5 veces y ha publicado un blog. ¿Quiere que el administrador haga clic en un botón y ahora el usuario puede volver a publicar un blog y comentar 10 veces?

Puede ser un truco, pero ¿podría contar las acciones que se están restableciendo / ignorando y restar eso de las acciones actuales?

por ejemplo: el usuario tiene 1 blog y 5 comentarios. El administrador presiona "restablecer" y usted guarda esos valores. Ahora, cuando el usuario publique otro blog y verifique si está permitido, obtendrá

SELECT COUNT(*) FROM posts WHERE UserID=XXX AND DateOfPost >= 'YYY'

Y haces algo como esto

SELECT changes FROM adminTable WHERE UserID=XXX AND  type = 'post'

Y si los cambios están bien, estás listo.

Respondido el 09 de enero de 11 a las 15:01

Parece estar bien, pero ¿puede explicarlo más profundamente, por favor? ¿Qué hay en adminTable y cómo y cuándo se insertarán / actualizarán / eliminarán los datos en esta tabla? ¿Qué sucede al día siguiente o el administrador presiona nuevamente el botón 'reiniciar'? No entendí esta idea en detalles, pero desde lejos parece ser una buena solución. - Lari13

Bueno, 'admintable' es solo un nombre aleatorio para una tabla que guardaría los valores que desea 'restar' de los totales. Se actualizan cuando el administrador presiona el botón "reiniciar" y se vacían todas las noches. - Nanne

¿Qué hay de tener, en la tabla de usuarios, tres columnas llamadas remainingPosts, remainingComments y remainingVotes? Disminuirá las columnas cuando el usuario haya realizado una acción específica, y de esta manera el administrador siempre puede "rellenar" esas columnas, incluso por encima del límite original.

===

Otra opción es almacenar el vencimiento de los permisos en esas columnas, de modo que pueda restablecer los permisos simplemente poniendo el vencimiento de una determinada columna al día anterior. Luego puede usar sus consultas para obtener el número restante de publicaciones / comentarios / votos para el usuario.

Respondido el 09 de enero de 11 a las 15:01

Ésta es la solución más sencilla. Pero si tengo la regla, por ejemplo, "3 publicaciones en 3 días", ¿cómo puedo saber cuándo y cómo debo 'rellenar' estos contadores nuevamente, si el usuario usó solo una parte de ellos? - Lari13

Sugiero separar las dos preocupaciones por completo:

  • El proceso de habilitar funciones / posibilidades para los usuarios
  • El modelo de datos de las funciones del usuario

Por ejemplo, podría tener una tabla simple de muchos a muchos que represente las características del usuario:

user_features(
   user_id
  ,feature_id
  ,source      (admin|earned)
  ,primary key(user_id, feature_id)
);

Esto hace que sea realmente fácil para un administrador deshabilitar / habilitar partes o todo el conjunto de funciones.

Su trabajo nocturno consultaría tablas relevantes y otorgaría / revocaría características insertando / eliminando de esta tabla.

Si opta por este enfoque, puede otorgar las funciones en función de una calificación o acciones específicas.

Una regla como "3 publicaciones en 3 días" se puede implementar de la siguiente manera:

when a user posts, check if the previous post was made within 24 hours.
if yes then
   increment counter by 1
   record current timestamp

   if counter = 3 then
      grant feature to user
else 
   reset counter to 1 
   record current timestamp

Necesitaría dos columnas (post_count: int, last_post: date) en alguna tabla con clave de user_id.

Respondido el 09 de enero de 11 a las 16:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.