El primer paso es siempre un análisis adecuado requisito. Supongamos que soy un Gerente de proyecto. Me conecto al sistema y muestra mi único proyecto como a tiempo. Un desarrollador viene a mi oficina y me dice que hay un retraso en su actividad. Selecciono la actividad del desarrollador y cambio su duración. El sistema sigue mostrando mi proyecto como a tiempo, así que felizmente dejar el trabajo.
¿Cómo crees que me sentiría si recibo una llamada telefónica a las 3:00 AM del cliente pidiéndome una explicación de por qué el proyecto ya no es a tiempo? Obviamente, bastante sorprendido, porque el sistema no me advirtió de ninguna manera. ¿Por qué sucedió eso? Porque tuve que esperar 30 segundos (¿por qué no solo 1 segundo?) Para la próxima ejecución de un trabajo programado para actualizar el estado del proyecto.
Eso no puede ser una solución. Se debe enviar una advertencia de inmediato al usuario, incluso si lleva 30 segundos ejecutar el proceso IsStale()
. Muestre al usuario una imagen loading...
o cualquier otra cosa, pero asegúrese de que el usuario tenga datos precisos.
Ahora, en cuanto a la aplicación, nada se puede hacer para huir de la emisión anterior: tendrá que ejecutar ese proceso cuando algo que afecta a algunos cambios de fechas de vencimiento. Sin embargo, lo que puede hacer es ejecutar innecesariamente ese proceso. Por ejemplo, mencionó que podría ejecutarlo siempre que el usuario inicie sesión. ¿Qué sucede si 2 o más usuarios inician sesión y ven el mismo proyecto y no cambian nada? No sería necesario ejecutar el proceso dos veces.
Whatsmore, si se asegura que el proceso se ejecuta cuando el usuario actualiza el proyecto, no será necesario para ejecutar el proceso en cualquier otro momento.En conclusión, este esquema tiene las siguientes ventajas y desventajas en comparación con la solución de "sondeo":
Ventajas
- Sin trabajo programado
- No se ejecuta el proceso que no sean necesarios (esto es discutible, ya que podría establecer una bandera
dirty
en el proyecto y sólo se ejecutan si está true
)
- No hay consultas innecesarias del valor
dirty
- El usuario siempre estará informado de la situación actual y real del proyecto (que es, con mucho, el elemento más importante a tratar en cualquier solución dada)
Desventajas
- Si una el usuario actualiza un proyecto y luego lo vuelve a cerrar en cuestión de segundos, el proceso se ejecutará dos veces (en el esquema de sondeo, el proceso podría no ejecutarse una vez en ese período, según la frecuencia que se programó)
- El usuario que actualiza el proyecto deberá esperar a que el proceso finalice
Cambiando a cómo implementa el sistema de notificación de una manera similar a StackOverflow, esa es una pregunta bastante diferente. Supongo que tienes una relación de muchos a muchos con usuarios y proyectos. La solución más simple sería la adición de un solo atributo de la relación entre esas entidades (la media tabla ):
Cardinalidades: Un usuario tiene muchos proyectos. Un proyecto tiene muchos usuarios
De esta forma, cuando ejecuta el proceso, debe actualizar el Has_pending_notifications
de cada usuario con el nuevo resultado. Por ejemplo, si un usuario actualiza un proyecto y ya no es a tiempo, debe establecer en true
el campo todos los usuarios Has_pending_notifications
para que se den cuenta de la situación. De manera similar, configúrelo en false
cuando el proyecto sea a tiempo (entiendo que solo desea asegurarse de que las notificaciones se muestren cuando el proyecto ya no esté a tiempo).
Tomando el ejemplo de StackOverflow, cuando un usuario lee una notificación, debe establecer la bandera en false
. Asegúrese de no utilizar marcas de tiempo para adivinar si un usuario ha leído una notificación: iniciando sesión no significa leyendo las notificaciones.
Por último, si la notificación en sí es bastante compleja, puede alejarlo de la relación entre los usuarios y los proyectos e ir a por algo como esto:
Cardinalidades: Un usuario tiene muchos proyectos . Un proyecto tiene muchos usuarios. Un usuario tiene muchas notificaciones. Una notificación tiene un usuario. Un proyecto tiene muchas notificaciones.Una notificación tiene un proyecto.
espero que algo de lo que he dicho ha tenido sentido, o darle alguna otra idea mejor :)
su método IsStale() que es lento – leora
Tiempo comparación sello no debe ser lento, pero su otra opción es añadir esta lógica en el lado de la base de datos. Si puede, cree un procedimiento almacenado que haga la comparación y devuelva el resultado como una columna adicional. – evasilchenko
IsStale() NO es solo una comparación de marca de tiempo.es un algoritmo más complicado para ver si los datos están desactualizados en función de una serie de factores – leora