Diseño de base de datos para una encuesta [cerrado]

129

Necesito crear una encuesta donde las respuestas se almacenan en una base de datos. Me pregunto cuál sería la mejor manera de implementar esto en la base de datos, específicamente las tablas requeridas. La encuesta contiene diferentes tipos de preguntas. Por ejemplo: campos de texto para comentarios, preguntas de opción múltiple y posiblemente preguntas que podrían contener más de una respuesta (es decir, marque todas las que correspondan).

Se me ocurrieron dos posibles soluciones:

  1. Cree una tabla gigante que contenga las respuestas para cada envío de encuesta. Cada columna correspondería a una respuesta de la encuesta. es decir, SurveyID, Answer1, Answer2, Answer3

    No creo que esta sea la mejor manera, ya que hay muchas preguntas en esta encuesta y no parece muy flexible si la encuesta va a cambiar.

  2. La otra cosa que pensé fue crear una tabla de preguntas y una tabla de respuestas. La tabla de preguntas contendría todas las preguntas para la encuesta. La tabla de respuestas contendría respuestas individuales de la encuesta, cada fila vinculada a una pregunta.

    Un simple ejemplo:

    tblSurvey : SurveyID

    tblQuestion : QuestionID, SurveyID , QuestionType, Question

    tblAnswer : AnswerID, ID de usuario , IdPregunta , respuesta

    tblUser : UserID , UserName

    Mi problema con esto es que podría haber toneladas de respuestas que harían que la tabla de respuestas sea bastante grande. No estoy seguro de que sea tan bueno cuando se trata de rendimiento.

Agradecería cualquier idea y sugerencia.

Miguel
fuente
¿Cuánto es "bastante grande"? Danos una estimación, ¿estamos hablando de un millón o mil millones?
Jorge Córdoba
1
Los servidores SQL en realidad están diseñados para trabajar con 'toneladas' de datos. No debería tener muchos problemas para trabajar con el esquema del que ha hablado.
Chris

Respuestas:

123

Creo que su modelo # 2 está bien, sin embargo, puede echar un vistazo al modelo más complejo que almacena preguntas y respuestas prefabricadas (respuestas ofrecidas) y permite que se reutilicen en diferentes encuestas.

- Una encuesta puede tener muchas preguntas; Una pregunta puede ser (re) utilizada en muchas encuestas.
- Se puede ofrecer una respuesta (prefabricada) para muchas preguntas. Una pregunta puede tener muchas respuestas ofrecidas. Una pregunta puede tener diferentes respuestas ofrecidas en diferentes encuestas. Se puede ofrecer una respuesta a diferentes preguntas en diferentes encuestas. Hay una respuesta predeterminada "Otro", si una persona elige otra, su respuesta se registra en Answer.OtherText.
- Una persona puede participar en muchas encuestas, una persona puede responder preguntas específicas en una encuesta solo una vez.

survey_model_02

Damir Sudarevic
fuente
1
¿Qué herramienta usaste para hacer el esquema de la base de datos?
AndHeiberg
Yo uso Altova UModel. Es rápido, ofrece una amplia selección de estructuras de modelado y guarda en casi todos los formatos. Sin embargo, cuesta.
obimod
9
También puede usar draw.io. Es gratis sin registro y fácil de usar.
usr4896260
3
¿Por qué tenemos Survey_Question_Answery Answer? ¿No es Answersuficiente?
Abubakar Ahmad,
1
Creo que Answeres suficiente, Survery_question_answeres redundante
Batman
62

Mi diseño se muestra a continuación.

El último script de creación está en https://gist.github.com/durrantm/1e618164fd4acf91e372

El script y el archivo mysql workbench.mwb también están disponibles en
https://github.com/durrantm/survey ingrese la descripción de la imagen aquí

Michael Durrant
fuente
Hola me gusta tu diseño ¿Tiene alguna muestra de datos (volcados) para las tablas? Realmente apreciaré
Emeka Mbah
Hola, primero gracias por tu trabajo, ¡es increíble! ¿Consideró las jerarquías en una de sus plantillas, tal vez? Los usuarios generalmente dan información sobre su líder y estos líderes tienen información sobre sus líderes, etc. Y los usuarios trabajan en diferentes secciones (RRHH, Producción) y estas también pueden tener una jerarquía. Por lo tanto, durante la presentación de informes, a menudo es necesario diferir entre estos niveles de organización.
ruedi
@michael: Eso es realmente útil. ¿tiene alguna referencia / enlaces github para java usando spring?
Sagar Panda
Todavía estoy tratando de descubrir cuál es la diferencia entre option_groupsy option_choicesy cuál es el caso de uso.
PHPnoob
@PHPnoob Creo que esto, como su nombre indica, simplemente agrupa las opciones. Entonces, si puede, por ejemplo, calificar entre 1 y 5, entonces option_groupsdebería permitirle exactamente eso si estoy haciendo esto bien.
mostrar
18

Definitivamente la opción # 2, también creo que podría tener una supervisión en el esquema actual, es posible que desee otra tabla:

