Bases de Datos - Armado de base de datos para encuesta

   
Vista:

Armado de base de datos para encuesta

Publicado por Sebastian (1 intervención) el 16/07/2014 22:29:01
Hola a todos, verán estoy haciendo un modelo de datos conceptual para una base de datos de encuestas.
La idea es que los usuarios comunes creen sus encuestas con una pregunta y puedan escribir la cantidad opciones predefinidas que quieran y el numero de respuestas permitidos.

EJEMPLO
pregunta: tenes perro?
opcion1: SI
opcion2: NO
nroRespuestasMax: 1

OTRO EJEMPLO
pregunta: que animal tenes?
opcion1: perro
opcion2: gato
opcion3: otro
opcion4: no tengo
nroRespuestasMax: 3


Una solución es crear una entidad ENCUESTA que tenga como identificador una "pregunta" y se relacione con otra entidad RESPUESTA que tenga como atributos las opcion y el valor acumulativo de la respuesta, junto con el identificador pregunta de ENCUESTA que actua como clave foranea en la tabla RESPUESTA para unir la relacion. Entonces si una encuesta tiene n opciones en la tabla RESPUESTA aparecera n veces el identificador de ENCUESTA junto con cada opcion y valores acumulativos. Quedaría asi:


ENCUESTA = ( pregunta )
RESPUESTA = ( pregunta , opcion, valorAcumulativo)

Esta es una solución sencilla pero tengo que procesar varias filas para hacer la consulta de cada encuesta.






Entonces se me ocurrió otra solución y acá me gustaría que me digan cual esta mejor y por qué.


Dado que yo se que lo mas comun es que la mayoría de las encuestas sean de 2 opciones del tipo ( SI , NO ). Otras menos de 3, y otras menos de 4 entonces planteo lo siguiente:

una tabla por cada numero de opciones hasta como maximo 4



ENCUESTA = ( pregunta )

para preguntas con 2 opciones:
RESPUESTA = ( pregunta , opcion1, valorAcumulativo1, opcion2, valorAcumulativo2, )

para preguntas con 3 opciones:
RESPUESTA = ( pregunta , opcion1, valorAcumulativo1, opcion2, valorAcumulativo2, opcion3, valorAcumulativo3)

para preguntas con 4 opciones:
RESPUESTA = ( pregunta , opcion1, valorAcumulativo1, opcion2, valorAcumulativo2, opcion3, valorAcumulativo3, opcion4, valorAcumulativo4)

para preguntas con mas de 4 opciones planteo la primera solución:
RESPUESTA = ( pregunta , opcion, valorAcumulativo)


entonces con esta solución en las encuestas de 4 opciones o menos tan solo con encontrar el identificador "pregunta" de encuesta en la tabla respuesta ya tengo toda la consulta en una sola fila






Espero que se haya entendido sino diganme y aclaro.

Agradezco cualquier respuesta coherente
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Armado de base de datos para encuesta

Publicado por Ramiro (17 intervenciones) el 17/07/2014 20:04:35
Hola,

El diseño que planteas como solución tiene muchas fallas conceptuales y a nivel práctico te va a complicar las cosas también, incluso es un diseño que no te va a permitir resolver las consultas DML usando SQL, más allá de que a nivel técnico el DBMS te permita crear las tablas de esa manera.

A ver si me doy cuenta, primero no entiendo qué problema te puede llegar a generar el hecho de tener que "procesar varias filas" al contrario, la estructura tipo matriz que vas a recuperar con un query sql es mucho más fácil de tratar a nivel de aplicación, incluso muchos de los controles de los lenguajes visuales lidian mejor con este tipo estructurado de datos.

Por otro lado necesitarías gestionar algunos de los aspectos de la actualización de datos a nivel de aplicación ya que con sentencias DML de SQL no vas a poder, es decir necesitarías determinar a nivel de aplicación a cuál de las tablas le harás el (INSERT, UPDATE o DELETE) según la cantidad de "opciones" y de esta manera estarías desperdiciando las ventajas de usar un RDBMS.

Conceptualmente estarías violando una bocha de reglas con ese diseño por ejemplo, para que este en 1FN uno de los requisitos es
- Todos los atributos son atómicos. Un atributo es atómico si los elementos del dominio son indivisibles, mínimos. Es decir que para "RESPUESTA = (pregunta, opcion1, valorAcumulativo1, opcion2, valorAcumulativo2, opcion3, valorAcumulativo3)" estarías dividiendo el dominio de opción y valor acumulativo en más de un atributo.

Además para que esté en segunda 2NF Todos los atributos que no son parte de la clave principal tienen dependencia funcional completa respecto de todas las claves existentes en el esquema. En otras palabras, para determinar cada atributo no clave se necesita la clave primaria completa. Traducido sería, a través del atributo "pregunta" en la tabla "RESPUESTA" podrías determinar la pregunta en la tabla "ENCUESTA" pero no a la inversa, es decir, si elegís un valor de clave primaria de la tabla "ENCUESTA" no podes determinar qué valores de respuesta le corresponden.

