2010-12-27 25 views
8

Actualmente estoy trabajando en un sitio web basado en widgets, construido completamente en la socialización del usuario. Dado que un sistema de reputación vale la pena para atraer usuarios, decidí implementar uno de estos.Sistema de insignia del sitio web

Ahora, me gustaría escuchar algunas soluciones sobre cómo debe implementarse de la manera correcta (tome, por ejemplo, el sistema de insignia de Foursquare).

Básicamente, tengo que ser capaz de hacer lo siguiente:

  • tienen una mesa insignias, donde puedo añadir, editar y eliminar insignias;
  • ser capaz de habilitar y deshabilitar una insignia;
  • podrá introducir una nueva insignia, pero sin escribiendo un código nuevo; simplemente proporcione algunos parámetros para agregar la credencial de identificación con respecto a lo que se debe seguir para que un usuario reciba una insignia;
  • podrá otorgar insignias en tiempo real, lo que significa que siempre que un usuario logre lo que necesita para recibir una insignia, el sistema debe saber inmediatamente darle la insignia a ese usuario;
  • Además, el sistema no debe estar sobrecargado con "detectores de distintivos": creo que interrogar cada solicitud de usuario con cada requisito de distintivo consume mucho tiempo;

Estos Dicho esto, me gustaría escuchar sus opiniones sobre cómo implementar de la manera correcta un sistema de tarjetas (lógica, de esquema de base de datos, métodos, etc.)

Respuesta

0

Usted podría considerar el uso del módulo de Drupal o User Badges incluso mirando cómo establece su esquema.

+0

Gracias por su respuesta, pero no sé exactamente lo que debería estar buscando ... – linkyndy

+0

Hay dos formas de hacerlo. 1) Cambie a una instalación drupal e instale este módulo. 2) Verifique el archivo user_badges.install. Eso debería darte el shema para la base de datos. Luego, consulte el archivo user_badges.module para ver cómo se representan los datos. – josefnpat

+0

Como no hay manera de que pueda cambiar a Drupal, he revisado el código en esos archivos. Lo único que no he entendido es cómo logra Drupal asignar distintivos automáticamente a los usuarios en los hitos definidos por el administrador. Solo he visto la parte donde los administradores pueden asignar identificaciones de forma manual. – linkyndy

0

base de datos & vivo actualización:
crear una tabla con columnas como las condiciones
ex: responde - útiles - respuesta ofrecida etc ...

cada vez que un usuario realiza una presentación o cuando los usuarios votan (secuencias de comandos del lado del cliente para enviar), se les otorga un punto/ponts (incrementos numéricos en las columnas de la tabla).


el valor de retorno (script del lado del cliente para recuperar), sobre la base de las instrucciones condicionales que están asociados con las columnas de tabla, una insignia se gana.
ejemplo:
si los votos = 50, alcanzan heplful insignia
si aparece = 10, alcanzan mayor contribuyente insignia


por un script del lado del cliente que quiero decir ajax o JSON, no estoy seguro de cómo Si desea crear una aplicación de feed en vivo

+0

¿Filas o columnas para la tabla? Y también, al usar el método que describió, significa que tengo que crear una tabla para cada usuario en la que pueda realizar un seguimiento de sus votos/respuestas, etc. Y con respecto a la recuperación, ¿tengo que verificar los puntos en ** cada uno *? * solicitud para asignar las credenciales correspondientes al usuario? ¿No sería más fácil si tuviera una tabla de insignias e hice la 'verificación de insignia' cuando guardo datos? De todos modos, esto funciona bien, pero quería agregar dinámicamente una insignia desde el panel de administración, no modificar los archivos PHP para agregar una insignia. ¿O me he perdido algunos de tus puntos? – linkyndy

+0

@linkyndy: Mi error, quise decir columnas. Si usa columnas, cada usuario tendrá su propio conjunto de datos. userID-username-answers-votes ... Además, dado que el usuario va a enviar información de todos modos, ¿por qué no tener una función de búsqueda en la columna de la tabla para ver si se ha cumplido la condición de una insignia? – Zebra

+0

