Concepção da base de dados para um inquérito [encerrado]

Preciso de criar uma pesquisa onde as respostas são guardadas numa base de dados. Pergunto - me qual seria a melhor maneira de implementar isto na base de dados, especificamente as tabelas necessárias. O inquérito contém diferentes tipos de perguntas. Por exemplo: campos de texto para comentários, perguntas de escolha múltipla, e possivelmente perguntas que poderiam conter mais de uma resposta (ou seja, verificar tudo o que se aplica).

Descobri duas soluções possíveis:
  1. Criar um gigante quadro que contém as respostas para cada inquérito submissao. Cada coluna iria corresponde a uma resposta do inquerito. ou seja, Levantador, Answer1, Answer2, Answer3

    Acho que esta não é a melhor maneira. uma vez que há muitas perguntas nesta pesquisa e não parece muito flexível se a pesquisa for para mudar.

  2. A outra coisa em que pensei foi ... criar uma tabela de perguntas e Respostas tabela. O quadro de perguntas conter todas as perguntas para a inquerito. Resposta a tabela conteria respostas individuais do inquérito, cada fila ligada a uma pergunta.

    um exemplo simples:

    TblSurvey : SurveyID

    Tblqu Question: QuestionID, SurveyID, QuestionType, Question

    TblAnswer : AnswerID, UserID, Pergunta , Resposta

    TblUser : Utilizador, Utilizador

    O meu problema com isto é que ... podem ser toneladas de respostas que faça a resposta a mesa é enorme. Não sei se é assim tão bom quando ... vem ao espectáculo.

Agradeço todas as ideias e sugestões.

Author: Michael, 2009-11-19

11 answers

Eu acho que o seu modelo # 2 está bem, no entanto você pode dar uma olhada no modelo mais complexo que armazena perguntas e respostas pré-feitas (respostas oferecidas) e permite que elas sejam reutilizadas em diferentes pesquisas.

- uma pesquisa pode ter muitas perguntas; uma pergunta pode ser (re)usada em muitas pesquisas.
- uma resposta (pré-feita) pode ser oferecida para muitas perguntas. Uma pergunta pode ter muitas respostas. Uma pergunta pode ter respostas diferentes em diferentes pesquisas. Uma resposta pode ser oferecidos a diferentes perguntas em diferentes pesquisas. Há uma resposta padrão "Outra", se uma pessoa escolhe outra, sua resposta é gravada em resposta.Outro texto. Uma pessoa pode participar em muitos inquéritos, uma pessoa pode responder a uma pergunta específica num inquérito apenas uma vez.

survey_model_02

 101
Author: Damir Sudarevic, 2016-08-13 18:44:37

O meu desenho é mostrado abaixo.

O mais recente script create é em https://gist.github.com/durrantm/1e618164fd4acf91e372

O guião e a bancada de trabalho do mysql.o ficheiro mwb também está disponível em:
https://github.com/durrantm/survey enter image description here
 37
Author: Michael Durrant, 2015-05-05 11:27:37

Definitivamente Opção #2, também acho que você pode ter um lapso no esquema atual, você pode querer outra tabela:

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

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

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

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

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

Cada pergunta provavelmente terá um número definido de respostas das quais o usuário pode selecionar, então as respostas reais serão rastreadas em outra tabela.

As bases de dados são concebidas para armazenar muitos dados, e a maior parte escala muito bem. Não há necessidade real de usar uma forma normal menor apenas para guardar no espaço.

 16
Author: tplaner, 2009-11-19 16:25:15
Como regra geral, modificar o esquema baseado em algo que um usuário poderia mudar (como adicionar uma pergunta a uma pesquisa) deve ser considerado bastante fedorento. Há casos em que pode ser apropriado, especialmente quando lidamos com grandes quantidades de dados, mas sabemos no que nos estamos a meter antes de mergulharmos. Ter apenas uma tabela "respostas" para cada pesquisa significa que adicionar ou remover perguntas é potencialmente muito caro, e é muito difícil fazer análises em uma pergunta-agnóstico forma. Acho que a tua segunda abordagem é a melhor, mas se tens a certeza que vais ter muitas preocupações em escala, uma coisa que funcionou comigo no passado foi uma abordagem híbrida:
  1. crie tabelas de resposta detalhadas para armazenar as respostas por Pergunta Como você descreveu em 2. Estes dados geralmente não seriam diretamente questionados a partir de sua aplicação, mas seriam usados para gerar dados resumidos para tabelas de relatórios. Você provavelmente também gostaria de implementar alguma forma de arquivamento ou a eliminar estes dados.
  2. também crie a tabela de respostas a partir de 1 Se necessário. Isto pode ser usado sempre que os usuários querem ver uma tabela simples para resultados.
  3. para qualquer análise que precise de ser feita para fins de comunicação, programe postos de trabalho para criar dados resumidos adicionais com base nos dados de 1.
Este é absolutamente muito mais trabalho para implementar, então eu realmente não aconselharia isso a menos que você tenha certeza de que esta tabela vai correr em grande escala preocupacao.
 3
Author: Ryan Brunner, 2009-11-19 16:16:59
A segunda abordagem é a melhor.

Se quiser normalizá-lo ainda mais, poderá criar uma tabela para os tipos de perguntas

As coisas simples a fazer são:

  • Coloque a base de dados e faça login no seu próprio disco, nem tudo em C por omissão
  • Crie a base de dados tão grande quanto necessário para que não tenha pausas enquanto a base de dados cresce

Temos tabelas de log na tabela do servidor SQL com 10 de milhões de linhas.

 1
Author: Shiraz Bhaiji, 2009-11-19 16:25:23
O número 2 parece bem.

Para uma tabela com apenas 4 colunas não deve ser um problema, mesmo com alguns milhões de linhas. Claro que isso pode depender do banco de dados que você está usando. Se for algo como o servidor SQL então não será problema.

Você provavelmente gostaria de criar um índice no campo QuestionID, na tabela tblAnswer.

É claro que precisa de especificar qual a base de dados que está a utilizar, bem como os volumes estimados.

 1
Author: kevchadders, 2010-07-09 19:33:56
Parece muito completo para um inquérito smiple. Não se esqueça de adicionar uma tabela para "valores abertos", onde um cliente pode fornecer sua opinião através de uma caixa de texto. Ligue essa tabela com uma chave estrangeira para a sua resposta e coloque índices em todas as suas colunas relacionais para o desempenho.
 0
Author: Ben, 2009-11-19 16:10:23

O número 2 está correcto. Use o design correto até e a menos que você detecte um problema de desempenho. A maioria das RDBMS não terá um problema com uma mesa estreita, mas muito longa.

 0
Author: Larry Lustig, 2009-11-19 16:10:37
Ter uma grande tabela de respostas, por si só, não é um problema. Desde que os índices e restrições sejam bem definidos você deve estar bem. O teu segundo esquema parece-me bem.
 0
Author: Dave Swersky, 2009-11-19 16:11:35

Dado o índice adequado, a sua segunda solução está normalizada e é boa para um sistema de base de dados relacional tradicional.

Não sei se é enorme, mas deve aguentar sem problemas alguns milhões de respostas.
 0
Author: Jorge Córdoba, 2009-11-19 16:11:46

Você pode optar por armazenar o formulário inteiro como uma cadeia JSON.

Não tenho a certeza quanto às suas exigências, mas esta abordagem funcionaria em algumas circunstâncias.
 0
Author: mriiiron, 2017-04-17 19:47:33