Вопросы с несколькими вариантами ответов проектирование схемы базы данных
Допустим, мы хотим создать приложение для викторины, где пользователь может создать викторину со следующими характеристиками:
- Пользователи могут выбирать вопросы для викторины из набора заранее определенных вопросов.
- Каждый вопрос может иметь несколько вариантов (choices); 2, 3, 5, 6, 9, это не имеет значения.
- Вопросы и их варианты добавляются администраторами (через Django Admin API)
Я придумал довольно простой дизайн схемы:
Вот что происходит в приведенной выше схеме:
- Каждый вопрос может иметь несколько вариантов ответа
- QA сопоставляет вопрос с ответом, выбранным пользователем, который выполнил/прошел тест
- Каждый представленный тест может содержать несколько вопросов вместе с ответами
Одним из недостатков этого подхода является то, что я могу сопоставить вопросы с ответами, которые не входят в список вариантов ответа данного конкретного вопроса. Например, я создаю два вопроса;
- Are you Married?
- What is your favorite drink?
На первый вопрос у меня есть следующие варианты:
- Yes
- No
Для второго вопроса у меня есть следующие варианты:
- Water
- Soda
- Fresh Juice
Используя Django Admin API, я могу сопоставить первый вопрос; Are you married? с выбором второго варианта; soda
Как я могу избежать этого? И какие еще недостатки вы видите в этом подходе? Есть ли лучший способ разработки такого рода схем???
Я использую Django для этого конкретного проекта.
Существуют различные варианты дизайна, но ваша схема хорошо подходит для своей цели (предполагается, что вы хотите иметь гибкость в отношении всего набора вопросов/ответов).
Я рекомендую использовать ModelMultipleChoiceField в Django для поля выбора в вашей модели QA. Оно будет содержать набор queryset, содержащий связанные варианты выбора (которые вы получаете путем запроса всех вариантов выбора, связанных с вопросом в модели Question). Таким образом, вы ограничиваете выбор только теми вариантами, которые связаны с вопросом.
Если набор вопросов/ответов фиксирован и меняются только выбранные вопросы/ответы, тогда могут быть лучшие варианты (например, вы можете использовать метод Django choices
для определения вариантов ответа на вопрос, вместо того чтобы помещать их в отдельную модель).