Построение архитектуры БД для системы тестирования
Занимаюсь созданием системы тестирования (тест с вопросами и вариантами ответов) на Django. Архитектура БД на данный момент выглядит следующим образом:
TestName(id: pk, test_name : str)
TestQuestion(id: pk, question_title : str, test_id : foreign_key_to(TestName))
QuestionVariant(id: pk, variant_title: str, is_correct : bool, question_id : foreign_key_to(TestQuestion))
Но при реализации возникло неудобство:
- Не представляю как реализовать специальную форму для добавления нового теста, если отсутствует один общий объект, который содержит в себе название теста, вопросы для него, и варианты для каждого вопроса и для добавления нужно поочередно создавать данные в трёх таблицах
- Так же не уверен, что для вывода данных теста удобно постоянно джойнить таблицы и фильтровать данные по test_id и question_id.
Как бы вы решали эту задачу для устранения таких неудобств?
Архитектура БД на данный момент выглядит следующим образом
...
Так же не уверен, что для вывода данных теста удобно постоянно джойнить таблицы и фильтровать данные по test_id и question_id.
Связывание и фильтрация никаких неудобств не составляют - это не просто нормальная практика, а базовый принцип работы с данными. Так что не то что вопрос - сама постановка вопроса подобным образом лишена смысла.
Просто поверь - сервер БД создан именно для того, чтобы не просто постоянно выполнять такого рода работу, но и выполнять её максимально эффективно. И практически всегда любая попытка ему помочь оборачивается обратным эффектом. Так что по этому вопросу даже не заморачивайся. Неудобства тут НЕТ.
Дополнительно, в качестве доброго совета. Не используй имя id
для первичного ключа. Используй имена полей в той форме, в которой у тебя названы ссылающиеся поля. Т.е. test_id
и в таблице TestQuestion
, как сейчас, и первичный ключ в таблице TestName
.
Во-первых, убирается неоднозначность. Сразу по имени поля понятно, что в нём (а по алиасу таблицы - ещё и где именно). Во-вторых, вместо JOIN .. ON t1.id = t2.user_id
можно писать более короткое и логичное JOIN .. USING (user_id)
.