Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
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
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.03.2023, 12:42
Ответы с готовыми решениями:

Какая ОС должна быть на сервере для связи с приложением под iOS?
Вопрос. Прога которая роботает на IOS должна быть связана с сервером на OS X server или может быть связана с сервером на Linux ??

Как установить связи для подчиненной таблицы?
Здравствуйте. Проблема следующая: база данных в access, в ней три главных таблицы и одна подчиненная..в delphi на форму кинул...

Программное создание связаной таблицы для связи с источником данных
Доброго времени суток уважаемые форумчане! Подскажите пож-та с помощью какого оператора можно осуществить создание связаных таблиц из...

47
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
5998 / 4573 / 1096
Регистрация: 29.08.2013
Сообщений: 28,248
Записей в блоге: 3
29.03.2023, 20:28
Цитата Сообщение от Annemesski Посмотреть сообщение
Извините, но это чушь
какая же чушь, если вы сами пишите далее 2 пункта которые это реализовывают

я вроде об этом же писал)
0
 Аватар для Annemesski
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
30.03.2023, 14:18
Цитата Сообщение от qwertehok Посмотреть сообщение
я вроде об этом же писал)
возможно я Вас не так понял.
Цитата Сообщение от SektorCT Посмотреть сообщение
Но сейчас столкнулся с ситуацией
Еще раз: зачем Вам это нужно? Если
Цитата Сообщение от SektorCT Посмотреть сообщение
я хочу создать чат с выбранным юзером
то создайте чат и добавьте туда обоих пользователей, а далее пользователи пишут в чат через это и общаются между собой.
0
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
31.03.2023, 00:20  [ТС]
Вот смотрите, при выборе юзера я посылаю серверу запрос на создание чата, в таблице Chat создал запись, после в таблице ChatUser создаю связь (user_id, chat_id).
А если у них уже был чат но с другим номером? По этому я и думаю что логичнее в таблице найти для юзеров существование общей связи с чатом, и если нету то тогда только создавать. Если я не прав то обьясните почему?
0
 Аватар для Annemesski
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
SQL
1
SELECT Users.name, UserChat.chat_id FROM Users, UserChat WHERE Users.user_id = ('User1');
Но почему то получаю столбец с именем юзера и столбец с id чата но там id чата дублируется.
Потом как я понимаю надо сделать выборку по полю chat_id из данных SELECT чтобы для каждого chat_id получить все имена, и вот тут уже я застрял. Может кто посоветовать?
0
 Аватар для Annemesski
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
02.04.2023, 19:28
Все чаты в которых состоит юзер выбираются из таблицы связи user_chat по id пользователя, а чтобы в этой же выборке получить имя пользователя нужно объединение с таблице юзеров, что-то вроде
SQL
1
SELECT usres.name, user_chat.user_id, user_chat.chat_id FROM user_chat JOIN users ON users.id=user_chat.user_id WHERE users.id=N;
0
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
02.04.2023, 23:19  [ТС]
Спасибо, весь день копаюсь и читаю книгу по sql, не смог написать пока нормальный запрос.
Еще один вопрос, а если надо имея имя юзера получить таблицу где все его чаты а в соседней всех тех кто в общих с ним чатах состоит? Я так и не смог пока понять как имея id чата заполнить всех тех кто в нем сидит.

Добавлено через 1 час 14 минут
Вроде получилось, но результат это id именно юзеров по чатам, по сути то что и хотел я. Но хочу получить именно Имя юзера и номер комнаты. Но сделал все таки не сам а почерпнул направление в решении из книги
SQL
1
SELECT user_id, chat_id FROM UserChat WHERE chat_id IN (SELECT chat_id FROM UserChat WHERE user_id = 1);
В таком виде id юзеров и id чатов
0
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
04.04.2023, 16:21  [ТС]
В общем получилось у меня
SQL
1
2
3
4
5
6
SELECT
    USER.name AS username, chat_id
FROM UserChat
    LEFT JOIN Users AS USER ON USER.user_id = UserChat.user_id
WHERE chat_id IN
      (SELECT chat_id FROM UserChat WHERE user_id = 1);
