2009-09-02 11 views
5

Tengo un sitio comunitario bastante complejo (en php/mysql) con una cantidad de "cosas" que los usuarios registrados pueden "mirar".¿Cómo creo el sistema "Watch"? Buscando las mejores prácticas

"cosas" son: Mensajes, comentarios, actualizaciones de eventos, cambios de estado de usuario, etc. Por lo menos 10 tipos diferentes de "cosas" están disponibles y un usuario puede ver "cosas" de cualquier otro usuario (Piense facebook)

"Ver" significa: un usuario puede ver cualquier "cosa" y ver un feed de todas las actualizaciones/adiciones a cada "cosa" a través de todo tipo de "cosas".

he construido una aplicación similar con muchos menos "cosas" que pueden ser vistos y mi configuración es básicamente esto:

'relojes' campos de la tabla: ID, ID de usuario, itemId [id en la tabla extranjera] , itemClass [ID de referencia de la tabla extranjera]

Un usuario podría agregar un 'reloj', se creó un registro en la tabla 'relojes' y luego sondearíamos esa tabla (y la almacenaríamos en caché) para que navegaran nosotros notaba (en la interfaz de usuario) si ya estaban viendo un elemento en particular o no, MÁS podían ver y administrar una lista de todo el sistema que estaban viendo. Bastante simple.

Entonces, (después de esa larga introducción), este sitio de comunidad que estamos construyendo necesitará escalar más dramáticamente. Miles de usuarios verán cientos de "cosas" y tendremos que sondear no solo la tabla de "relojes" per se, sino también cada mesa extranjera, unirnos para obtener los detalles que llenen el feed de visualización de cada usuario.

Si no está seguro de lo que quiero decir, solo piense en el feed de amigos de Facebook que tiene en su página de inicio de Facebook. ¿Cómo se actualiza eso sin ejecutar toneladas de consultas?

+0

He estado trabajando en el mismo tema durante al menos 6 meses, no he progresado en la búsqueda de una "buena" solución pero – JasonDavis

+0

mejor describo lo que se puede ver. Usted dice "cosas": publicaciones, comentarios, etc. ¿Alguien mira todas las publicaciones, o solo ciertas publicaciones, todos los comentarios o solo ciertos comentarios? cómo almacenar la información de este reloj será fundamental, pero necesito entenderlo mejor antes de poder hacer una recomendación. –

+0

@KM - Buena pregunta. Aquí está el desglose simple (espero): si observas a un usuario, recibirás una notificación de todas las publicaciones, comentarios, imágenes, cambios de estado y comentarios sobre los cambios de estado de ese usuario. Si mira una publicación o una imagen, recibirá una notificación de todos los comentarios realizados a esa publicación o imagen. Si mira un tema de noticias, recibirá una notificación de todas las publicaciones dentro de ese tema de noticias (no comentarios). – phirschybar

Respuesta

1

lo mejor que puede hacer en términos de escalabilidad e ignorar las reglas de normalización (que a veces tiene que hacer por motivos de rendimiento) sería almacenar los relojes en una tabla como la que ya tiene, pero también agregar una columna de TEXTO a las tablas de contenido donde almacena de forma delimitada todas las identificaciones de los usuarios que miran ese artículo.

cuando se actualiza el elemento, usted tiene una lista práctica de personas preconfiguradas para notificar sin gastos adicionales.

y cuando un usuario quiere ver lo que está viendo, tiene sus tablas normalizadas eficientes.

vbulletin hace esto, creo, para hacer un seguimiento de quién ha leído un hilo en particular.

+0

esto es bueno. no había pensado en almacenar los identificadores con el contenido real. de mucha ayuda. – phirschybar

0

Cuando alguien hace una actualización, podría notificar a todos los "observadores" que algo ha cambiado, dándole una referencia para buscar. Entonces cuando inicio sesión, el sistema consulta mi tabla y descubre que alguna "cosa" hizo una actualización. A continuación, recupera esa actualización y me la muestra en la página. Es algo así como un modelo de publicación/suscripción.

EDIT (para incluir mi comentario):

