powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД обмена сообщениями как в VK
14 сообщений из 14, страница 1 из 1
Проектирование БД обмена сообщениями как в VK
    #39364400
dimanlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет! Нужно с проектировать БД(Postgres 9.5.5) для обмена сообщениями между пользователями. Принцип работы как в vc.com

Пока додумался только до этого:

| user
-----------------------
| id
| email

| user_chat_rooms
---------------------------------
| user_id(integer) указывает на users
| chat_room_id(integer) указывает на chat_room_id

| chat_rooms
--------------------------
| name(string)

| messages
-----------------------------
| message (text)
| char_room_id (integer) указывает на user_chat_rooms
| sender_id (integer) указывает на users
| receiver_id (integer) указывает на users


Проблема с которой столкнулся, не могу написать проверку запрос, что бы понять, что между 2-мя пользователями есть chat_room и там всего 2 участника.

Вот что имею:

select * from user_chat_rooms where user_id in (1,2);

id | user_id | chat_room_id | created_at | updated_at
----+---------+--------------+----------------------------+----------------------------
3 | 1 | 1 | 2016-12-10 09:58:40.168882 | 2016-12-10 09:58:40.168882
4 | 2 | 1 | 2016-12-10 09:58:46.231259 | 2016-12-10 09:58:46.231259
6 | 2 | 3 | 2016-12-10 09:59:01.382443 | 2016-12-10 09:59:01.382443

Тут выдача говорит что пользователь с id 1 и 2 действительно имеют общую комнату для сообщений.
Так же пользователь 2 имеет ещё одну комнату для общений.

Как мне получить однозначный ответ:
1. Что эти 2 пользователя имеют общую комнату для общений
2. Что в этой комнате только 2 этих пользователя и больше никого нету.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39364420
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM GROUP BY
HAVING COUNT(*) = 2
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39364424
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока додумался только до этого:

| user
-----------------------
| id
| email

| user_chat_rooms
---------------------------------


в user_chat_rooms что будем хранить?
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39364445
dimanlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Промежуточная модель между users и chat_rooms, реализация many to many.
Это позволяет относить одного пользователя к разным chat_rooms.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39364452
dimanlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Дмитрий, чёт не понимаю ((

select user_id, chat_room_id from user_chat_rooms where user_id in (1,2) group by user_id, chat_room_id having count(*) = 2;

user_id | chat_room_id
---------+--------------
(0 rows)
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39364462
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimanlinчёт не понимаю ((
А ты having убери и мозгом подумай над результатом своего запроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39365256
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimanlinMasterZiv,

Промежуточная модель между users и chat_rooms, реализация many to many.
Это позволяет относить одного пользователя к разным chat_rooms.


ну, я И намекаю, что неправильно, должно быть минимум 2 таблицы.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39365257
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя нет, видимо все ок, просто нарисовано у тебя по-дурацки... я сразу не понял.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39365687
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. тут :

...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39365971
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч,

В чем смысл внешних ключей в Message, ссылающихся на Thread и User, а не на ThrеadParticipant?
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39366448
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин,

Там же описано. Message --< Thread -- для ведения нескольких дискуссий (те же комнаты), User --< Message -- для авторства.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39367203
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучКот Матроскин,

Там же описано. Message --< Thread -- для ведения нескольких дискуссий (те же комнаты), User --< Message -- для авторства.

Еще раз - почему ключ ссылается отдельно на user и отдельно на thread, вместо того чтобы ссылаться сразу на thread_participant? В результате в базу можно внести сообщение в дискуссию от пользователя, не являющегося участником дискуссии, т.е. создать коллизию.
Очевидно, что ключ на thread_participant точно так же позволил бы отслеживать авторство и ведение нескольких дискуссий, но помешал бы внести некорректные данные вроде описанного выше случая.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39367401
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин,

Участник может запросто покинуть дискуссию. Он от этого не перестанет быть автором.
...
Рейтинг: 0 / 0
Проектирование БД обмена сообщениями как в VK
    #39367669
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучУчастник может запросто покинуть дискуссию. Он от этого не перестанет быть автором.
1. По ссылке вообще ничего не сказано про удаление из thread_participant, поэтому покинуть дискуссию участник не может ;)
2. Если таки взяться обрабатывать кейс с выходом из дискуссии (хотя непонятно зачем), то обеспечивать это надо флагами в thread_participant, а не удалениями.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД обмена сообщениями как в VK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]