sql >> Base de Datos >  >> RDS >> Database

Modelo de base de datos para un sistema de mensajería

A la gente le encanta comunicarse. A menudo bromeamos con que cualquier sistema de software siempre se convierte en un sistema de mensajería. Este artículo explicará los requisitos del sistema y el enfoque paso a paso para diseñar un modelo de datos para un sistema de mensajería.

Requisitos en pocas palabras

La funcionalidad principal de un sistema de mensajería en una aplicación es enviar notificaciones/mensajes a un usuario o a un conjunto de usuarios. Nuestro sistema también permite enviar mensajes a un grupo de usuarios. Obviamente, los grupos de usuarios se pueden formar en función de algunos parámetros, como los privilegios de acceso, la ubicación geográfica de los usuarios, etc.

Este sistema permite que los receptores respondan a los mensajes. También realiza un seguimiento de quién ha leído el mensaje y quién no.

Además, el sistema tiene un recordatorio incorporado mecanismo que permite a un remitente crear un recordatorio y luego envía un recordatorio a todos los receptores en consecuencia.

Entidades y Relaciones

En este modelo de datos, user y message son las principales entidades para almacenar los detalles de los usuarios y los mensajes.

Columnas en el user la tabla serían atributos relacionados con el usuario como first_name , last_name , etc.

Algunas columnas autoexplicativas en el message la tabla sería subject , message_body , create_date y expiry_date . También agrego una columna de clave externa llamada creator_id en esta tabla que se refiere al id columna de user mesa. Como su nombre indica, significa la identificación del creador de un mensaje. Dado que siempre habrá un creador para un mensaje, mantengo esta columna solo en la tabla de mensajes. Quizás se pregunte por qué hay una expiry_date columna en la tabla. He agregado esta columna para administrar recordatorios en un mensaje. Explicaré más sobre esta columna más adelante en este artículo.

La tabla más importante en este modelo de datos es message_recipient . Diría que todo el modelo de datos gira solo en torno a esta tabla. Uno de los principales objetivos detrás de la creación de esta tabla es mantener el mapeo entre los mensajes y sus destinatarios. Por lo tanto, el recipient_id La columna en esta tabla significa los ID de los destinatarios, y esta columna se refiere a la columna de ID de user mesa.

Cuando se envía un mensaje a un destinatario, se insertará un registro en esta tabla con la identificación del destinatario en el recipient_id columna.

Ahora puede que se pregunte cuál es el recipient_group_id columna significa en esta tabla. Aquí, primero debo explicar cómo este modelo puede extenderse a un requisito de enviar mensajes a múltiples destinatarios a la vez.

Enviar mensaje a un grupo

Necesito otra tabla, a saber, group , para guardar los detalles del grupo. Dado que existe una relación de muchos a muchos entre el user y group tablas, es decir, un usuario puede ser parte de más de un grupo, crearé otra tabla llamada user_group .

Por ejemplo, si se forma un grupo con 25 usuarios, habría 25 registros, uno para cada usuario, en el user_group mesa.

Volvamos al message_recipient mesa. Agrego una referencia a la clave principal del user_group tabla en el message_recipient mesa. Lo llamo recipient_group_id . Esta columna contendrá el valor del grupo de usuarios para el que se envía el mensaje.

Ahora, siempre que se envíe un mensaje a un grupo, se insertarán varios registros en el message_recipient tabla basada en la cantidad de usuarios en el grupo y el recipient_group_id se registrará en consecuencia contra todos esos registros.

Permítanme ilustrarlo más con un ejemplo. Supongamos que se envía un mensaje a un grupo de 10 personas. En este caso, un total de 10 registros, uno para cada recipient_group_id del grupo, se insertará en el message_recipient mesa.

Tenga en cuenta que si el mensaje se envía a un usuario, no a un grupo, el recipient_group_id la columna permanece vacía. En este caso, el user_id directo se registrará bajo el recipient_id columna.

Agregaré una columna más llamada is_read en la tabla para mantener una bandera contra un mensaje-usuario que indica si el usuario lee o no el mensaje.

Entrada de clave única message_recipient tabla:debe haber una clave única compuesta en las columnas message_id , recipient_id y recipient_group_id , para garantizar que solo exista un registro para una combinación única de estas columnas.

Mantengo el is_active columna en todas las tablas, excepto las tablas message y message_recipient, para habilitar una 'eliminación temporal' de registros. Dado que agregué una expiry_date columna en la tabla de mensajes, un is_active la columna no es necesaria. Además, esta columna no es necesaria en el message_recipient porque un mensaje no se puede revertir directamente una vez que se envía. Sin embargo, se puede desactivar actualizando expiry_date para el mensaje a una fecha en el pasado.

