Diseño de database para formulario web general

Quiero build un back-end de un formulario web general que contenga preguntas que el usuario pueda responder. Hay varios types de preguntas.

  • Pregunta de text "normal": la pregunta se responde a través de un campo de text simple. Ejemplo : información personal general, como el nombre.
  • Pregunta de Textarea: lo mismo, pero con más espacio para escribir la respuesta. Ejemplo : un cuadro "Más información que desea agregar".
  • Pregunta de opción múltiple: una pregunta con algunas respuestas pnetworkingefinidas, de la cual se puede elegir una sola. Ejemplo : ¿Qué tan bien puedes progtwigr PHP? [] no muy bien [] promedio [] He escrito el libro.
  • … (los types de preguntas adicionales deben ser ampliables sin tener que hackear demasiado)

Las inputs que ingresan los usuarios deben almacenarse en una database MySQL.

El problema que tengo es que el formulario debe ser editable. No se editará con mucha frecuencia, pero cuando cambie, las presentaciones existentes no se verán afectadas por los cambios. Debido a este hecho, no creo que sea suficiente para hacer la configuration a través de un file XML.

Mi enfoque es el siguiente:

  • La configuration de las preguntas se realiza utilizando la database MySQL (¿mejores methods?)
  • El layout de la database es el siguiente:
    • preguntas
      • Yo dint
      • pregunta: TEXTO
      • tipo: ENUM ('NORMAL', 'TEXTAREA', 'MULTIPLE')
      • active: BOOL – verdadero si la pregunta se usa en la forma actual. falso si ya no se usa y solo se mantiene en la database para verificar la compatibilidad con los envíos anteriores.
    • q_multiplechoice
      • Yo dint
      • questionid: INT
      • respuesta: TEXTO
    • presentaciones
      • Yo dint
      • ID de usuario: INT
    • detalles de la presentación
      • submissionid: INT
      • questionid: INT
      • givenanswer: TEXT

Como puede ver, usa cuatro tablas para un formulario web simple. No creo que este sea el enfoque óptimo para usar aquí y quiero que me pregunte si podría darme algunas pistas sobre los cambios de layout que debería aplicar.

(Otro enfoque en el que he pensado es almacenar una cadena HTML con una presentación renderizada en la database de envíos y usar un file de configuration simple para configurar las preguntas. Los envíos anteriores no se verán afectados por los cambios de configuration ya que ya estaban almacenados representado en MySql. El problema con este enfoque es, cuando el layout cambia y el envío debe mostrarse en otro layout).

En primer lugar, accedamos a vetar la idea de almacenar HTML en la database, excepto, tal vez, algunas tags como saltos de línea, negrita, énfasis y subrayado, solo para el text de la pregunta. Definir las encuestas y explotar su resultado será mucho más fácil si el foco está en el text / semántica de la encuesta, en lugar de Ver detalles.

Para admitir la configuration de View ("layout"), CSS podría ser el ticket. Esto sería key en el ID de la pregunta que se utilizaría como ID para el div (u otro contenedor html) donde la Vista decide almacenar la pregunta. algunos nombres de class también se pueden enumerar en el logging de preguntas, pero se definen en CSS.

En el esquema de database propuesto, lo importante parece estar allí. Sin embargo, no veo dónde se almacenan las respuestas enviadas; ¿eso es en las tablas de submit + submitiondetails? Si es así, ¿dónde se almacena el tipo de respuesta MÚLTIPLE, se convierten en text, en una respuesta dada? (No creo que deberían hacerlo, a less que prefiramos capturar valores ligeramente diferentes cuando la encuesta se modificó durante la campaña).

Algunos attributes e ideas faltantes:

  • MÚLTIPLE (u otro tipo) debe poder admitir opciones de tipo "button de radio" ("solo-uno-de"). una forma posible de hacerlo es agregar un atributo al tipo, para definir la cantidad máxima de opciones permitidas, un aspecto de encuesta común: "elegir 3 entre los siguientes …"
  • El logging de preguntas podría tener una "campaña" o ID de encuesta , lo que permite almacenar varias encuestas en la misma tienda.
  • Sin ser demasiado sofisticado, algunas preguntas podrían basarse en una pregunta previa tipo "boolean" . (Si la persona encuestada responde que "no" es dueño de un automobile, no pregunte por la frecuencia de los cambios de aceite …) Esto podría definirse por un questionID y un ResponseValue (? Text for genericity?).
  • tabla de preguntas: agregue un ' Número de página ', lo que permite agrupar las preguntas (a less que esta información esté definida en un concepto de contenedor de preguntas como "encuesta" o "campaña")
  • tabla de preguntas: agregue ' Número de secuencia ' que permite get preguntas en un order pnetworkingefinido (a less que provenga de una tabla de encuesta / campaña que no se muestra aquí)
  • q_multiplechoice: (o en cualquier tabla donde se enumeren las opciones para una MULTIPLE CHOICE dada; tengo dudas sobre esta tabla viendo sus campos como showin en la pregunta). Agregue un Número de Secuencia , permitiendo enumerar las opciones en un order particular .