Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД обмена сообщениями как в VK / 14 сообщений из 14, страница 1 из 1
11.12.2016, 15:22
    #39364400
dimanlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД обмена сообщениями как в VK
Привет! Нужно с проектировать БД(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
11.12.2016, 16:10
    #39364420
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД обмена сообщениями как в VK
RTFM GROUP BY
HAVING COUNT(*) = 2
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.12.2016, 16:17
    #39364424
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД обмена сообщениями как в VK
Пока додумался только до этого:

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

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


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

Промежуточная модель между users и chat_rooms, реализация many to many.
Это позволяет относить одного пользователя к разным chat_rooms.
...
Рейтинг: 0 / 0
11.12.2016, 17:40
    #39364452
dimanlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД обмена сообщениями как в VK
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
11.12.2016, 18:00
    #39364462
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД обмена сообщениями как в VK
dimanlinчёт не понимаю ((
А ты having убери и мозгом подумай над результатом своего запроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.12.2016, 20:37
    #39365256
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проектирование БД обмена сообщениями как в VK
dimanlinMasterZiv,

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


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

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

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

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

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

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

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


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