Дизайн базы данных для хранения сообщений чата между людьми



Я пытаюсь построить систему обмена сообщениями / чата. который может хранить разговор между двумя людьми в хронологическом порядке. Кроме того, если пользователь A удаляет диалог, пользователь B все еще должен иметь доступ к разговору, пока он не захочет удалить их.





  1. Входящие-все сообщения, полученные пользователем от различных пользователей, будут отображаться вместе с последним сообщением из данного потока.



  2. Экран разговора-хронологический порядок разговора между пользователь A и пользователь B



Это базовая структура базы данных, которую я придумал. Должен ли я хранить сообщения дважды в базе данных ?




  1. id

  2. to_id

  3. from_id

  4. сообщение

  5. отметка времени

  6. Читать

666   3  

3 ответов:

Я бы использовал таблицу поиска для сообщений, в которой бы хранилось, кто имеет права на просмотр этого сообщения

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

Таким образом, если пользователь удаляет свое сообщение, он фактически просто удаляет свое отношение к сообщению, а не само сообщение. вы просто удалите их из таблицы messageUsers. или установите активное поле равным 1 или 0.

Сначала я думал, что, когда один человек удалил его, вы можете просто обратиться либо к нулю, либо к нулю, но это заставит вас потерять, кто отправил сообщение или кому оно было адресовано.

Вы должны просто добавить поле deleted_by, которое будет содержать идентификатор человека, который его удалил, или будет иметь значение null. Таким образом, при выборе записей из папки "Входящие" у вас есть что-то вроде:

Выберите * из сообщений, где to_id = MyID и deleted_by MyID

Когда вы удаляете сообщение, вы проверяете если deleted_by равно null, то если это так, то вы обновите поле deleted_by с MyID, если нет (это означает, что другая сторона удалила его также), то вы удаляете запись.

Если вы хотите иметь ту же функциональность для потоков вместо сообщений (т. е. управлять диалогом, а не одним сообщением одновременно), вы должны иметь другую таблицу (MessageThreads), в которой у вас есть поля from_id, to_id, deleted_by вместе с полем thread_id. в таблице сообщений вы заменяете from_id на _id и deleted_by с thread_id.

Будет две таблицы. узлы node_user

В таблице узлов,

  • node_id
  • название
  • Сообщение
  • отметка времени

В таблице node_user,

  • node_user_id (PK)
  • node_id
  • parent_node_id (для threaded)
  • from_id
  • to_id
  • отметка времени
  • Читать

Когда пользователь A отправляет сообщение пользователю B, сначала сохраните сообщение в таблице узлов. А затем добавьте две записи в таблицу node_user. Когда пользователь A удаляет сообщение, удалите только первую запись в таблице node_user. При удалении сообщения пользователем B можно удалить записи как из узлов, так и из таблицы node_user.

Потоковое Сообщение,

  • Используйте parent_node_id

Comments

    Ничего не найдено.