|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|
Таблицы и их связи для месенджера на сервере26.03.2023, 12:42. Показов 4904. Ответов 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
|
|
| 09.04.2023, 19:54 [ТС] | |
|
Я сейчас разбираюсь с этим запросом что вы очень хорошо описали. Могли бы только описать в каком порядке происходит раскрутка запроса? Если я правильно понимаю то два SELECT которые в INNER JOIN и LEFT JOIN выполняются первыми?
Добавлено через 10 минут Попробовал я ваш запрос, и это действительно то что я (пытался) хотел получить. первые 17 записей в моем случаи то что нужно, а потом много раз дублируется, пока не понимаю почему.
0
|
|
|
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 11.04.2023, 19:32 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено SektorCT как решение
Решение
Занят был, извините.
![]()
![]() Вот теперь проверил, переписал. И для удобства я: 1) изменил имена в таблицах, 2) создал псевдонимы для двух таблиц, 3) создал представление, связывающее таблицы. Сначала покажу код, который у меня получился, а потом объясню, что это значит, и зачем. Код создания таблиц:
1) Видите, какие короткие два запроса получились в конце? Это благодаря тому, что я связываю таблицы не в каждом запросе, а связываю их один раз в представлении. То есть, я один раз подумал над связями, один раз правильно написал эти связи, и забыл о них. Всё, теперь в запросах мне не нужно думать над этими связями, а просто писать:
2) Зачем полям таблиц такие имена типа "User_ID", "User_Name"? Что, разве нельзя просто "ID", "Name"? Можно. Но если в двух таблицах есть поля с одинаковым названием (например, в таблице user есть поле id и в таблице chat есть поле id), то когда мы их джойним простым способом user JOIN chat, и делаем из этого SELECT:
3) Что такое псевдоним таблицы? Это по сути та же самая таблица, но выступающая в запросах под другим именем. Хотя, технически в СУБД это не таблица, а представление, но по сути для меня это таблица под псевдонимом. В каких случаях таблице нужен псевдоним? В случае, например, когда пользователь может выступать в разной роли. Вот как в Вашем случае, где пользователь может выступать: 1) в роли владельца аккаунта, КОТОРЫЙ СМОТРИТ на свой экран, 2) в роли не-владельца, а участника системы, НА КОТОРОГО СМОТРЯТ. Когда такое происходит, то возникает потребность джойнить таблицу "User" саму с собой "User" JOIN "User", а так делать нельзя — СУБД выдаст ошибку. И чтобы СУБД не выдавала ошибку, нужно дать таблице псевдоним, например "Owner", чтобы получилось: "Owner" JOIN "User". И тогда такой ошибки не будет. Но ведь этого можно достичь и без создания представления? Да, можно. Зачем тогда создавать представление? Чтобы создать ещё и псевдонимы полей этой таблицы. Ведь если поля мы оставим без изменений, то получится, что и в таблице "Owner" есть поле "User_ID", и в таблице "User" тоже есть поле "User_ID", при этом мы их джойним, и возникает ошибка, рассмотренная в пункте 2 выше. И вот чтобы такой ошибки не возникало, я создаю псевдоним для каждой таблицы, которую нужно будет джойнить простым способом саму с собой. Если нужно объяснить что-то ещё, то пожалуйста, можете спрашивать. Только иногда я могу не сразу ответить. И посмотрите, пожалуйста, на результаты выполнения запросов. Это то, что нужно, или не совсем?
1
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
|||
| 18.04.2023, 09:49 [ТС] | |||
|
1: на стороне клиентов в каком виде должны хранится сообщения, в виде такой же базы с одной таблицей Сообщения аналогичной серверной? Или в каком то другой виде? 2: могли бы описать примерно как это хеширование через QUuid должно работать? Первый раз с этим сталкиваюсь. Спасибо
0
|
|||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
|||
| 20.04.2023, 12:45 | |||
|
Тут надо понимать что хоть UUID - число очень большое, но не бесконечное, а набор исходных данных потенциально бесконечен и при этом гарантируется что из любого набора данных можно получить UUID, то есть (очень-очень маленькая) вероятность коллизии - то есть получения одного и того же UUID из разного набора данных. Так же никакими стандартами на закреплено то, какой должна быть хэш-функция генерирующая UUID, потому существует целый зоопарк реализаций которые генерируют разный UUID из одного и тогоже набора данных. Несмотря на это UUID - это очень удобный инструмент для синхронизации данных в распределенных системах, позволяющий обмениваться не полными данными, а этаким их описанием и в случае отсутствия описателя докачивать недостающие куски данных. А учитывая приведенные выше недостатки такого подхода нужно всего лишь гарантировать что со стороны сервера и клиента всегда будет использоваться один и тот же алгоритм генерации - это можно гарантировать тем, что генерация UUID будет происходить только на сервере, а сервер будет пересылать сообщения вместе с их UUID. Ваш алгоритм может выглядеть примерно так: 1. Сервер получает сообщение от пользователя и перед тем как принять решение о передаче его другим пользователям сохраняет сообщение у себя генерируя для него UUID, например, по тексту самого сообщения, временной метке получения и пары отправитель получатель, после чего пытается переслать это сообщение всем причастным. 2. Клиент, каждый раз подключаясь к серверу, запрашивает у него список UUID всех сообщений которые есть в БД сервера, затем сравнивает полученный с сервера список UUID со своим вычитая свой список из списка сервера и, если разница не пуста, значит на сервере есть сообщения которых нет у пользователя. 3. Пользователь докачивает к себе те сообщения которых у него нет.
0
|
|||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||
| 23.04.2023, 22:53 [ТС] | ||
|
И еще один вопрос, вот если у меня со стороны сервера в базе для всех юзеров и всех чатов только 1 таблица messages то из практической точки зрения стоит ли со стороны юзера под каждого создавать базу и у каждого юзера в ней будут таблицы под каждую чат комнату? Я просто подумал вдруг это было бы удобнее. Или стоит иметь одну базы для любого юзера но таблицы уже буду под каждого юзера но со всеми его сообщениями? Интересно просто вопрос со стороын продуктивности работы с хешированием и доступами. Спасибо.
0
|
||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||
| 07.05.2023, 13:41 [ТС] | ||
|
Предположим у юзера пара чатов. Он подключился к серверу, сервер собрал для данного юзера все сообщения по всем доступным ему чатам. И посылает юзеру примерного вида QMap<int, QList<QUuid>> то есть номер чата и хеш каждого сообщения попорядку. Предположим: ChatRoom1 - message1 - message2 - message3 ChatRoom2 - message1 а вот у клиента в базе по чату 1 только 2 сообщения. ChatRoom1 - message1 - message3 Получается мы каждый хеш что прилетел от сервера должны сравнить со всеми сообщениями у клиента? Я правильно понимаю? Вопрос, как определять по uuid какое именно сообщение отсутствует и как его дописывать? И если я правильно понимаю то клиент обнаружив отсутствие сообщения должен уже посылать запрос серверу и сервер найти нужное и уже послать обратно? Спасибо.
0
|
||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
||
| 08.05.2023, 23:16 | ||
|
0
|
||
|
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
|
||
| 09.05.2023, 23:51 [ТС] | ||
|
Я на стороен сервера при подключении клиента и по его запросу формирую контейнер с номером чата и всеми сообщениями данного чата, QMap<int, QList<QUuid>> и в таком виде посылаю клиенту. uuid как раз и формирую из всех перечисленных вами параметров. Я просто не могу придумать как сравнивать лучше и определять по uuid а потом еще и сообщить серверу какого сообщения нету у клиента.
0
|
||
| 09.05.2023, 23:51 | |
|
Схема связи в 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
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|