+-----------+
| tblSurvey |
|-----------|
| SurveyId  |
+-----------+

+--------------+
| tblQuestion  |
|--------------|
| QuestionID   |
| SurveyID     |
| QuestionType |
| Question     |
+--------------+

+--------------+
| tblAnswer    |
|--------------|
| AnswerID     |
| QuestionID   |
| Answer       |
+--------------+

+------------------+
| tblUsersAnswer   |
|------------------|
| UserAnswerID     |
| AnswerID         |
| UserID           |
| Response         |
+------------------+

+-----------+
| tblUser   |
|-----------|
| UserID    |
| UserName  |
+-----------+

Es probable que cada pregunta tenga un número establecido de respuestas entre las que el usuario puede seleccionar, luego las respuestas reales se rastrearán en otra tabla.

Las bases de datos están diseñadas para almacenar una gran cantidad de datos, y la mayoría escalan muy bien. No hay necesidad real de usar una forma normal menor simplemente para ahorrar espacio.

tplaner
fuente
Hola tengo una pregunta ¿No debería SurveyId estar presente también en la tabla de respuestas o al menos una marca de tiempo que coincida con el tiempo de versión de la encuesta? Si insertó una pregunta en su encuesta original, los ID de la pregunta cambiarían y las respuestas no serían identificables. O si es redundante, ¿podría explicar cómo?
Shubham el
3

Como regla general, modificar el esquema basado en algo que un usuario podría cambiar (como agregar una pregunta a una encuesta) debería considerarse bastante maloliente. Hay casos en los que puede ser apropiado, particularmente cuando se trata de grandes cantidades de datos, pero sepa en qué se está metiendo antes de sumergirse. Tener solo una tabla de "respuestas" para cada encuesta significa que agregar o eliminar preguntas es potencialmente muy costoso , y es muy difícil hacer análisis de una manera agnóstica de preguntas.

Creo que su segundo enfoque es el mejor, pero si está seguro de que va a tener muchos problemas de escala, una cosa que me ha funcionado en el pasado es un enfoque híbrido:

  1. Cree tablas de respuestas detalladas para almacenar las respuestas por pregunta como ha descrito en 2. Estos datos generalmente no se consultarían directamente desde su aplicación, sino que se utilizarían para generar datos de resumen para las tablas de informes. Probablemente también desee implementar alguna forma de archivar o eliminar estos datos.
  2. También cree la tabla de respuestas de 1 si es necesario. Esto se puede usar siempre que los usuarios quieran ver una tabla simple de resultados.
  3. Para cualquier análisis que deba realizarse con fines informativos, programe trabajos para crear datos de resumen adicionales basados ​​en los datos de 1.

Esto es absolutamente mucho más trabajo para implementar, por lo que realmente no lo recomendaría a menos que sepa con certeza que esta tabla tendrá problemas de escala masiva.

Ryan Brunner
fuente
1

El segundo enfoque es el mejor.

Si desea normalizarlo aún más, puede crear una tabla para los tipos de preguntas

Las cosas simples que hacer son:

  • Coloque la base de datos e inicie sesión en su propio disco, no todos en C por defecto
  • Cree la base de datos tan grande como sea necesario para que no tenga pausas mientras la base de datos crece

Hemos tenido tablas de registro en la tabla de SQL Server con 10 de millones de filas.

Shiraz Bhaiji
fuente
1

No 2 se ve bien.

Para una tabla con solo 4 columnas no debería ser un problema, incluso con unos pocos millones de filas. Por supuesto, esto puede depender de qué base de datos esté utilizando. Si es algo así como SQL Server, entonces no sería un problema.

Probablemente desee crear un índice en el campo QuestionID, en la tabla tblAnswer.

Por supuesto, debe especificar qué base de datos está utilizando, así como los volúmenes estimados.

kevchadders
fuente
0

Parece bastante completo para una encuesta simple. No olvide agregar una tabla para "valores abiertos", donde un cliente puede dar su opinión a través de un cuadro de texto. Vincula esa tabla con una clave externa a tu respuesta y coloca índices en todas tus columnas relacionales para el rendimiento.

Ben Fransen
fuente
1
¿Hay alguna razón por la que no podría incluir los comentarios en la tabla de respuestas?
Michael
0

El número 2 es correcto. Use el diseño correcto hasta y a menos que detecte un problema de rendimiento. La mayoría de los RDBMS no tendrán problemas con una tabla estrecha pero muy larga.

Larry Lustig
fuente
0

Tener una gran tabla de respuestas, en sí misma, no es un problema. Mientras los índices y las restricciones estén bien definidos, debería estar bien. Tu segundo esquema me parece bien.

Dave Swersky
fuente
0

Dado el índice adecuado, su segunda solución está normalizada y es buena para un sistema de base de datos relacional tradicional.

No sé qué tan grande es enorme, pero debería contener sin problemas un par de millones de respuestas.

Jorge Córdoba
fuente
0

Puede elegir almacenar todo el formulario como una cadena JSON.

No estoy seguro acerca de su requisito, pero este enfoque funcionaría en algunas circunstancias.

mriiiron
fuente