Всем привет!
Стоит задача разработать систему сообщений как в контакте. Диалоги, пользователи , сообщения.
Погуглив и проанализировав суть задачи, пришел к такой структуре базы данных:
$this->createTable('{{dlg_usr}}', [
'dlg_id' => 'int(11) NOT NULL',
'user_id' => 'int(11) NOT NULL',
'created_at' => 'timestamp NOT NULL',
]);
$this->createTable('{{dlg_msg}}', [
'id' => 'pk',
'author_id' => 'int(11) NOT NULL',
'type' => 'int(11) NOT NULL',
'message' => 'longtext NOT NULL',
'created_at' => 'timestamp NOT NULL',
'update_at' => 'timestamp NOT NULL',
]);
$this->createTable('{{dlg_msg_usr}}', [
'dlg_id' => 'int(11) NOT NULL',
'user_id' => 'int(11) NOT NULL',
'msg_id' => 'int(11) NOT NULL',
'is_new' => 'int(11) NOT NULL',
'hide_status' => 'int(11) NOT NULL',
'moderated_status' => 'int(11) NOT NULL',
'hide_at' => 'timestamp NOT NULL',
'moderated_at' => 'timestamp NOT NULL',
'created_at' => 'timestamp NOT NULL',
'update_at' => 'timestamp NOT NULL',
]);
Таблица 1. Таблица пользователей и идентификаторов диалогов.
Решил не заводить отдельную таблицу для ид диалогов. Так как кроме ид и даты создания хранить больше нечего. При создании нового диалога, в данную таблицу будут вноситься две и более записей с ид пользователей и ид диалога равным максимальному ид+1 из данной таблицы, ну и дата создания. При добавлении нового пользователя к диалогу будет вноситься соответственно одна запись с ид пользователя и ид диалога.
Таблица 2. Таблица сообщений.
В данную таблицу будут вноситься сами сообщения. Помимо текста сообщения, планирую хранить ид автора, тип сообщения (системные, пользовательские и т.д), ну и метки времени создания и редактирования.
Таблица 3. Связующая таблица сообщений и пользователей.
Цель данной таблицы связать сообщения и диалоги. При создании сообщения в диалоге, будет создано такое количество записей, которому соответствует количество пользователей в диалоге. Также данная таблица позволяет реализовать функционал удаления (скрытия) сообщения. В том случае если какой либо пользователь удалит сообщение из своего диалога, у остальных пользователей данное сообщение будет по прежнему отображаться в диалоге.
Хотелось бы выслушать конструктивную критику данной схемы и логики в целом. А также буду рад если укажете на возможные проблемы в дальнейшем при использовании такой схемы хранения сообщений.
Всем спасибо!