Cada usuario tendría una fila en una watch_table asociado con ellos. Así que me adjunté como observadora a las actualizaciones de estado de mi novia, almacenadas en su registro de usuario. Luego, cuando se actualice, recorra su lista de observadores, colocando un registro en el registro de cada observador en el watch_table. Entonces cuando inicio sesión, mi registro watch_table es consultado, y veo en la interfaz de usuario que su estado se actualizó.

Lo anterior está usando algunas semánticas de las actualizaciones de estado de Facebook.

+0

Este fue el enfoque que al principio parece más atractivo, pero ¿cómo se almacenan esos datos? No estamos "notificando" por correo electrónico, estamos almacenando la actividad del reloj. Si tengo 1000 usuarios mirando lo mismo (probable), entonces tengo que escribir 1000 filas cada vez que se realiza una actualización. – phirschybar

+0

Cada usuario tendría asociada una watch_table. Así que me adjunto como observador a las actualizaciones de estado de mi novia, almacenadas en su tabla de usuarios. Luego, cuando se actualice, recorra su lista de observadores, colocando un registro en la watch_table de cada observador. Entonces cuando inicio sesión, mi watch_table es consultada, y veo en la interfaz de usuario que su estado se actualizó. – geowa4

+0

Lancé ese comentario como una edición. – geowa4

2

El otro enfoque de su sondeo sería configurar su sistema para que se observaran "actualizaciones de reloj" después de la creación de un elemento.

La lógica sería:

  1. mensaje se crea
  2. Como paso final en la creación de correos, una consulta se ejecuta en los relojes mesa para observar a la gente para los nuevos Mensajes
  3. como relojes se encuentra que escribe una entrada a la "actividad" de esos usuarios o al feed de visualización .
+0

yes - el mismo tipo de concepto que la respuesta de geowa4. Realmente me gusta esto. Pero me preocupa tener grabaciones masivas en el DB cada vez que se realiza una actualización. – phirschybar

+0

llámame si esto es descuidado, pero ¿qué ocurre si acabo de escribir un registro por actualización en la tabla de "actividad" y tengo una lista delimitada por comas de identificadores de usuario en un campo de "observadores". Entonces puedo usar FIND_IN_SET de MySQL para obtener las personas relacionadas cuando sea necesario. ¿Es esto malo? – phirschybar

+0

¿No tendrá escrituras masivas de cualquier manera: en la creación de "cosa" o cuando sondee los artículos + relojes? WRT su solución find_in_set, va a tener problemas de cualquier manera, es una elección de su propio tipo de escenario de veneno. –

0

En cada operación de guardado, deberá determinar si se trata de un elemento "mirado" y registrarlo en una nueva tabla. tendrá que guardar, qué tipo de elemento es, quién lo está mirando, etc. cuando necesite mostrar los elementos observados, consultará esta nueva tabla que será rápida.

+0

este parece ser el consenso. y me gusta mucho Pero la gran pregunta para mí ahora es cómo almacenar "quién lo está viendo". Vea mi comentario sobre FIND_IN_SET bajo la respuesta de Mike Buckbee. ¿Pensamientos? – phirschybar

0

Puede usar las fechas para hacer un seguimiento de lo que el usuario ha visto o no. Cuando un usuario inicia sesión, inicia sesión en una fecha/hora determinada. Cuando el usuario inicie sesión de nuevo más tarde, puede ejecutar consultas sobre todas las "cosas" que están siendo "vistas" por ese usuario que sean más recientes que la última fecha de inicio de sesión. Esto crearía la lista de lectores sobre la marcha y no en cada actualización de "cosas".

0

En términos de patrones, una cosa a tener en cuenta aquí es el patrón clásico de "Escucha"/"Notificación de evento"/"Observador". Desea asociar a las personas que están generando los eventos y a las personas que los escuchan, para que no tenga que modificar los generadores de eventos después de agregar un nuevo oyente.

De hecho, disparando una notificación "¡He cambiado!" o "¡Soy una nueva publicación!" después de una modificación relevante del objeto observable, y mirando en una tabla que registró a todos los oyentes, parece un buen enfoque.

0

Eche un vistazo al servicio de notificaciones SQL de MSFT. Aunque ya no es compatible con SQL Sver 2008, su documentación describe un motor de notificación robusto. Algo que puede, o no puede, querer modelar, según sus necesidades.

Cuestiones relacionadas