Мессенджер: пользователи, чаты, сообщения. У пользователя — имя и дата регистрации, у чата — название и дата создания, у сообщения — текст, автор и дата. Пользователь состоит в нескольких чатах (M:N), сообщение принадлежит ровно одному чату.
Схема ниже — эталонная (на собесе её проектируешь сам: users, chats, связующая chat_members, messages).
Выведи все чаты пользователя с id = 1 в формате (chat_id, chat_name).
1CREATE TABLE users (2 id bigint PRIMARY KEY,3 name text NOT NULL,4 registered_at timestamptz NOT NULL DEFAULT now()5);6CREATE TABLE chats (7 id bigint PRIMARY KEY,8 name text NOT NULL,9 created_at timestamptz NOT NULL DEFAULT now()10);11CREATE TABLE chat_members (12 chat_id bigint NOT NULL REFERENCES chats (id) ON DELETE CASCADE,13 user_id bigint NOT NULL REFERENCES users (id) ON DELETE CASCADE,14 joined_at timestamptz NOT NULL DEFAULT now(),15 PRIMARY KEY (chat_id, user_id)16);17CREATE INDEX chat_members_user_id_idx ON chat_members (user_id);18CREATE TABLE messages (19 id bigint PRIMARY KEY,20 chat_id bigint NOT NULL REFERENCES chats (id) ON DELETE CASCADE,21 author_id bigint NOT NULL REFERENCES users (id),22 body text NOT NULL,23 created_at timestamptz NOT NULL DEFAULT now()24);25INSERT INTO users (id, name) VALUES (1, 'Анна'), (2, 'Борис'), (3, 'Вера');26INSERT INTO chats (id, name) VALUES (1, 'general'), (2, 'work'), (3, 'family'), (4, 'empty');27INSERT INTO chat_members (chat_id, user_id) VALUES (1, 1), (3, 1), (1, 2), (2, 2), (2, 3);28-- Анна писала в general дважды, в family — ни разу; в work писала раньше, но из чата вышла29INSERT INTO messages (id, chat_id, author_id, body) VALUES30 (1, 1, 1, 'привет'), (2, 1, 1, 'как дела?'), (3, 1, 2, 'норм'),31 (4, 2, 1, 'старое сообщение'), (5, 2, 3, 'ок');