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.
Gracias por su respuesta, pero no sé exactamente lo que debería estar buscando ... – linkyndy
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
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