Se ha enfrentado a un problema común:tratar de usar algo estático (base de datos con estructura predefinida) para algo dinámico (conjunto de conjuntos de datos individuales que solo tienen una cosa en común:provienen de formularios). Lo que quieres es factible con bases de datos, pero sería mucho más fácil prescindir de ella; sin embargo, dado que asumo que realmente desea utilizar una base de datos para esto, esto es lo que haría:
- Tienes un
document
(o cuestionario ) que contiene múltiplesquestions
. Ambos son lo suficientemente genéricos y requieren sus propias tablas, tal como lo ha hecho hasta ahora. - Cada pregunta tiene un
type
que define qué tipo de pregunta es (selección múltiple, forma libre, seleccione una... ) y, por supuesto, la pregunta también tieneoptions
. Así que son dos mesas más. El razonamiento aquí es que desacoplarlos de la pregunta real permite que exista cierto nivel de abstracción y sus consultas seguirán siendo algo simples, aunque posiblemente laaaaargas.
Entonces, cada documento tiene 1..n preguntas, cada pregunta tiene 1 tipo y 1..n opciones. Saltándome un poco, esto es lo que estoy pensando con las tablas de enlaces, etc.
Document
bigint id
DocumentQuestions
bigint document_id
bigint question_id
Question
bigint id
varchar question
QuestionType
bigint question_id
bigint type_id
Type [pre-filled table with id:type pairs, such as 1=freeform, 2=select one etc.]
QuestionOptions
bigint id
bigint question_id
varchar description
varchar value
Answers
bigint id
bigint document_id
[etc. such as user_id]
QuestionAnswers
bigint answer_id
bigint question_id
bigint questionoptions_id
Este tipo de diseño permite varias cosas:
- Las preguntas en sí mismas son reutilizables, muy útiles si está haciendo un genérico "responda estas x preguntas aleatorias de un grupo de y preguntas ".
- Se pueden agregar nuevos tipos fácilmente sin romper los existentes.
- Siempre puede navegar a través de la estructura con bastante facilidad, por ejemplo, "¿Cuál era el nombre del documento para esta única pregunta que tengo? " o "¿cuántas personas han respondido incorrectamente a esta pregunta?"
- Debido a que los tipos están separados, puede crear una interfaz de usuario (web) que refleje fácilmente el estado en la base de datos; mejor aún, si el tipo cambia, es posible que ni siquiera tenga que tocar su código de interfaz de usuario.
- Dado que cada posible opción para una pregunta es su propia fila en
QuestionOptions
tabla, puede obtener el valor real muy fácilmente.
El problema obvio con esto es que requiere un acoplamiento bastante estricto entre las tablas para la integridad y será un dolor de cabeza para que funcione correctamente al principio. También desde value
en las QuestionOptions
es varchar, debe poder analizar muchas cosas e incluso es posible que desee introducir otro campo para sugerencias de conversión.
Espero que esto ayude aunque no estés de acuerdo con mi solución en absoluto.