Ir para conteúdo

POWERED BY:

FabianoSouza

Modelagem para questionário

Recommended Posts

Eu tenho certa dificuldade quando preciso criar tabela para armazenar respostas de questionários/prova/testes.

 

Minha maior dúvida é como defino se um questionário qualquer foi respondido.

Para responder a essa dúvida, bastaria eu fazer SELECT na tabela que armazena as respostas (e partir do resultado criar alguma lógica), ou essas respostas precisam estar associadas a uma determinada tabela, e nessa tal tabela eu usaria um campo (como booleano, por exemplo) para determinar se o questionário foi respondido ou não? 

 

Outro ponto. Seu precisar obter a informação de "data das respostas", eu devo extrair de um campo de data da própria tabela de respostas, ou de outra tabela vinculada (dúvida similar à citada acima)?

 

Eu acho estranho ter uma tabela auxiliar para guardar data de resposta do questionário, "status" do questionário (se foi respondido ou não) e etc.

Mas também acho estranho extrair essas informações da tabela que armazena as respostas, pois as informações se repetiriam (pensando num questionário cujas respostas são gravadas juntas, ao mesmo tempo).

 

Obrigado!! 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende do cenário a ser empregado, como vai ser executado:

1 - Questionários podem ser criados e editados?

2 - Perguntas podem ser criadas, editadas ou removidas do questionário?

3 - Mais de uma pessoa pode responder ao mesmo questionário?

 

Supondo que sim no básico dessas três questões, sem levar em conta de como deve funcionar o carregamento dos dados, como será o funcionamento do software.... De qualquer forma eu optaria por usar tabelas distintas para cada armazenamento.

Fica até mais simples gerenciar, evita confusão em manutenções se as tabelas apenas tem o que é necessário possuir, é a mesma lógica de um código orientado onde os métodos apenas fazem o que tem de fazer.

 

Veja como pensei na arquitetura:

DROP TABLE IF EXISTS `questionario`;
DROP TABLE IF EXISTS `pergunta`;
DROP TABLE IF EXISTS `resposta`;

