|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
Таблицы и их связи для месенджера на сервере26.03.2023, 12:42. Показов 4900. Ответов 47
Всем привет.
Пишу для себя в качестве тренировки клиент и сервер месенджера на Qt. И та и другая часть работают, сервер регистрирует юзера, юзер заходит, все норм. Но теперь нужны таблицы для сохранения сообщений(группового чата и чата между 2 людьми) Таблицы: User(id, name, pass, email) Chat(id, name) Message(user_id, chat_id, timestamp, message) Таблица Chat по моему мнению хранит имена чатов для всех общений как для двух так и для групповых. Вопрос в именовании. Например User1 и User5. 1 решил написать 5 юзеру, когда он выбрал его и написал мы создали имя их чата и внесли в таблицу(Как формировать имена для их чата и как определять их чат если потом 5 юзер выбрал 1 и пишет ему?). Таблица Message тут по сути все сообщения для всех видов чатов. Правильно ли в однйо таблицу хранить все эти данные для всех юзеров, или для каждого юзера своя таблица всех его общений? Если да то как лучше формировать связи? И еще вопрос, на данном этапе я использую SQlite, стоит ли продолжать на нем в данном проекте работать или лучше перейти на MySQL или на PostgreSQL? Заранее благодарю отозвавшихся за правки и советы.
0
|
|
| 26.03.2023, 12:42 | |
|
Ответы с готовыми решениями:
47
Какая ОС должна быть на сервере для связи с приложением под iOS? Как установить связи для подчиненной таблицы?
|
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
| 29.03.2023, 13:09 [ТС] | |
|
Про то что id должен быть у юзера я тоже не понял зачем, по мне так странная вещь и не правильная.
По поводу определения участника группы, вот в дизайнере сделал набросок, вроде я правильно создал все связи и внешние ключи. https://dbdesigner.page.link/vxxW3jJ4tMHrYJ7f8 Но сейчас столкнулся с ситуацией, я хочу создать чат с выбранным юзером, мне надо определить для user1 и user3 есть ли для них в таблицу userchat(user_id, chat_id) общая запись в chat_id и понять какая. Если есть общая chat_id то значит у них есть общая группа и создавать новую не нужно а только определить номер id их комнаты(чата). Мне кажется я правильно расписал как должен работать поиск их общего чата. Но ведь у данных юзеров могут быть и другие групповые чаты где они так же участвуют.
0
|
|
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
||||
| 30.03.2023, 14:18 | ||||
|
0
|
||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
| 31.03.2023, 00:20 [ТС] | |
|
Вот смотрите, при выборе юзера я посылаю серверу запрос на создание чата, в таблице Chat создал запись, после в таблице ChatUser создаю связь (user_id, chat_id).
А если у них уже был чат но с другим номером? По этому я и думаю что логичнее в таблице найти для юзеров существование общей связи с чатом, и если нету то тогда только создавать. Если я не прав то обьясните почему?
0
|
|
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
|
| 31.03.2023, 09:32 | |
|
SektorCT, не понимаю, при каком таком "выборе юзера"? Кто его выбирает? Когда? Зачем?
1. Пользователь логинится на сервере 2. получает список чатов и список всех пользователей 3. каждый чат содержит список пользователей в нем участвующих 4. для начала общения подключается к тому или иному чату или создает свой Возможность создавать чаты с разными именами, но с одинаковым набором участников - не баг, а фича - чаты могут быть тематическими. Одни и теже участники могут в одном чате обсуждать рабочие вопросы, а в другом мемасы про котиков. Пытаться гарантировать единственность подмножеств пользователей, пусть чисто математически задача тривиальная, но довольно дорогая, а значит требует обоснования - действительно ли это нужно и так ли страшно (критично) если такая единственность не будет гарантироваться? И, как я уже сказал выше, содержание таких подмножеств, как раз напротив, может быть скорее полезно, чем вредно.
0
|
|
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
| 01.04.2023, 12:13 [ТС] | |
|
С тем что вы описали про наличие чатов и списки участников это я понял, логично.
Могли бы подсказать как будет выглядеть запрос для 2 таблиц user(id, name), chat(id, name) и UserChat(user_id, chat_id) чтобы для актуального пользователя получить список всех чатов где он присутствует и всех остальных кто так же в чате? Как понимаю такой запрос должен создать create view как виртуальную таблицу с нужным выводом?
0
|
|
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||||||
| 02.04.2023, 15:19 [ТС] | ||||||
|
В общем я тут пытался придумать запросы нужные, первое что я хочу получить так это все чаты где присутствует User1
Потом как я понимаю надо сделать выборку по полю chat_id из данных SELECT чтобы для каждого chat_id получить все имена, и вот тут уже я застрял. Может кто посоветовать?
0
|
||||||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
||||||
| 02.04.2023, 19:28 | ||||||
|
Все чаты в которых состоит юзер выбираются из таблицы связи user_chat по id пользователя, а чтобы в этой же выборке получить имя пользователя нужно объединение с таблице юзеров, что-то вроде
0
|
||||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||||||
| 02.04.2023, 23:19 [ТС] | ||||||
|
Спасибо, весь день копаюсь и читаю книгу по sql, не смог написать пока нормальный запрос.
Еще один вопрос, а если надо имея имя юзера получить таблицу где все его чаты а в соседней всех тех кто в общих с ним чатах состоит? Я так и не смог пока понять как имея id чата заполнить всех тех кто в нем сидит. Добавлено через 1 час 14 минут Вроде получилось, но результат это id именно юзеров по чатам, по сути то что и хотел я. Но хочу получить именно Имя юзера и номер комнаты. Но сделал все таки не сам а почерпнул направление в решении из книги
0
|
||||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||||||
| 04.04.2023, 16:21 [ТС] | ||||||
|
В общем получилось у меня
0
|
||||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||
| 08.04.2023, 12:30 [ТС] | ||
|
То есть каждый чат пока что грузится с сервака. Но я хочу реализовать (кеш) чтобы чаты у каждого юзера хранились еще и у себя и грузились при включении не с сервера а со своей машины. По этому вопрос, как лучше вставить такую реализацию в работу еще и с серверным хранением? Какой должен быть порядок отправки и получения сообщений? И еще 1 вопрос, можно ли как то при получении данных из таблицы их отсортировать чтобы читать в контейнер не с начала и до конца а с конца и до начала? Спасибо.
0
|
||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
||||||||
| 08.04.2023, 14:28 | ||||||||
0
|
||||||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
| 08.04.2023, 15:47 [ТС] | |
|
Спасибо, попробую разобраться с этим. И такой вопрос, как я понимаю сам клиент общается со своей базой сообщений, а уже позади происходит хеширование этой базы с основной сервера? Я именно про порядок работы.
И по поводу сортировки, нашел пример проекта chapter4-models в основных примерах. Там используется QSqlTableModel и как я понял у него есть setSort(2, Qt: escendingOrder). Вот я и хочу не как бы сортировать а забрать данные из таблицы в обратном порядке.
0
|
|
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
| 08.04.2023, 23:30 [ТС] | |
|
Нужен совет по запросу, смысл такой:
есть изеры, user1, user2, user3, user4. В одном чате с user1 находится user2, еще один чат состоит из user1, user2, user3. user1 задает поиск по слову user. Нужно найти соответствие со всеми чатами user1 где другие подпадают под поиск. То есть результат будет такой что user2 будет вынесен 2 раза так как он с ним в 2 группах, что-то типа (name, numberChat). Но если с user4 нету общего чата то в numberChat будет занесено 0. Знаю что через 2 SELECT и между ними INTERSECT можно получить пересечения для юзеров но это мало дает толку.
0
|
|
|
9147 / 6176 / 594
Регистрация: 27.03.2013
Сообщений: 20,047
|
|
| 09.04.2023, 09:04 | |
|
Таблицы и сервер, это практически даже мне понятно.
А - месенджер, это в куда нужно совать?
0
|
|
|
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
|
|
| 09.04.2023, 10:53 | |
|
0
|
|
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||||||
| 09.04.2023, 12:36 [ТС] | ||||||
|
Данные(тестовые) в таблицах выглядят так
0
|
||||||
|
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
|
||||||||
| 09.04.2023, 13:50 | ||||||||
0
|
||||||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||||||
| 09.04.2023, 15:14 [ТС] | ||||||
|
Не могли бы пояснить второй SELECT? Не могу понять вот эту часть
Добавлено через 10 минут Результат не тот что я пытался сделать. Тут же просто вместо id юзеров мы видим их имена из Users. Вывод не тот. Представите добавлен юзел UserTest10 с индексом 5 и он в чате только с UserTest2. Если я пытаюсь получить выпис по имени всех UserTest и увидеть в каком чате каждый из них с UserTest1 состоит, а если ен состоит то там должен быть 0 или NULL. Вывод вот такой UserTest2, 1 UserTest5, 1 UserTest3, 2 UserTest10, 0
0
|
||||||
|
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
|
|||||||||||||||||||||||||||||
| 09.04.2023, 17:05 | |||||||||||||||||||||||||||||
Если у хозяина чатов нет чатов, то запрос выдаст в результате 0 строк. Если в начале запроса убрать
Это то, что нужно? Добавлено через 1 час 22 минуты ![]()
0
|
|||||||||||||||||||||||||||||
| 09.04.2023, 17:05 | |
|
Схема связи в SQL сервере 2008 Создание чатового месенджера, загвоздка в отправлении и приеме сообщений Таблицы и их связи Связи таблицы Запросы и связи таблицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|