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 ответов

8 просмотров

я сохранил, пока что сложно, попробую перенести в 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?

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

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

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

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
75
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Всем привет! поделитесь, пож-та, как кто дебажил / решал проблему с 504 Time out ошибкой от nginx, когда стучишься на свой vapor сервер? в логах /var/log/nginx/error.log е...
Paul
24
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Как добавить ссылку в Быстрый доступ в Проводнике windows 10? Нашёл, как на power shell сделать, но может есть способ через Дельфи?
А
31
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Я тут пытаюсь переработать архитектуру подсистемы памяти ядра во что-то осмысленное. Есть pmm, который создает набор range’ей(пока что только для ядра, потом для юзерспейса), ...
Evg Resh
19
Обязательно ли смена методологии обучения алфавиту при смене алфавита(реформе письменности) - нет. А при смене глиненых табличек на попирус, нужно ли менять методологию обучен...
Spiker01
8
@rouse_79 а ты не знаешь простого способа определить что приложение запущено из под среды delphi?
Михаил
16
Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Карта сайта