2016-01-26 2 views
1

Я думаю, как реализовать схему базы данных для частного один-на-один пользовательский обмен сообщениями (используя Laravel). Все потоки только один к одному, поэтому никаких групповых сообщений или нескольких участников. Лучший пример - сайт знакомств, где каждый поток сообщений для пользователя представлен получателем.Единая схема базы данных пользовательских сообщений

Сначала я сделал простой подход к одной таблице. Пример:

id,sender_id,recipient_id,body 

Это прекрасно работает. Основная проблема, однако, заключается в том, что пользователь не может удалить разговор, пока другой пользователь сохраняет сообщения.

Другой подход состоит из трех таблиц: сообщений, потоков, участников. Это тот же подход, что и у нескольких участников, я просто ограничиваю только два. Затем, если пользователь удаляет поток, я могу просто удалить его из участников для этого потока.

Теперь вот проблема с этим подходом. Предположим, пользователь A отправляет сообщение пользователю B. Затем пользователь A удаляет поток (удаляется из участников потока). Пользователь B получает сообщения (он участник). Что, если теперь пользователь A снова отправляет сообщение пользователю B? Это фактически создаст новый поток, поскольку для этого пользователя будет потерян старый поток. Но сообщение действительно нужно перейти к старому потоку, так как между двумя пользователями всегда есть только один поток.

Я немного потерял, как реализовать это. Какую схему базы данных вы бы предложили для только один к одному? обмен сообщениями между пользователями, разрешая удаление потоков?

Заранее благодарен!

ответ

2

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

Это может быть реализовано путем изменения таблицы таким образом:

id, sender_id, recipient_id, hidden_to_sender, hiddent_to_recipient, body 

, так что, когда пользователь удаляет нить, все его сообщения помечены как скрытые для него (и только к нему) , Когда он отправляет новое сообщение другому человеку, он просто добавляет предыдущий поток, со скрытым установленным значением false для обоих partecipant.

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

+0

Звучит хорошо. Это делает реализацию намного проще! – tarokut

Смежные вопросы