Actualmente estoy desarrollando un sitio web donde los usuarios pueden buscar a otros usuarios según los atributos (edad, altura, ciudad, educación, etc.). Ahora quiero implementar algún tipo de calificación entre los perfiles de usuario. La calificación se calcula a través de su propio algoritmo basado en la similitud entre los 2 perfiles dados. El usuario A tiene una calificación de "clasificación de coincidencia" de 85 con el usuario B y 79 con el usuario C, por ejemplo. B y C tienen una calificación de 94 y así sucesivamente ....Arquitectura MySQL para n * (n - 1)/2 algoritmo
El usuario debe poder buscar ciertos atributos y filtrar los resultados por calificación.
Dado que la clasificación difiere de un perfil a otro y también depende del usuario que realiza la búsqueda, no puedo simplemente agregar un campo a la tabla de mis usuarios y usar ORDER BY. Hasta el momento se me ocurrió con 2 soluciones:
Mi primera solución era tener un trabajo por lotes todas las noches, que calcula la calificación para cada combinación posible de usuarios y lo almacena en una tabla separada (usuario1, usuario2 valoraciones) . Entonces puedo unirme a esta tabla con la tabla de usuarios y ordenar el resultado por clasificación. Después de hacer algunas matemáticas, pensé que esta solución no se escalaría tan bien.
Según la fórmula n * (n - 1)/2 hay 45 combinaciones posibles para 10 usuarios. Para 1.000 usuarios, de repente tengo que insertar 499.500 combinaciones de calificación en mi tabla de clasificación.
La segunda solución fue dejar MySQL y simplemente calcular la calificación sobre la marcha dentro de mi aplicación. Esto tampoco se escala bien. Digamos que la búsqueda solo debe devolver 100 resultados a la IU (con la calificación más alta en la parte superior). Si tengo 10.000 usuarios y deseo hacer una búsqueda para cada usuario que vive en Nueva York ordenado por clasificación, tengo que cargar TODOS los usuarios que viven en Nueva York en mi aplicación (digamos 3.000), aplicar el algoritmo y luego regresar solo los 100 mejores para el usuario. De esta forma cargué 2.900 objetos de usuario inútiles de la base de datos y desperdicié CPU en el algoritmo sin hacer nada con él.
Alguna idea de cómo puedo diseñar esto en mi db MySQL o aplicación web para que un usuario puede tener una calificación individual con cada otro usuario de manera que el sistema de escalas más allá de un par de miles de usuarios?
Es 'n * (n-1)/2' y no me gusta el título, pero la pregunta es interesante. – Patrick
gracias, arreglé la fórmula. Estoy abierto para sugerencias de títulos ... realmente no sé cómo decirlo :-) – black666
en el primer paso, ¿no es posible dejar las peores coincidencias en la base de datos (por ejemplo, un algoritmo más simple que escala bien en mysql), de modo que solo tiene que cargar, digamos 500 coincidencias en su aplicación, para que pueda mostrar un resultado que no está completo, pero casi perfecto. – RomanKonz