Разделите сущности на Survey, Question, Option, Submission и Answer. Ответ связывает одно прохождение опроса с вопросом и выбранным вариантом; признак правильности по условию не нужен.
Сервис опросов: столицы государств
Разделите сущности на Survey, Question, Option, Submission и Answer. Ответ связывает одно прохождение опроса с вопросом и выбранным вариантом; признак правильности по условию не нужен.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо разработать сервис для проведения опросов. По предоставленной ссылке пользователь видит название опроса, его описание и перечень вопросов с вариантами ответов. На каждый вопрос требуется выбрать один вариант; правильный ответ не учитывается. Требуется спроектировать структуру моделей для хранения данных в базе.
Пример вопросов и вариантов ответов:
Столица Германии? Берлин * Гамбург Мюнхен Кёльн
Столица Таиланда? Нонтхабури Пакрет Бангкок Чиангмай
Ответ
Разделите сущности на Survey, Question, Option, Submission и Answer. Ответ связывает одно прохождение опроса с вопросом и выбранным вариантом; признак правильности по условию не нужен.
Survey хранит название, описание и публичный slug/token; Question — survey_id, текст и порядок; Option — question_id, текст и порядок. Submission обозначает одну отправку формы, при необходимости связана с пользователем. Answer содержит submission_id, question_id и option_id.
Ограничение UNIQUE(submission_id, question_id) запрещает два ответа на один вопрос в рамках прохождения. Проверяйте, что вариант принадлежит этому вопросу, а вопрос — опросу submission. Полноту заполнения всех вопросов валидируйте перед финальной отправкой в транзакции. Нужна ли одна попытка на пользователя, из условия не следует.