Bueno, no sé qué otro error puede tener pero seguro algo me olvido, de todas formas no es correcto el diseño que planteas, ni a nivel práctico ni a nivel conceptual, te recomendaría que leas algo de teoría de base de datos ya que la cosa no es tan fácil como para que un manual de un DBMS en particular te ayude a diseñar bien una DB.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Armado de base de datos para encuesta

Publicado por Salvador (8 intervenciones) el 18/07/2014 10:11:44
Hola Sebastian,

Las tablas que tienes que crear son estas:

DB: Encuestas
1
2
IDENCUESTA  int IDENTITY(1,1)
  ,PREGUNTA   varchar(100)

DB: OpcionesRespuestas
1
2
3
IDOPCIONRESPUESTA   int IDENTITY(1,1)
  ,OPCIONRESPUESTA    varchar(100)
  ,ENCUESTAID         int

DB: Respuestas
1
2
3
IDRESPUESTA         int IDENTITY(1,1)
  ,SELECCIONADA       tinyint
  ,OPCIONRESPUESTAID  int

DB: RespuestasDetalles
1
2
IDRESPUESTADELLATE  int IDENTITY(1,1)
  ,RESPUESTAID

y a la hora de hacer una encuesta seria:
1
2
3
DECLARE
  @idEnc      int
  ,@idRes     int

Crear un formulario que te pida la encuesta con sus opciones de respuestas y al grabar añades:
1
2
INSERT INTO Encuesta(PREGUNTA) VALUES('Tienes Perro?');
  SET @idEnc = @@IDENTITY

Opciones de respuestas
1
2
3
INSERT INTO OpcionesRespuestas(OPCIONRESPUESTA, ENCUESTAID) VALUES('SI', @idEnc)
 
  INSERT INTO OpcionesRespuestas(OPCIONRESPUESTA, ENCUESTAID) VALUES('NO', @idEnc)

Crear un formulario que te pida la respuesta y al grabar añades:
1
INSERT INTO Respuestas(SELECCIONADA, OPCIONRESPUESTAID) VALUES(1, el IDOPCIONRESPUESTA según

OpcionesRespuesta seleccionada)
1
2
SET @idRes = @@IDENTITY
  INSERT INTO RespuestasDetalles(RESPUESTAID) VALUES(@idRes);


Después si quieres hacer la misma encuesta pues haces lo mismo:
Crear un formulario que te pida la respuesta y al grabar añades:
1
2
3
4
INSERT INTO Respuestas(SELECCIONADA, OPCIONRESPUESTAID) VALUES(1, el IDOPCIONRESPUESTA según
OpcionesRespuesta seleccionada)
  SET @idRes = @@IDENTITY
  INSERT INTO RespuestasDetalles(RESPUESTAID) VALUES(@idRes);


A la hora de hacer la estadística solo tienes que hacer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
    EC.IDENCUESTA
      ,EC.PREGUNTA
    ,OPRE.IDOPCIONRESPUESTA
      ,OPRE.OPCIONRESPUESTA
      ,COUNT(IDOPCIONRESPUESTA)
  FROM Encuestas AS EC
    INNER JOIN OpcionesRespuestas AS OPRE
      ON OPRE.ENCUESTAID = EC.IDENCUESTA
    INNER JOIN Respuestas AS RES
      ON RES.OPCIONRESPUESTAID = OPRE.IDOPCIONRESPUESTA
    INNER JOIN RespuestasDetalles AS RESDET
      ON RESDET.RESPUESTAID = RES.IDRESPUESTA
  GROUP BY EC.IDENCUESTA, EC.PREGUNTA, OPRE.IDOPCIONRESPUESTA, OPRE.OPCIONRESPUESTA
  ORDER BY EC.IDENCUESTA

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Armado de base de datos para encuesta

Publicado por Salvador (8 intervenciones) el 22/07/2014 10:59:24
Hola Sebastian,

Cuéntanos como te ha ido

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Armado de base de datos para encuesta

Publicado por Rafael Posadas (1 intervención) el 15/04/2015 23:27:28
Tengo una duda. Estoy desarrollando un sitio Web y necesito anexar un modulo de Encuesta, el problema es que una pregunta puede tener hasta 10 posibles respuestas, de las cuales puede escoger mas de 1 respuesta. Las preguntas y respuestas seran obtenidos desde la base de datos. ¿Como puedo programarlo en la base de datos? Tengo una idea pero no se si sea la correcta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Armado de base de datos para encuesta

Publicado por xve (81 intervenciones) el 16/04/2015 08:22:25
Hola Rafael, yo lo realizaria con una tabla intermedia que haga la relación... algo como muestro aquí:
http://www.lawebdelprogramador.com/foros/SQL-Server/1358978-Como-hago-una-relacion-uno-a-muchos-URGE.html#i1359205
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar