2011-11-12 11 views
14

Estoy intentando crear un sistema de mensajería/chat. que puede almacenar conversación entre dos personas en un orden cronológico. Además, si el usuario A elimina la conversación, el usuario B aún debería tener acceso a la conversación hasta que desee eliminarlos.Diseño de base de datos para almacenar mensajes de chat entre personas

  1. Bandeja de entrada - Todos los mensajes recibidos por el usuario de varios usuarios se mostrarán con el último mensaje de ese hilo en particular.

  2. pantalla de conversación - Orden cronológico de la conversación entre el usuario A y el usuario B

Esta es la estructura básica de la base de datos que he llegado con. ¿Debo almacenar los mensajes dos veces en la base de datos?

  1. Identificación
  2. to_id
  3. from_id
  4. mensaje
  5. marca de tiempo
  6. leer
+0

no entiendo por qué las personas están dando un voto negativo a mi pregunta :( –

Respuesta

7

me gustaría utilizar una tabla de consulta para los mensajes que la tienda que tiene los derechos para ver ese mensaje

table->message     | table->messageUsers 
id->0, message->'hi', user_id->1  user_id->1, message_id->0 
             user_id->2, message_id->0 

De esta forma si un usuario elimina el mensaje que están en realidad sólo borrando su relación con el mensaje no el mensaje en sí solo elimínelos de la tabla messageUsers. o establecer un campo activo en 1 o 0.

+0

si elimino deja decir usuarios 1 mensaje. ¿Cómo sabrá el usuario 2 que el mensaje es del usuario 1 y no del usuario 3 o 4? –

+0

He actualizado la respuesta. Entonces, simplemente almacenaría en la tabla de mensajes que 'user_id' es la identificación del usuario que creó el mensaje. por ejemplo, si message-> user_id = 1 y en messageUsers elimina la capacidad del usuario 1 de leer ese mensaje, el usuario 2 aún verá el mensaje y quién lo creó. –

+0

Esto también está asumiendo que estás creando una base de datos relacional ... espero que lo estés. –

1

habrá dos mesas. nodos node_user

En la tabla nodos,

  • node_id
  • título
  • mensaje
  • timestamp

En la tabla node_user,

  • node_user_id (PK)
  • node_id
  • parent_node_id (por roscado)
  • from_id
  • to_id
  • timestamp
  • leer

Cuando el usuario A envía un mensaje al usuario B , primero almacene el mensaje en la tabla de nodos. Y luego, agregue dos registros en la tabla node_user. Cuando el usuario A elimina el mensaje, solo borre el primer registro en la tabla node_user. Cuando el usuario B elimina el mensaje, puede eliminar registros de ambos nodos y de la tabla node_user.

secuencia de mensajes,

  • Uso parent_node_id
+0

¿por qué tengo que almacenar el mensaje tres veces? –

+0

lo siento. Olvidé borrar la columna del mensaje en la tabla node_user. Editaré. No necesita almacenar el mensaje tres veces. Solo una vez en la tabla de nodos. Use la tabla node_user para almacenar el remitente y el destinatario. También funcionará si agrega las características CC y BCC más adelante. –

+0

he modificado mi pregunta ... para indicar claramente mis necesidades. Supongo que llamar a una bandeja de entrada no era apropiado. Muchas gracias –

1

Al principio pensé que cuando una persona lo borró usted podría dar vuelta hacia o desde que nula, pero que le hará perder que envió el mensaje o a quien fue dirigido.

Debería simplemente agregar un campo deleted_by que contendrá la identificación de la persona que lo eliminó o será nulo. Así que la hora de seleccionar los registros de la bandeja de entrada que tiene algo así como:

Select * From mensajes donde to_id = MyID y deleted_by <> MyID

cuando se elimina el mensaje que comprueba si el deleted_by es nulo, si eres tú actualice el campo deleted_by con MyID; si no lo está (significa que la otra parte lo eliminó también), elimine el registro.

Si desea tener la misma funcionalidad para hilos en lugar de mensajes (es decir, administrar la conversación y no un mensaje a la vez) debe tener otra tabla (MessageThreads) en la que tenga los campos from_id, to_id, deleted_by junto con un campo thread_id. en la tabla Mensajes, sustituye from_id to_id y deleted_by con thread_id.

Cuestiones relacionadas