Если можно это записать как то по другому то буду признателен за совет.
0
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
08.04.2023, 12:30  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
хранить сообщения в базе на сервере имеет смыл только для не дошедших до адресата сообщений, в том случае если требуется отложенная доставка сообщений. Хранить переписку сотен (или сотен тысяч) пользователей на сервере не рационально.
.
Вы говорили что хранить все свои сообщения каждый юзер должен у себя, на данном этапе у меня пока реализовано хранение на сервере.
То есть каждый чат пока что грузится с сервака. Но я хочу реализовать (кеш) чтобы чаты у каждого юзера хранились еще и у себя и грузились при включении не с сервера а со своей машины.
По этому вопрос, как лучше вставить такую реализацию в работу еще и с серверным хранением? Какой должен быть порядок отправки и получения сообщений?

И еще 1 вопрос, можно ли как то при получении данных из таблицы их отсортировать чтобы читать в контейнер не с начала и до конца а с конца и до начала?
Спасибо.
0
 Аватар для Annemesski
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
08.04.2023, 14:28
Цитата Сообщение от SektorCT Посмотреть сообщение
Но я хочу реализовать (кеш)
Классическая реализация это хэшировать сообщения, для чего на клиенте и сервере используется одна и таже хэш-функция: пользователь для загрузки сообщений отправляет список хэшей сообщений имеющихся у него, сервер просматривает хранящиеся у него сообщения и отправляет пользователю те, которых нет в списке отправленном пользователем. Для хеширования сообщений посмотрите в сторону QUuid class.
Цитата Сообщение от SektorCT Посмотреть сообщение
при получении данных из таблицы их отсортировать
смотрите директиву "order by"
SQL
1
SELECT * FROM tab ORDER BY name DESC;
выдаст все поля таблицы tab отсортированные по полю name в порядке убывания (директива DESC - descendent) по умолчанию или с директивой ASC (ascendent) сортировка по возрастанию, текст сортируется в лексикографическом порядке вот правда не помню чувствителен ли к регистру букв или нет.
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
 Аватар для VinniPuh
9147 / 6176 / 594
Регистрация: 27.03.2013
Сообщений: 20,047
09.04.2023, 09:04
Таблицы и сервер, это практически даже мне понятно.
А - месенджер, это в куда нужно совать?
0
 Аватар для index58
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
09.04.2023, 10:53
Цитата Сообщение от SektorCT Посмотреть сообщение
В одном чате с user1 находится user2
Цитата Сообщение от SektorCT Посмотреть сообщение
еще один чат состоит из user1, user2, user3
В базе у Вас это как выглядит?
0
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
09.04.2023, 12:36  [ТС]
Данные(тестовые) в таблицах выглядят так
Code
1
2
3
4
5
6
7
Users            Chat              UserChat
id, name        id, chat          user_id, chat_id
1,UserTest1    1,1                1,1
2,UserTest2    2,2                2,1
3,UserTest3    3,3                1,2
4,UserTest5    4,4                3,2
                                          4,1
0
 Аватар для index58
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
09.04.2023, 13:50
Цитата Сообщение от SektorCT Посмотреть сообщение
user2 будет вынесен 2 раза так как он с ним в 2 группах, что-то типа (name, numberChat)
Цитата Сообщение от SektorCT Посмотреть сообщение
Данные(тестовые) в таблицах выглядят так
Вот так:
SQL
1
2
3
4
SELECT name, "numberChat"
FROM "UserChat"
LEFT JOIN (SELECT id AS user_id, name FROM "Users") u USING (user_id)
LEFT JOIN (SELECT id AS chat_id, chat AS "numberChat" FROM "Chat") c USING (chat_id)
0
2 / 2 / 0
Регистрация: 22.03.2022
Сообщений: 225
09.04.2023, 15:14  [ТС]
Не могли бы пояснить второй SELECT? Не могу понять вот эту часть
SQL
1
AS chat_id, chat
Все таки еще плохо я sql понимаю, видел примеры с одним LEFT JOIN но с двумя ни разу.

Добавлено через 10 минут
Результат не тот что я пытался сделать.
Тут же просто вместо id юзеров мы видим их имена из Users.
Вывод не тот.
Представите добавлен юзел UserTest10 с индексом 5 и он в чате только с UserTest2.
Если я пытаюсь получить выпис по имени всех UserTest и увидеть в каком чате каждый из них с UserTest1 состоит, а если ен состоит то там должен быть 0 или NULL. Вывод вот такой
UserTest2, 1
UserTest5, 1
UserTest3, 2
UserTest10, 0
0
 Аватар для index58
