2012-04-10 19 views
12

Estoy tratando de implementar una prueba de opción múltiple y quiero almacenar todas mis preguntas y respuestas en una base de datos SQLite. Tendré muchas preguntas, y para cada pregunta habrá 2 o más respuestas posibles para mostrar.Cómo guardar una prueba de opción múltiple en una base de datos: decidir el esquema

Mi pregunta es, ¿cómo debo almacenar las preguntas y respuestas en una base de datos? Tengo dos ideas para un esquema (clave principal en negrita)

  1. como (muchos a muchos)

preguntas (IdPregunta: int, questionString: Cadena, correctAnswerID: int)

respuestas (answerID: int, answerString: String)

questions_and_answers (IdPregunta, AnswerID)

2.

preguntas (IdPregunta: int, questionString: Cadena, correctAnswerID: int)

respuestas (AnswerID: int, answerString: Cadena, IdPregunta: int clave externa)

No estoy seguro de cuál es mejor, o si hay otra forma?

¿Tal vez questions_and_answers sería muy grande y causaría largos tiempos de recuperación y problemas de memoria? Por otra parte, supongo que question_and_answers se indexaría en las teclas principales. En el segundo esquema, answers estaría indexado en answerID y no en questionID? lo que significa que los tiempos de búsqueda subirían ya que habría que buscar toda la tabla?

Puede haber ~ 10,000 - 20,000 respuestas. (el cuestionario se puede ejecutar en un dispositivo móvil y las preguntas deberán mostrarse "al instante")

Nota: No espero que haya demasiada superposición de respuestas entre las preguntas. No creo que la cantidad de solapamiento implique menos datos almacenados, teniendo en cuenta el espacio adicional requerido por la tabla questions_and_answers

+0

¿Es muy probable que sus respuestas se dupliquen en múltiples preguntas? – Tenner

+0

Supongo que tal vez el 30% de las respuestas aparecerán en más de una pregunta –

Respuesta

7

Su segundo esquema es el mejor, porque modela el dominio real: cada pregunta tiene una conjunto de respuestas. Incluso si puede "comprimir" los datos almacenando respuestas duplicadas una vez, no coincide con el dominio real.

En el futuro, querrá editar las respuestas. Con el esquema 1, eso significa la primera búsqueda si esa respuesta ya existe. Si existe, entonces deberá verificar si alguna pregunta aún se basa en la respuesta anterior. Si no existiera, igual deberías verificar si alguna otra pregunta se basó en esa respuesta, y luego editar esa respuesta en su lugar o crear una nueva respuesta.

El esquema 1 simplemente hace la vida realmente difícil.

Para responder a sus preguntas sobre el índice, deberá agregar un índice en questionId.Una vez que tenga ese índice, buscar las respuestas para una pregunta debe escalar.

Ahora, en una nota completamente diferente, ¿por qué usar una base de datos para esto? Considere almacenarlos como documentos simples en un formato estándar como json. Cada vez que consulta una pregunta, casi siempre querrá las respuestas, y viceversa. En lugar de ejecutar múltiples consultas, puede cargar todo el documento en un solo paso.

Si luego encuentra que necesita un almacenamiento más avanzado (consultas, redundancia, etc.) puede pasar a una base de datos de documentos como MongoDB o CouchDB.

+0

. Acabo de pensar en cómo eliminar una pregunta y me di cuenta de que sería mucho más difícil en el esquema 1. El esquema 2 genera más ¡Sienteme sentido ahora! Pensé que usaría una base de datos porque pensé que sería más fácil buscar/administrar/almacenar/editar las preguntas. Nunca se me ocurrió almacenarlos como documentos: ¿cree que proporcionaría un rendimiento notablemente mejor? Gracias por su respuesta –

+1

Si su uso de los datos es como esperaba, entonces una solución basada en documentos podría funcionar mejor. Una solución de documento solo tendrá 1 búsqueda (el documento), en comparación con (pregunta + respuesta). –

-1

Parece estancamiento (bucle circular) como IdPregunta columna se conoce como clave externa en responde mesa y correctAnswerID columna se conoce como clave externa en preguntas mesa.

Es mejor crear una columna de tipo bit en la tabla de respuestas para marcar la respuesta correcta y eliminar columnAnswerID correcta column.

Cuestiones relacionadas