Разделите управление опросами и приём голосов. Храните Poll, Option и Vote, проверяя принадлежность варианта опросу и правила повторного голосования.
Конструирование сервиса пользовательских опросов
Разделите управление опросами и приём голосов. Храните Poll, Option и Vote, проверяя принадлежность варианта опросу и правила повторного голосования.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработайте сервис для проведения опросов среди пользователей системы. Каждый опрос состоит из вопроса и набора вариантов ответов, при этом должна быть возможность динамически добавлять новые опросы. Опишите архитектурную схему решения, указав ключевые компоненты для хранения данных, обработки логики опросов и взаимодействия с клиентскими приложениями.
Ответ
Разделите управление опросами и приём голосов. Храните Poll, Option и Vote, проверяя принадлежность варианта опросу и правила повторного голосования.
Poll содержит вопрос, статус и период доступности; Option — текст и ссылку на опрос; Vote — пользователя, опрос, вариант и время. При одном голосе на пользователя установите уникальность (poll_id, user_id). Анонимным опросам нужен отдельный договорённый способ ограничения повторов.
Административное API создаёт черновики и публикует новые опросы без изменения кода. Клиентское API получает активный опрос и отправляет выбор. Сервер проверяет статус и option, затем сохраняет голос транзакционно. Итоги вычисляются агрегацией или обновляемым кешем. После начала голосования варианты нельзя произвольно переиспользовать: потребуется версия или запрет смысловых правок.