@tosha_lol_daaa

Личные сообщения структура?

Проблема с пониманием реализации при структуре с двумя таблицами.
Условные таблицы:

messages: id | dialog_id | from_user | to_user | message | date..

users_messages: id | from_user | to_user | date
(messages.dialog_id === users_messages.id)

(если правильно понимаю)
В общем, если кратко:
Не понимаю как будет корректно сделать добавление, т.е - нужно делать проверки(?):
Юзер1 пишет Юзеру2, если существует такой диалог в таблице users_messages( проверять по dialog_id ? ) - добавляем сообщение в таблицу messages и ставим нужный dialog_id (?);
Если нету диалога - создаем в таблице messages соответственно.
Может кто объяснить ? Никак не могу понять вот всего этого.
Спасибо.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
IvanCher
@IvanCher
Мысли шире
Не понял зачем здесь таблица users_messages, если все связи уже есть в messages.
Вместо неё сделайте таблицу dialogs: id | from_user_id | to_user_id | date. А таблицу messages привести к виду: id | dialog_id | user_id | text | date
Алгоритм такой:
  1. Ю1 начинает диалог с Ю2 - добавляем запись в таблицу dialogs. В поля from_user_id и to_user_id заносим айдишники юзеров Ю1 и Ю2 соответственно.
  2. Ю1 пишет Ю2 - добавляем запись в таблицу messages. В поле user_id ставим айдишник юзера Ю1, в dialog_id ставим айдишник текущей беседы, с остальными полями думаю понятно.
  3. Ю2 отвечает Ю1 - добавляем запись в таблицу messages. В поле user_id ставим айдишник юзера Ю2, в dialog_id ставим айдишник текущей беседы.


Собственно всё :)

Если диалогов как таковых нет, то из алгоритма шаг 1 вычёркиваете и таблицу соответствующую удаляете.

Выборку затем делаете что-то типа:
/* Выбираем все сообщения в хронологическом порядке из диалога с id = :some_dialog_id */
SELECT m.*
FROM messages m
INNER JOIN dialogs d ON d.id = m.dialog_id
WHERE d.id = :some_dialog_id
ORDER BY m.date ASC
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы