Sobes.tech
Назад к вопросам
Senior
3

Условие Есть 3 сущности - пользователь, чат, сообщение • У пользователя есть имя и дата регистрации • У чата есть название и дата создания • У сообщения есть текст, автор и дата создания • Пользователь может состоять в нескольких чатах одновременно • Сообщение обязательно принадлежит чату, сообщение не может принадлежать более чем 1 чату одновременно • Нужно описать предметную область в виде таблиц -- распределенный -- message_count into chats limit 100 --getShard(time zone) -> shard_id -> 1 --getShard(time zone) -> shard_id -> 2 --shard1 [1..100] --shard2 [101..200] CREATE TABLE users ( id int PRIMARY KEY, name varchar(255) NOT NULL, reg_at TIMESTAMP NOT NULL DEFAULT NOW() ); CREATE TABLE chats ( id int PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), message_count int NOT NULL CHECK <= 100 ); CREATE TABLE user_chats ( user_id int not null REFERENCES users(id), chat_id int NOT NULL REFERENCES chats(id), PRIMARY KEY (user_id, chat_id) ); CREATE TABLE messages ( id int PRIMARY KEY, chat_id int NOT NULL REFERENCES chats(id), author_id int NOT NULL REFERENCES users(id), created_at TIMESTAMP NOT NULL DEFAULT NOW(), text TEXT NOT NULL );

Компании, где спрашивали
Ozon ФинтехOzon Финтех

Ответ от нейросети

sobes.tech AI

В описанной предметной области три основные сущности: пользователи, чаты и сообщения. Связи между ними:

  • Пользователь может состоять в нескольких чатах (многие ко многим).
  • Сообщение принадлежит ровно одному чату.
  • Сообщение имеет автора — пользователя.

Предложенная схема таблиц:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    reg_at TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE TABLE chats (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    message_count INT NOT NULL CHECK (message_count <= 100)
);

CREATE TABLE user_chats (
    user_id INT NOT NULL REFERENCES users(id),
    chat_id INT NOT NULL REFERENCES chats(id),
    PRIMARY KEY (user_id, chat_id)
);

CREATE TABLE messages (
    id INT PRIMARY KEY,
    chat_id INT NOT NULL REFERENCES chats(id),
    author_id INT NOT NULL REFERENCES users(id),
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    text TEXT NOT NULL
);

Для распределённого хранения с шардингом по времени (например, по часовому поясу) можно реализовать функцию getShard(time_zone), которая возвращает shard_id (например, 1 или 2). Каждый шардинг покрывает диапазон чатов по их ID:

  • shard1: чаты с ID от 1 до 100
  • shard2: чаты с ID от 101 до 200

Это позволяет распределять нагрузку и хранить данные в разных базах или кластерах.

Важно контролировать message_count в таблице chats, чтобы не превышать лимит в 100 сообщений, что может быть связано с бизнес-логикой или ограничениями шарда.