Как правильно спроектировать бд для конструктора тестов?
Здравствуйте, суть такая, пишу конструктор тестов на php , конструктор должен поддерживать следующие типы вопросов , выбор одного или нескольких правильных вариантов, письменный вариант, соответствие вариантов ответа то есть соотнести варианты из правой колонки с вариантами из левой, расположить последовательность в правильном порядке.
Есть две таблицы вопросы и вариантов ответов, проблема с таблицей вариантов, если вопрос на выбор одного или нескольких вариантов сложностей не возникает, но если вопрос на соответствие то нужно знать что вытягивать в правую и левую колонку.
Идеи которые придумал , писать в таблицу вопросов тип вопроса и в зависимости от этого вытягивать варианты их разных таблиц, либо в таблицах вариантов в вопросах на соответствие ставить разделитель между правой и левой частью.
Возникла такая идея использовать для такой базы данных nosql , типо mongodb.
P.s Надеюсь понятно объяснил ситуацию.
Про соответствие вариантов ответа не очень понятно, поподробнее пожалуйста.
Про один из нескольких или письменный - можно попробовать так: если у вопроса в базе указан только один (!) вариант ответа, то тогда он же - правильный, и тогда по определению нет смысла показывать ответ пользователю - значит вопрос письменный. Если у вопроса в базе несколько вариантов ответа, то имеет смысл показать их пользователю, что он выбрал, тогда вопрос на выбор правильных вариантов.
Ну или действительно ставить у вопроса тип, и каждый тип обрабатывать по-разному, тем более у вас там вопросы с левыми-правыми колонками, которые не похожи на предыдущие типы.
Суть в том как хранить в базе данных разные типы вопросов , у меня есть таблица вопросов получается содержит в себе текст вопроса + правильный ответ. Есть таблица вариантов ответа , содержит в себе колонку с вариантами ответа. Произвожу выборку из бд вопросов и подтягиваю к ним варианты ответа. Проблема с разными вопросами . Идея после выборки из бд по специальному идентификатору определять колонку (правая левая) и т д. Просто интересно нормальное ли такое решение или может быть учитывая разную структуру вопросов целесообразнее использовать базы типо nosql.
Я понял про соответствие, ну что ж, это конечно немного другой тип вопросов в принципе, тут само соответствие - это ответ, так что конечно их нужно организовывать иначе. Советую вам продумать вашу иерархию в плане что у вопросов общее, а чем они отличаются. Общим будет, например, стоимость вопроса в баллах, текст вопроса, служебная инфа - автор, дата изменения, а для каждого вопроса - свои данные об ответах. Где-то несколько ответов и подмножество(!) правильных (вопросы на выбор), для "письменных" вопросов - множество правильных ответов (если можно ответить по-разному), для соответствий советую сделать множество "левых" и "правых" элементов и множество правильных соответствий:
MatchingQuestionLeftItem(QuestionId, Number, Text)
MatchingQuestionRightItem(QuestionId, Number, Text)
MatchingQuestionItemMatch(QuestionId, LeftItemNumber, RightItemNumber)
При приеме ответа получаете множество ItemMatch-ей (соответствий) для данного вопроса по QuestionId, и смотрите эквивалентность множества пар в ответе и множества пар (LeftItemNumber, RightItemNumber), прилетевшего из базы.
Терминология отсюда: https://help.blackboard.com/en-us/Learn/9.1_SP_10_...
seenotevil там еще вижу есть вопросы на классификацию - с ними тоже немного иначе. В общем совет - не пытаться решить в общем виде то, что не решается)