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

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

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

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

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

  • ID
  • to_id
  • from_id
  • сообщение
  • Отметка времени
  • прочитать

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

В таблице node_user

  • node_user_id (ПК)
  • node_id
  • parent_node_id (для потоков)
  • from_id
  • to_id
  • Отметка времени
  • прочитать

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

Резьбовое сообщение,

  • Использовать parent_node_id

Ответ 3

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

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

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

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

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