Дизайн базы данных MySQL для теста

#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.