Responder a un mensaje

Ahora suponga que el sistema permite a los usuarios responder a los mensajes recibidos. Extiendo la misma tabla message para satisfacer este requisito en lugar de crear una nueva tabla para las respuestas. Agregaré una columna llamada parent_message_id establecer una relación jerárquica entre los mensajes. Insertaré un nuevo registro para el mensaje de respuesta y actualizaré el parent_message_id columna para mensajes de respuesta. Este modelo admite n niveles de relación jerárquica, es decir, la respuesta en el mensaje de respuesta también se puede rastrear a través de este modelo.

Panel para ver el '% de lectura' de cada mensaje

El is_read se registra en cada registro de usuario de mensaje. El valor de este indicador sigue siendo CERO hasta que el usuario lee el mensaje. Se actualizará a UNO tan pronto como el usuario lea el mensaje. Según el valor de la columna, se puede determinar el "% de lectura" de un mensaje que se envía a un grupo.

Permítanme escribir un ejemplo de SQL para obtener dicho informe:

SELECT msg.subject, sent_to, 
       msg.create_date, (summ / countt) * 100 AS Read_Per
FROM (SELECT msg.subject, grp.name as sent_to,  msg.create_date, 
      SUM (is_read) AS summ, COUNT (is_read) AS countt
      FROM message_recipient msgrec,  message msg,  
           user_group ug,  group grp
      WHERE  msgrec.message_id = msg.id
      AND msgrec.recipient_group_id = ug.id
      AND ug.GROUP_ID = grp.id
      AND msgrec.recipient_group_id IS NOT NULL
      GROUP BY msg.subject, grp.name, msg.create_date
      UNION
      SELECT msg.subject, u.first_name || ' ' || u.last_name as sent_to,
      msg.create_date, SUM (is_read) AS summ, COUNT (is_read) AS countt
      FROM message_recipient msgrec, MESSAGE msg,  user u
      WHERE msgrec.message_id = msg.id
      AND msgrec.recipient_id = u.id
      AND msgrec.recipient_group_id IS NULL
      GROUP BY msg.subject, name, msg.create_date);


Asunto Enviado a Enviado % de lectura
La entrega del proyecto vence el martes Equipo de ejecución del proyecto 13/09/2015 08:15 42 %
Nos vemos el lunes Juan D 9/10/2015 13:30 100 %
Sincronizar el entorno de desarrollo con la producción Equipo de DBA 9/9/2015 09:11 80 %
Cierre de NCR de auditoría equipo NSS 9/9/2015 17:50 45 %

Mecanismo de recordatorio

Para una función de recordatorio, agregaré las siguientes columnas en la tabla de mensajes:

  • Is_reminder – Esta columna indica si se requiere o no un recordatorio para el mensaje.
  • Reminder_frequency_id – Esta columna indica la frecuencia del recordatorio. ¿Debería ser diario o semanal?
  • Next_remind_date – Esta columna contiene la fecha en que se debe enviar el próximo recordatorio. El recordatorio se enviará el next_remind_date para los usuarios para quienes el indicador 'is_read' sigue siendo CERO. Se calculará un nuevo valor para esta columna cada vez que se envíe un recordatorio.
  • Expiry_date – Esta columna es la fecha límite en la que ya no se enviarán recordatorios a los usuarios.

Cálculo de la next_remind_date sería el siguiente:supongamos que se envía un mensaje a los usuarios el lunes 14 de septiembre con el 5 de octubre como fecha de vencimiento. El mensaje se envía con una frecuencia semanal de recordatorios. En este caso, se enviarán recordatorios a los usuarios el 21 y el 28 de septiembre para responderles por correo electrónico, y una última vez el 5 de octubre para instarles a que respondan en las próximas 24 horas.

Modelo de datos finales



Conclusión

Uno de los mejores usos de este sistema de mensajería es enviar notificaciones a los usuarios que han estado inactivos en el sistema durante mucho tiempo. Estas notificaciones se pueden enviar con un mecanismo de recordatorio habilitado y las notificaciones se enviarán a los usuarios hasta que los usuarios respondan a la notificación. Los usuarios se desactivarán a partir de la fecha de vencimiento si no se recibe ninguna respuesta a las notificaciones.

Tenía la intención de construir un modelo de datos para un sistema de mensajería completamente funcional, que puede encajar en una variedad de sistemas para enviar mensajes/notificaciones. Siéntase libre de compartir sus puntos de vista/entradas/comentarios sobre el artículo.