#php #mysql
#php #mysql
Вопрос:
Я провожу онлайн-тест с использованием php и mysql, и мне нужна небольшая помощь в решении вопроса о том, как спроектировать базу данных для оптимальной вставки вопросов / ответов и выбора вопросов для теста. Таблица будет содержать 80 вопросов, в каждом из которых 4 возможных варианта плюс правильный ответ.
При извлечении вопросов и вариантов из базы данных я случайным образом выберу 25 вопросов и их вариантов.
Лучше ли сделать один столбец для всех вопросов, вариантов и правильных ответов? Например:
ID | Q | OPT1 | OPT2 | OPT3 | OPT4 | ANS
Или было бы лучше создать столбец для каждого отдельного вопроса, варианта и правильного ответа? Например:
Q1 | Q1_OPT1 | Q1_OPT2 | Q1_OPT3 | Q1_OPT5 | Q1_ANS | Q2 | Q2_OPT1 | Q2_OPT2...
Ответ №1:
Было бы лучше хранить возможные ответы в отдельной таблице. Это позволяет вам иметь любое количество ответов на вопрос вместо всего 4. Это также позволяет задавать вопросы с разным количеством ответов. Если у вас более одного теста, вам также может понадобиться таблица Quizes.
Quizes:
id
name
Questions:
id
quiz
prompt
Answers:
id
question
prompt
QuizResult (someone taking a quiz)
id
quiz
// other information about the quiz taker, possibly including the time
Теперь вопрос с правильным ответом становится намного сложнее. Я предпочитаю более высокие реализации здесь:
Каждый вопрос имеет значение, и каждый ответ имеет значение
Система, с которой я недавно работал, позволяет присваивать значение балла за каждый вопрос и каждый ответ. Неправильные ответы часто получали 0, правильные ответы получали полную сумму. Вы также могли бы получить частично правильные ответы, используя этот метод. Я бы выбрал именно этот метод.
Вы могли бы пойти и сказать, что каждый вопрос стоит 10 баллов, или вы могли бы присвоить разные веса разным вопросам:
Questions:
id
quiz
prompt
value (you can make this question worth more or less)
Answers:
question
prompt
value (you can make this answer worth more or less)
Сохраните правильный ответ в таблице ответов
Более простое (но менее надежное) решение — просто указать, какой ответ правильный, в таблице ответов.
Answers:
question
prompt
is_correct
Сохраните правильный ответ в таблице вопросов
Я бы не рекомендовал это. Когда вы создаете вопрос, на него не будет правильного ответа, пока вы его не вставите. Это означает, что для правильного составления вопроса требуется не менее 3 запросов. Если вы используете зависимости от внешнего ключа, это быстро начнет раздражать.
Комментарии:
1. 1 Но для ясности следует отметить правильный ответ в столбце
Answers
таблицы, а не в самойQuizResult
таблице.
Ответ №2:
Выберите вариант 1, где у вас есть одна строка для каждого вопроса / вариантов / ответа.
Вариант 2 не имеет никакого смысла. Каждый раз, когда вы захотите добавить / удалить вопрос, вы будете изменять схему базы данных!! И у вас всегда будет только одна строка!!
Ответ №3:
Выбирайте свой первый вариант. Это наиболее распространенный вариант, но это не обязательно решающий аргумент. Но достоинства нормализованного дизайна многообразны:
- включить новые вопросы в свой портфель викторин проще простого. (Другой вариант требует добавления новых столбцов в таблицу).
- просто написать оператор select, который возвращает результирующий набор. (альтернативный вариант требует динамического SQL)
- легко написать графический интерфейс, который отображает вопросы и ответы, потому что каждый отображаемый набор текста соответствует одним и тем же coilumn_names.