59 / 25 / 10
Регистрация: 01.07.2016
Сообщений: 153
09.04.2023, 17:05
Цитата Сообщение от SektorCT Посмотреть сообщение
Не могли бы пояснить второй SELECT? Не могу понять вот эту часть
Это синтаксис такой у оператора SELECT.
SQL
1
SELECT id AS chat_id, chat AS "numberChat"
В переводе на русский означает:
Code
1
Выбрать колонку id под именем chat_id и колонку chat под именем "numberChat"
Добавлено через 26 минут
Цитата Сообщение от SektorCT Посмотреть сообщение
Представите добавлен юзел UserTest10 с индексом 5 и он в чате только с UserTest2.
Если я пытаюсь получить выпис по имени всех UserTest и увидеть в каком чате каждый из них с UserTest1 состоит, а если ен состоит то там должен быть 0 или NULL. Вывод вот такой
Правильно ли я понял, что сначала нужно узнать, какие чаты есть у UserTest1, а затем для каждого из этих чатов дать список его участников? Если да, то вот такой запрос будет:
SQL
1
2
3
4
5
6
7
SELECT master_name, "numberChat", user_name FROM
-- Выбираем пользователя 'UserTest1' - хозяина чатов
(SELECT id AS master_id, name AS master_name FROM "Users" WHERE name = 'UserTest1') AS master
-- Выясняем, какие чаты у него есть
INNER JOIN (SELECT id AS user_id, user_name FROM "UserChat") AS chat ON (user_id = master_id)
-- Находим пользователей, участвующих в этих чатах
LEFT JOIN (SELECT id AS user_id, name AS user_name FROM "Users") AS USER USING (user_id)
master_name - это хозяин чатов.
Если у хозяина чатов нет чатов, то запрос выдаст в результате 0 строк.
Если в начале запроса убрать
SQL
1
WHERE name = 'UserTest1'
то в качестве хозяина чата будут рассмотрены все пользователи, каждый по очереди.
Это то, что нужно?

Добавлено через 1 час 22 минуты
Цитата Сообщение от SektorCT Посмотреть сообщение
а если ен состоит то там должен быть 0 или NULL
Вот этот запрос кажется логичнее
SQL
1
2
3
4
5
6
7
8
9
SELECT master_name, "numberChat", user_name FROM
-- Выбираем пользователя 'UserTest1' - хозяина чатов
(SELECT id AS master_id, name AS master_name FROM "Users" WHERE name = 'UserTest1') AS master
-- Выясняем, какие чаты у него есть
INNER JOIN (SELECT user_id AS master_id, chat_id AS master_chat_id FROM "UserChat") AS master_chat USING (master_id)
-- Проходимся по всем пользователям, которые могут участвовать в каждом из этих чатов
CROSS JOIN (SELECT id AS user_id, name AS user_name FROM "Users") AS userr
-- Отмечаем тех пользователей, которые действительно участвуют
LEFT JOIN (SELECT user_id, chat_id AS user_chat_id FROM "UserChat") AS chat_user USING (user_id)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2023, 17:05

Схема связи в SQL сервере 2008
Столкнулся с проблемой "Конфликт инструкции ALTER TABLE с ограничением FOREIGN KEY.. " при попытке сохранить схему связи. Нужно...

Создание чатового месенджера, загвоздка в отправлении и приеме сообщений
доброго времени суток!!! я новичок в Джаве. загвоздка моя в том, чтоб отправить от сервера сообщение клиенту, вначале, сервер должен...

Таблицы и их связи
Доброго времени суток! Есть задание: "Разработать информационную систему «Система учета материальных ценностей на складе». Администратор...

Связи таблицы
Добрый день! Нужен ваш совет, помощь. Есть такая схема данных на картинке приложена. И есть несколько вопросов 1. Верна ли она? 2. В...

Запросы и связи таблицы
«Автомашины» имеет структуру: номер автобазы, номер машины, ФИО водителя. «Автоперевозки» содержит следующую информацию: номер машины, дата...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
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
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru