Esta es realmente una pregunta compleja ya que la base de datos y la escala son consideraciones muy importantes.
Asumamos una base de datos SQL por ahora.
Un buen enfoque es almacenar los mejores puntajes diarios, semanales y mensuales por separado. Quizás una tabla para cada intervalo de tiempo.
- ¿Cuántos números debajo de [matemática] 10 ^ n [/ matemática] hay cuyos dígitos suman [matemática] [/ matemática]?
- ¿Las compañías aéreas han mejorado la eficiencia de sus algoritmos de sobreventa?
- Cómo implementar la ordenación de inserción recursiva usando una lista vinculada
- Si tuviera los 1 y 0 correctos, ¿podría crear alguna imagen / video posible?
- ¿Qué define una solución óptima con respecto al problema de la mochila 0-1?
Siempre que el usuario genere un nuevo puntaje, si es mejor que su puntaje anterior, actualice sus registros diarios / semanales / mensuales en las tablas correspondientes.
Lo bueno es que los datos ya están filtrados por intervalo de tiempo, por lo que hay mucho menos trabajo para encontrar y ordenar. Además, cada usuario solo tiene una entrada para un intervalo de tiempo particular, por lo que no necesita encontrar la mejor puntuación para un usuario en particular. Todo esto está precalculado.
La desventaja es que si un usuario crea un nuevo puntaje alto, podría tener que hacer tres lecturas / escrituras. Dependiendo de la aplicación, esto podría generar más IO de las que puede manejar un único servidor. Entonces, debe analizar cómo escalar a varias máquinas (o pasar de HDD a SSD).
Ok para profundizar un poco más.
Una tabla de clasificación es esencialmente una lista gigante de valores. Cuanto más grande sea esa lista, más tiempo llevará encontrarla y ordenarla. Es por eso que separarse en D, W, M es un enfoque simple que te lleva bastante lejos.
Además, dependiendo de cuántos jugadores tengas, esa lista de valores puede ser muy larga. Digamos que tiene un millón de puntajes en su tabla mensual. ¿Cuánto tiempo llevaría consultar las puntuaciones y devolver una lista ordenada?
Otra consideración de rendimiento es cuántas escrituras / lecturas obtendrá su tabla de clasificación. Si está escribiendo mucho en su base de datos, esto afectará el rendimiento de lectura. Entonces, ¿necesita implementar una capa de almacenamiento en caché?
¿Los datos deben ser en tiempo real?
¿Qué pasa si los datos tenían unos minutos de antigüedad?
¿Eso afectaría la usabilidad?
Entonces, a medida que profundiza, hay más preguntas sobre la pila / arquitectura total de cómo almacenar / recuperar datos de la tabla de clasificación.
Sin embargo, si fuera a construirlo todo de nuevo, simplemente usaría el esquema D, W, M. Pondría un índice en la columna de puntuación, para que la base de datos pueda optimizarlo, y seguir con eso hasta que sea demasiado lento y tenga que rediseñarlo.
En última instancia, es mucho más difícil conseguir jugadores que crear una base de datos de clasificación simple + consultas SELECT. Así que enfócate en eso primero y luego escala tu tabla de clasificación cuando lo necesites.