Entonces, usted dice que cada usuario tiene su propia fila en esa tabla? Bueno, ¿cómo voy a hacer un seguimiento de quién votó dónde, entonces? Y también, como dije, al usar su método, significa que tengo que "escanear" la base de datos en cada solicitud para averiguar si se ha desbloqueado una nueva insignia. ¿No hay una manera más elegante y más rápida de lograr esto? – linkyndy

0

lo primero que debe hacer es tener la estructura adecuada para su proyecto y luego comenzar a desarrollarlo ... seguramente tendrá muchos problemas, pero puede preguntar en cualquier momento porque su publicar aquí es ju st general y cualquier respuesta no ayudará en su caso.

pero su idea es genial :)

2

Esto suena como un proyecto masivo. La complejidad aumentará bastante rápido, no importa si la quieres o no.

Lo primero que haría sería comenzar por crear documentación para la API.

Cuando tenga documentación, puede trazar los requisitos para su proyecto. Las cosas que escribiste en cuestión son algún tipo de requisitos, pero demasiado abstractos, demasiado grandes.

Cuando tenga requisitos, comenzará a pensar en la estructura y la ingeniería del software.

En este paso, separar las cosas en mi opinión es el camino a seguir. Esto facilitará la administración de las cosas. Encontrar errores de cuellos de botella, etc.

No sé lo que será el desencadenante en su sistema para 'si el usuario debe recibir una insignia'. Entonces estoy tomando una analogía cuadrangular.

Para ser justos, los chicos están haciendo un trabajo increíble para procesar todas estas solicitudes en tiempo real. Quiero decir, parece que están verificando si debería recibir una insignia en cada solicitud. Así que mi check in desencadena algún algoritmo en el servidor para revisar mi historial de checkins e insignias, las reglas de las tarjetas de identificación, combinarlas, crear mi placa de identificación merecida y mostrar mi nueva tarjeta de identificación en respuesta. Suena mucho ¿verdad? ¡Bueno, lo es!

No creo que estén haciendo todo este trabajo en paralelo. Esto sería demasiado trabajo para un servidor. Aunque, mi insignia fourquare no está interactuando con ningún otro usuario (mucho más fácil), por lo que el procesamiento paralelo no está fuera de discusión.

Así que la primera idea de cómo foursquare podría funcionar. El equilibrador de carga reenvía mi solicitud al servidor no pesado cargado. Y allí todo el trabajo se hace en paralelo. Cuanta más carga, más se encienden los servidores. Haga todos los cálculos de insignias sobre la marcha utilizando solo la base de datos esclava. Presente al usuario su insignia y envíe esta información a master db. Esto es posible porque las insignias no interactúan entre diferentes usuarios. Una insignia: se necesita un historial de usuario.

Otra solución sería usar map - reduce. Use Message Broker para procesar revisiones de distintivos en paralelo. Usted recibe una solicitud. Enviar mensaje al agente de mensajes. El mensaje está aterrizando en multiple workers, donde un trabajador está comprobando solo una regla de insignia específica contra el historial del usuario. Al final, el cálculo se haría mucho más rápido.

Sobre db structure. Creo que no hay forma de pasar por todos los DB para averiguar realmente si el usuario debe recibir una insignia o no. Me gustaría ir con la manera simple y directa de manejar esto. Simplemente cree un buen archivo estructurado de datos utilizando claves externas, tipos de columna adecuados, índices en los lugares correctos y estará bien. Construya un terreno estable y optimice solo cuando sea necesario.

Si realmente está ansioso por hacer la optimización al inicio del proyecto (creo que es una mala idea), mantendría todos los datos relacionados con la insignia en tablas separadas. Una tabla para una insignia con todas las columnas específicas relacionadas con esa insignia.

El ejemplo sería: badge_restaurants (user_id, badge_id, current_level, checkin_count). Para recibir una nueva credencial de restaurante, solo deberías verificar si el usuario registró + 1> = cantidad necesaria y puedes mirar sin más.

Por supuesto, esta no es la solución perfecta. Se puede agregar más abstracción para hacerlo de una manera más sofisticada (no crear cientos de tablas).Aún así, las insignias más complejas lo empujarán a crear soluciones más complejas.

+0

¡Gracias por una toma tan detallada de esto! – linkyndy

Cuestiones relacionadas