CREATE TABLE `questionario` (
    `q_id` int(9) NOT NULL AUTO_INCREMENT,
    `q_title` varchar(100) NOT NULL DEFAULT '' COMMENT 'Titulo do questionario',
    `q_publicado` date COMMENT 'Data em que foi publicado',
    PRIMARY KEY (`q_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `pergunta` (
    `p_id` int(9) NOT NULL AUTO_INCREMENT,
    `p_pergunta` varchar(200) NOT NULL DEFAULT '' COMMENT 'Texto da pergunta',
    `p_questionario` int(9) NOT NULL DEFAULT '0' COMMENT 'A qual questionario pertence',
    PRIMARY KEY (`p_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `resposta` (
    `r_id` int(9) NOT NULL AUTO_INCREMENT,
    `r_resposta` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'Resposta da pergunta',
    `r_respondida` date COMMENT 'Data em que foi respondida',
    `r_pergunta` int(9) NOT NULL DEFAULT '0' COMMENT 'A qual pergunta pertence',
    `r_pessoa` int(9) NOT NULL DEFAULT '0' COMMENT 'Pessoa que respondeu',
    PRIMARY KEY (`r_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 

Fazendo a(s) pergunta(s)

Citar

 

- Pessoa abre o questionário

- As perguntas serão buscadas pelo id do questionário através da coluna p_questionario

 

Perceba que assim as perguntas podem ser carregadas sem as respostas evitando assim registros de perguntas duplicados no banco de dados para cada resposta que foi inserida.

Imaginando assim não terei a mesma pergunta repetida em cada resposta para ela.

 

Vendo a(s) resposta(s) do questionário

Citar

 

- O mesmo procedimento anterior

- As respostas serão buscadas pelos resultados da coluna r_pergunta

- Se não existe é porque não foi respondida

 

Entretanto também pode-se armazenar a respostas se foi ou não respondida, exemplo se não houve dados para inserir na coluna r_resposta pode-se adicionar a base da tabela uma nova coluna para essa função

-- na tabela resposta
`q_respondida` enum('s', 'n') NOT NULL DEFAULT 'n' NULL COMMENT 's = foi respondida, n = nao foi respondida',

Particularmente não vejo necessidade de registro para sim ou não, uma vez como mencionei é que se não tem registro do id da pergunta nas respostas para tal é porque não respondeu.

 

Mantenha atenção na tabela de resposta, através dela você chega as perguntas, pelas perguntas ao formulário e vice-versa conforme for a necessidade.

 

E mesmo que não haja necessidade de múltiplas pessoas responder, essa arquitetura acredito ser mais coesa.... se não há resposta o formulário não foi respondido.

 

Por fim não se esqueça de um bom tratamento dos dados a serem inseridos na coluna r_resposta por ser um tipo text; códigos podem ser inseridos no banco de dados, códigos de quebra de estrutura ou executáveis ao serem carregados em uma instrução.

 

 

#EDIT#

Em 31/07/2025 at 11:08, FabianoSouza disse:

Eu acho estranho ter uma tabela auxiliar para guardar data de resposta do questionário, "status" do questionário (se foi respondido ou não) e etc.

Mas também acho estranho extrair essas informações da tabela que armazena as respostas, pois as informações se repetiriam (pensando num questionário cujas respostas são gravadas juntas, ao mesmo tempo).

 

Realmente para fins de agrupamento uma nova tabela seria necessária para registrar a data, porém pensando na ergonomia de dados possuir outra tabela nessa finalidade geraria muito mais armazenamento a longo prazo.

Então apenas registre uma vez a data de uma resposta, assim não precisa armazenar novamente a mesma coisa; essa servirá para determinar quando foi respondido.

- Se respondeu pergunta A registre a data, se respondeu pergunta B não precisa registrar a data novamente.

Pode até optar em usar um varchar ao invés de date, assim pode-se manter a coluna vazia para as demais resposta economizando no armazenamento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Omar~!

 

Muito obrigado pela ajuda.

Sua resposta foi bastante clara e trouxe direcionamentos para eu resolver meu problema.

 

No meu caso, são questionários que poderão ser respondidos por várias pessoas.

Para responder, os usuários apenas selecionarão possíveis respostas já pré-definidas.

 

Minha estrutura está similar ao que você sugeriu (eu tenho uma tabela de perguntas, e outra de respostas).

Minha dúvida era justamente se eu deveria criar ou não a tabela "questionário". Para essa situação em particular, acredito que não precisarei criar essa tabela porque são perguntas "de sistema", ou seja, não serão criadas pelo usuário e nem pelo gestor do sistema (são questões baseadas em uma metodologia de análises comportamentais, então não mudam).


Mas agora entendo que para criar avaliações para outros contextos, como por exemplo para aferir conhecimentos, eu precisarei ter essa tabela "questionário".

 

Mais uma vez, muito obrigado pela grande ajuda.

 

Valew!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por andreygsantos
      Pessoal, normalmente faço modelagem de banco de dados usando o CA ErWin, mas precisei utilizar a ferramenta de modelagem do MySQL Workbench 8.0 Community.
      O problema ocorre quando a ferramenta começa a "enfeitar o pavão" quando se trata de FK. Vou mostrar um exemplo básico:

      Temos aqui 3 tabelas representando condomínio, unidades e vagas. As vagas pertencem ao condomínio, assim como as unidades. As vagas podem pertencer a unidades diferentes no decorrer do tempo porque não são vagas fixas, portanto não posso pendurar vaga na unidade.
      Problema 1: FK recebe o nome da tabela origem automaticamente.
      Até aqui posso renomear o atributo ou alterar as configurações de modelagem.
       

      Atributos renomeados, temos o seguinte modelo representado acima. Agora vamos levar a PK da entidade UNIDADE para ser FK não identificação na entidade VAGA.
       

      E agora temos o Problema 2: a ferramenta não entende que o atributo CondomínioID já existe e cria novamente com o prefixo da entidade origem. Parece um problema besta e fácil de resolver apagando o atributo duplicado e mantendo apenas UnidadeID, mas ao sincronizar com o banco de dados, começam a surgir erros com índices.
      Abaixo mostro como fica a modelagem no ERWin sem qualquer interferência:
       

      Como podem ver, a modelagem fica perfeita. O ErWin entende que o atributo já existe na entidade e leva apenas o atributo que vai diferenciar para fazer o relacionamento.
       
      Vocês devem estar se perguntando por que eu não uso o ErWin então... Mas a versão do ErWin que tenho não suporta MySQL após a versão 5.x e uma licença nova dessa ferramenta vai me custar 1 rim, senão os 2... Teoricamente, o Workbench deveria fazer essa modelagem sem problemas, mas eu não conheço bem e talvez possa ser alguma configuração. Alguém teria uma luz?
      Obrigado.
       
    • Por LucasSamuel
      Olá! Sou participante do grupo em um projeto de desenvolvimento de jogos em grupo. Estamos aceitando participantes de todos os tipos de categorias de desenvolvimento de jogos ... Convido você a participar deste projeto. A ideia de criar um grupo e ganhar US $ foi tirada de um colega meu que tinha câncer e acabou morrendo com esse sonho. Até agora, temos 4 participantes que, juntos, estamos tentando reunir 20 pessoas que têm idéias como a nossa…
      O grupo está na versão beta, porque ainda precisamos conversar com todos os participantes e convocar uma reunião para decidir democraticamente sobre jogos de categoria de mecanismo, lucros, servidores ... Mas, a princípio, o dinheiro que você ganhará estará relacionado à sua porcentagem no desenvolvimento de jogos . EX: 10% do jogo que você ajudou a criar; portanto, 10% do jogo é seu. Portanto, 10% de todos os lucros do jogo serão seus.
      Você escolhe seus turnos e horários e quanto ajudará. Pedimos apenas que você tente realizar determinadas tarefas determinadas para você, caso contrário, outro desenvolvedor fará em seu lugar. NOTA: Quanto mais você contribuir para a criação do jogo, mais lucros obterá.
      O grupo não terá um chefe ou um “comandante” organizador… Pois no grupo somos todos os chefes. Portanto, as decisões são tomadas em grupos por meio de reuniões e também de votos onde colocamos nossas idéias.
      Precisamos de mais de 20 participantes para iniciar nosso projeto. Todos no início do projeto assinaram um contrato com todos os termos “legais” do grupo, que serão decididos com todos os participantes. Portanto, se você não gosta de algum aspecto do grupo, pode e deve comentar e alterar os termos ... 
      O nome da categoria de estilo de jogo ... será decidido em grupos para que cada participante apresente 1 ou mais idéias de jogo. Serão escolhidos os mais votados e os mais adequados para todos os participantes. será vendido em várias plataformas ... android, PC ... em muitas lojas online diferentes ... será vendido acima de 5US $ e abaixo de 30US $
      Diga o que você pensa se quiser saber mais ou ligue para mim no whatsapp: +55 51 993700013 
      Vamos apresentar a todos os participantes do nosso grupo e aplicá-lo ao nosso grupo, discutir, conversar, criar, testar, aplicar e vir com idéias para o grupo com você.
    • Por Patricia_W
      Olá!
       
      Estou precisando armazenar endereços (completos.. cep, logradouro, numero, cidade, estado..) do Brasil mas também do exterior.
      Como a estrutura de endereçamento é diferente de um país para o outro, como poderia ser feita uma modelagem que armazenasse estes dados sem que fosse necessário criar um conjunto para dados nacionais e outro para dados internacionais?
       
      Obrigada =)
    • Por DoVaK
      Boa tarde,
       
      Estamos desenvolvendo um software wms (controle de estoque) que inicialmente funcionará na nuvem.
      Por ser um sistema complexo e com enorme quantidade de dados, estamos pensando em criar um banco de dados separado para cada empresa (cliente).
      Teriamos um banco de dados nosso onde estariam centralizadas algumas informações importantes, tais como as informações de cada empresa, dados para pagamento e os códigos que referenciariam o banco de dados especifico de cada cliente nosso (para fazer o redirecionamento correto no login).
      Seguem as dúvidas:
       
       - Esta seria uma boa forma de modelagem? 
       - Seria interessante ter o cadastro de todos os usuários no nosso banco de dados central ou deixar a tabela de usuários no banco de cada empresa?
       
      OBS: o SGBD é o MySQL.
       
      Obrigado pela ajuda.
       
      Jonathan.
    • Por Motta
      Segue uma dúvida quase exotérica que tenho :
       
      Qual seria a melhor forma de Modelar um BI para refletir a evolução temporal de uma carteira de beneficiários (um Plano de saúde) por exemplo.
       
      Para um ERP é simples mas BIs tendem a complicar este tipo de coisa pois beneficiários entrem e saem ao longo do tempo.
       
      Alguém já passou por este problema ?
       
      Que resolveu ?
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.