Дизайн базы данных для хранения сообщений чата между людьми
Я пытаюсь построить систему обмена сообщениями / чата. который может хранить разговор между двумя людьми в хронологическом порядке. Кроме того, если пользователь A удаляет диалог, пользователь B все еще должен иметь доступ к разговору, пока он не захочет удалить их.
Входящие-все сообщения, полученные пользователем от различных пользователей, будут отображаться вместе с последним сообщением из данного потока.
Экран разговора-хронологический порядок разговора между пользователь A и пользователь B
Это базовая структура базы данных, которую я придумал. Должен ли я хранить сообщения дважды в базе данных ?
- id
- to_id
- from_id
- сообщение
- отметка времени
- Читать
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