Дизайн базы данных: частный чат, групповой чат и электронные письма
Связь между пользователями Facebook, похоже, хранится в одном длинном "разговоре". Таким образом, отправленные сообщения электронной почты и личные сообщения чата, обмен которыми все, похоже, являются частью одного продолжительного разговора.
Я думаю, что эта реализация хорошо работает для пользователей (по крайней мере, для меня). Я предполагаю, что дизайн таблицы для этой части может быть реализован следующим образом:
TABLE: message
- message_id
- timestamp
- from_user_id
- to_user_id
- message
Что делать, если я хочу поддерживать групповой чат? Я сделал бы что-то вроде этого:
TABLE: message
- message_id
- timestamp
- from_user_id
- message
TABLE: message_recipient
- message_recipient_id
- message_id
- to_user_id
Я думаю, это сработает. Тем не менее, мне интересно, если бы это имело смысл для пользователя, если бы я отображал все, что пользователь когда-либо сообщал кому-либо в один длинный разговор. Это, вероятно, не будет. Представьте себе разговор с Лицом A, смешанным с групповым разговором с Лицом A, B, C, D, смешанным с разговором с Лицом E и т.д....
Любое предложение о том, что можно использовать для использования?
Ответы
Ответ 1
Я считаю, что сообщение должно быть сущностью, независимо от платформы или отправителя/получателя, с полями id
, message
, timestamp
, а таблица отношений сообщений - как вы сказали - с id
, message_id
from_id
, to_id
.
Затем, если вы показываете единичный пользовательский разговор, вы можете показывать каждое сообщение между ними.
Для групповых чатов вы должны иметь таблицу с id
, title
, timestamp
, которая содержит основную запись группового чата, а другая таблица содержит пользователей, которые являются частью этого группового чата, с id
, group_chat_id
, user_id
.
Просто мое мнение и как я его реализую.
Изменить: Возможно, имеет смысл иметь from_id
для самого объекта сообщения, так как сообщение должно иметь уникальный идентификатор отправителя.
Ответ 2
Вы также можете группировать сообщения по темам.
Вы добавляете таблицу тем. Вы добавляете таблицу получателей, привязанную к теме. Сообщения также будут привязаны к теме.
Вы можете программным образом ограничить темы между двумя пользователями, посмотрев, в какой теме эти два пользователя у получателей.
Вы также можете отделить свои сообщения, указав им атрибут типа. Например, тип 0 будет сообщением "Входящие", тип 1 будет сообщением чата и т.д.
Если бы я хотел иметь произвольное количество получателей в одном из тем, я бы избежал компиляции from_id/to_id.