2009-07-25 39 views
9

Me estoy poniendo en práctica un sistema de notificación y ver si estas sugerencias son válidas para establecer, si uno es mejor que el otro o una solución mejor es disponible:Sugerencias para un sistema de notificación de usuario en MySQL y PHP

una notificación se agrega a la base de datos. Un invitado/usuario identificable inicia sesión o usa el sitio. Son recibidos con notificaciones que no han visto antes con la opción de cerrar o leer más tarde.

  • La tabla de notificaciones almacena textos de notificación y Id.
  • Opción 1: Alertas tabla almacena todos los usuarios que han leído la notificación
  • Opción 2: Alertas tabla almacena todos los usuarios que no han leído la notificación

Son estas opciones más de lo mismo , es mejor agregar potencialmente más de 100.000 alertas y, a medida que esos usuarios descartan o interactúan con el aviso, su estado cambia o se elimina la alerta. Esto podría convertirse en una tabla muy grande ...

¿Qué es una configuración más extensible para las notificaciones personalizadas basadas en la actividad del usuario?

Respuesta

13

No lo haría de esa manera. Almacenaba un registro para cada uno (usuario, notificación) y marcaba cada registro como leído o no leído. Luego puede grabar cuando lo lean, lo que podría ser importante según su aplicación (por ejemplo, si necesita algún tipo de pista de auditoría).

100k registros no es muy grande. No se preocupe por el tamaño hasta que obtenga al menos 10 millones de registros. Si es necesario archivarlos en algún momento. Pero debe hacer algunas estimaciones sobre la rapidez con la que generará 10 millones de registros. Si son 3 días, entonces sí tienes un problema. Si son 3 años, entonces no.

Esta opción, por supuesto, tiene el texto de notificación en una tabla separada. Esto también debería escalar extremadamente bien con un número aún mayor de mensajes mientras selecciona los mensajes no leídos para un usuario (indexados) y puede unirse para obtener el texto de notificación (si su tabla tiene decenas de millones de registros)) o selecciónelos y luego seleccione por separado los mensajes.

Particionar la tabla (usuario, notificación) es fácil: se basa en rangos de usuario.

Y cuando los usuarios eliminan mensajes, generalmente solo debe marcarlo como eliminado en lugar de eliminarlo. La mayoría de las veces no hay muchas razones para eliminar nada en una base de datos.

+0

Quiero hacer un seguimiento de los tiempos de lectura, etc. y tener un seguimiento de auditoría como dices tan rara vez si alguna vez lo eliminas, simplemente cambia el estado a d para eliminar, por ejemplo. Mi principal preocupación era el tamaño, por lo que tal vez las notificaciones de lectura podrían agregarse a una tabla separada; de lo contrario, ¿podría archivarse en un archivo de registro fuera de la base de datos? Espero filtrar regularmente aunque una mesa masiva podría causar problemas. Estoy pensando en 100,000 registros por notificación, así que tomaría 2 semanas/millón de registros –

1

Como alternativa, puede almacenar un conjunto de referencias a las notas que aún no se han leído por perfil de usuario y luego eliminarlas cuando se muestran (caso de uso general probablemente leer todas las notas en una vez). De esta forma, solo tiene una pequeña consulta cuando extrae un usuario individual, y su costo se encuentra en el tiempo de inserción para el mensaje global, en lugar de filtrar una gran tabla de mensajes no leídos.

5

estoy codificación de mi nuestra página web y tienen la misma pregunta, pero resuelto a mí mismo de esta manera:

  1. tienda todos los registros en una tabla de notificaciones.
  2. Read/Unread = true/false
  3. CRON Job: borre las 10 notificaciones anteriores si el usuario tiene más de 50 notificaciones.

Creo que Facebook periódicamente ejecuta un trabajo cron para eliminar notificaciones antiguas que no podemos ver después de que se ha alcanzado nuestra notificación de límite.

Cuestiones relacionadas