170 похожих чатов

Структура таблиц: conversations (id) conversation_participiants (id, user_id) conversation_messages (id, conversation_participiant_id, conversation_id, content) users (id) Связи: Conversation

(id) HasMany ConversationMessage (conversation_id)
ConversationParticipiant (conversation_id) HasMany Conversation (id)
ConversationMessage (conversation_id) BelongsTo Conversation (id)
ConversationParticipiant (user_id) HasOne User (id)
User (id) HasMany ConversationParticipiant (user_id)

Таким образом ты получаешь сильные явно выстроенные связи.

Как с ними работать:
1. Получить список Conversation у User.
SELECT conversation_id FROM conversation_participiants WHERE user_id = ?
INNER JOIN conversations ON conversations.id = conversation_participiants.conversation_id

2. При переходе в диалог получить список сообщений (предполагается, что мы знаем conversations.id)
SELECT * FROM conversation_messages WHERE conversation_id = conversations.id

16 ответов

31 просмотр

я сохранил, пока что сложно, попробую перенести в sequelize

МСМК- Автор вопроса
21th
я сохранил, пока что сложно, попробую перенести в ...

Да тебе просто добавить моделей и таблиц в базу. Ну и связи немного изменить

МСМК
Да тебе просто добавить моделей и таблиц в базу. Н...

кстати, есть пакет sequelize-auto-models, он вроде даже связи автоматом генерит, на основе внешних ключей из базы

МСМК- Автор вопроса
Sergey
кстати, есть пакет sequelize-auto-models, он вроде...

А вот этого я не знаю. Я в жс с муськой не работал

Я вроде свой способ придумал, может не такой хороший как у тебя, я его не совсем понял, но тоже мне кажется хороший. 2 юзера будут связываться через dialogs с ассоциациями "user1" и "user2". Зависимость message и dialog один ко многим. И таким образом запросив message я могу вставить туда пользователей с помощью include: [{model: user, as: "user1"}, {model: user, as: "user2"}]. И искать сообщения тоже довольно просто. Мне кажется это сработает точно

21th
screenshot Я вроде свой способ придумал, может не такой хорош...

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

Joe Beretta
такой способ юзаем для эмейлов, где у нас переписк...

классно будет если покажешь как лучше сделать

21th
классно будет если покажешь как лучше сделать

да я хз пока что как лучше) но это вариант вполне рабочий. т.е. сущность dialog/conversation хранит мета инфу о переписке юзеры, какое самое новое сообщение (чтобы в списке отображать последнее сообщение), какой статус (для каждого участника - прочитан/нет) а уже в списке сообщений привязка по dialogId но минус такого подхода - если у тебя в эмейлах рассылка, тогда чтобы придерживаться такой структуры, тебе нужно создавать копии сообщения для каждого диалога отправителя и также в поле «получатели» выборку тянуть через dialogId

Joe Beretta
такой способ юзаем для эмейлов, где у нас переписк...

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

Victor Nikul
хех, действительно проблема, у нас была задачка по...

да, я как раз про это говорил выше) в случае с noSQL (монга) - это просто делается) а вот с pgsql (если считать, что json у них уже шустрый), то достаточно json поле для meta добавить и его расширять

нет, не проще будет( ибо чтобы это все вычислить ему нужно на любой запрос (если это не дефолтный), запросить +1 запрос на то, чтобы подтянуть последнее сообщение

Joe Beretta
нет, не проще будет( ибо чтобы это все вычислить е...

а ну да, точно, я просто не правильно представил у себя в голове как это должно выглядеть

МСМК- Автор вопроса
МСМК
screenshot

а что значит ConversationParticipiant?

МСМК- Автор вопроса
21th
а что значит ConversationParticipiant?

участник конференции

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта