Дизайн базы данных для хранения сообщений чата между людьми
Я пытаюсь создать систему обмена сообщениями/чатов. который может хранить разговор между двумя людьми в хронологическом порядке. Также, если пользователь 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.