2010-05-02 19 views
6

Estoy haciendo una prueba en línea con php y mysql y necesito ayuda para decidir cómo diseñar la base de datos para insertar preguntas y respuestas de forma óptima y seleccionar preguntas para la prueba. La tabla contendrá 80 preguntas cada una con 4 opciones posibles más la respuesta correcta.Diseño de base de datos MySql para una prueba

Al recuperar las preguntas y las opciones de la base de datos, seleccionaré aleatoriamente 25 preguntas y sus opciones.

¿Es mejor hacer una sola columna para todas las preguntas, opciones y respuestas correctas? Por ejemplo:

ID | Q | OPT1 | OPT2 | OPT3 | OPT4 | ANS 

¿O sería mejor hacer una columna para cada pregunta, opción y respuesta correcta? Por ejemplo:

Q1 | Q1_OPT1 | Q1_OPT2 | Q1_OPT3 | Q1_OPT5 | Q1_ANS | Q2 | Q2_OPT1 | Q2_OPT2... 

Respuesta

10

Sería mejor almacenar las respuestas posibles en una tabla separada. Esto le permite tener cualquier cantidad de respuestas por pregunta en lugar de solo 4. También permite que las preguntas tengan un número diferente de respuestas. Si tiene más de una prueba, es posible que también desee una Tabla 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 

Ahora la respuesta correcta se vuelve mucho más complicada. Yo prefiero las implementaciones más altos aquí:

Cada pregunta tiene un valor y cada respuesta tiene un valor

Un sistema Recientemente trabajé con usted podría asignar un valor en puntos para cada pregunta y cada respuesta. Las respuestas incorrectas a menudo obtuvieron 0, las respuestas correctas obtuvieron el monto total. También podría tener respuestas parcialmente correctas utilizando este método. Este es el método con el que iría.

Se podía ir y decir que cada pregunta vale 10 puntos o podría asignar diferentes pesos a diferentes preguntas:

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) 

almacenar la respuesta correcta en el Respuestas Tabla

Una más sencilla (pero menos robusto) solución es simplemente decir cuál respuesta es la correcta en la tabla de Respuestas.

Answers: 
    question 
    prompt 
    is_correct 

tienda la respuesta correcta en la Tabla Preguntas

yo no lo recomendaría. Cuando crea una pregunta, no tendrá una respuesta correcta hasta que inserte una. Esto significa al menos 3 consultas para hacer una pregunta correctamente. Si usa dependencias de clave externa, esto se volverá molesto rápidamente.

+1

+1 Pero para ser claros, uno debe marcar la respuesta correcta en una columna en la tabla 'Respuestas', no en la tabla' QuizResult'. –

+0

+1 para una gran respuesta, buenas cosas. – Rog

3

Vaya con la opción 1, donde tiene una fila para cada pregunta/opción/respuesta.

La opción 2 no tiene ningún sentido. ¡Cada vez que quiera agregar/eliminar una pregunta, estará modificando el esquema de la base de datos! ¡Y solo tendrás una fila!

1

Vaya por su primera opción. Es la opción más normalizada, pero eso no es necesariamente un argumento decisivo. Pero las virtudes del diseño normalizado son múltiples:

  • es un pedazo de pastel para incluir nuevas preguntas en su cartera de preguntas. (La otra opción requiere agregar nuevas columnas a la tabla).
  • es simple escribir la instrucción de selección que devuelve el conjunto de resultados. (la opción alternativa requiere un SQL dinámico)
  • es fácil escribir una GUI que muestre las preguntas y respuestas, ya que cada conjunto de texto mostrado se correlaciona con el mismo coilumn_names.
Cuestiones relacionadas