Estou fazendo o modelo conceitual para um banco de dados de pesquisa.
O objetivo é armazenar as respostas dadas pelos usuários (será um aplicativo para Android).
Eu tenho três entidades: usuário, pergunta e opção.
Uma pergunta terá uma ou mais opções (por exemplo: quantos funcionários você tem? 1-40, 40-1000, +1000).
As opções terão um texto (1-40) e um valor (o valor selecionado pelo usuário).
O usuário selecionará uma (ou mais) dessas opções.
Meu projeto conceitual é:
Não sei como associar uma resposta a um usuário.
Como posso representar essa relação?
Tenho outra entidade para representar o valor da opção?
Esse modelo armazena perguntas e respostas pré-elaboradas (respostas oferecidas) e permite que sejam reutilizadas em diferentes pesquisas.
Eu tenho que representar uma pergunta como esta:
Esta pergunta está relacionada a esta: Design do banco de dados de pesquisa: primeira versão. Existem erros?
fonte
Respostas:
Você precisa fazer uma distinção entre as respostas possíveis e as respostas selecionadas .
A
Option
tabela precisa ser duas tabelas. AOption
tabela deve ser 1: M paraQuestion
e deve incluir as respostas possíveis para essa pergunta.Então você precisa criar uma nova entidade de interseção, chame-a
Selected_Option
que fica entreUser
eOption
.Se sua pergunta der ao usuário a oportunidade de preencher um valor como resposta (ou seja, "OTHER: ..."), esse valor será armazenado na
Selected_Option
tabela. Caso contrário, o valor escolhido pelo usuário seria o valor encontrado emOption
.EDITAR:
Com base no esclarecimento dos requisitos do OP: O que você precisa não é como um modelo de questionário típico das seguintes maneiras:
Tomando o instantâneo do seu formulário como um guia, dividimos os elementos do seu formulário em entidades codificadas por cores:
Isso pode ser acomodado pelo seguinte ERD lógico:
Observe que codifiquei por cores as entidades no ERD para corresponder ao instantâneo do seu formulário de amostra para mostrar a correlação.
Uma das premissas deste modelo é que cada bloco possui apenas um conjunto de perguntas (ou seja, uma
QUESTION_GROUP
) que corresponde à coluna da esquerda no bloco. Esta é uma suposição um pouco simplificadora.fonte
sequence
estou sugerindo que você precisará / deseja controlar a ordem em que os itens são exibidos. Poisvalue
estou apontando que um valor inserido pelo usuário (não apenas uma seleção de opção) pode ser apropriado.Esquema do banco de dados de pesquisa.
Este é um clássico real, feito por milhares. Eles sempre parecem "bastante simples" para começar, mas para ser bom, é realmente muito complexo. Para fazer isso no Rails, usaria o modelo mostrado no diagrama em anexo. Tenho certeza de que isso parece muito complicado para alguns, mas depois de criar algumas delas, ao longo dos anos, você percebe que a maioria das decisões de design são padrões muito clássicos, melhor tratados por uma estrutura dinâmica de dados flexível no início.
Mais detalhes abaixo:
respostas
A tabela de respostas é crítica, pois captura as respostas reais dos usuários. Você notará que as respostas respondem aos links de perguntas , não às perguntas . Isso é intencional.
input_types
input_types são os tipos de perguntas. Cada pergunta pode ter apenas um tipo, por exemplo, todas as discagens por rádio, todos os campos de texto, etc. Use perguntas adicionais para quando houver (digamos) 5 discagens por rádio e 1 caixa de seleção para "incluir?" opção ou alguma combinação desse tipo. Rotule as duas perguntas na exibição dos usuários como uma, mas internamente tenha duas perguntas, uma para os discagem por rádio e uma para a caixa de seleção. A caixa de seleção terá um grupo de 1 nesse caso.
option_groups
option_groups e option_choices permitem criar grupos 'comuns'. Um exemplo: em um aplicativo imobiliário, pode haver a pergunta 'Qual a idade da propriedade?'. As respostas podem ser desejadas nos intervalos: 1-5 6-10 10-25 25-100 100+
Então, por exemplo, se houver uma pergunta sobre a idade da propriedade adjacente, a pesquisa desejará 'reutilizar' os intervalos acima, para que o mesmo option_group e options sejam usados.
unidades de medida
units_of_measure é o que parece. Seja polegadas, xícaras, pixels, tijolos ou qualquer outra coisa, você pode defini-lo aqui.
FYI: Embora de natureza genérica, é possível criar um aplicativo além disso, e esse esquema é adequado à estrutura do Ruby On Rails com convenções como "id" para a chave primária de cada tabela. Além disso, os relacionamentos são todos simples de um para muitos sem muitos ou muitos caminhos necessários. Eu provavelmente adicionaria has_many: throughs e / ou: delegates para obter coisas como survey_name a partir de uma resposta individual facilmente, sem.multiple.chaining.
fonte
Dê uma olhada nesta idéia geral:
(Apenas os campos mais essenciais estão incluídos no modelo acima, por questões de brevidade.)
Este modelo possui as seguintes características:
U1
no diagrama acima, duas perguntas não podem ocupar o mesmo "espaço" na mesma pesquisa. Pesquisas diferentes podem ter as mesmas perguntas em uma ordem diferente.Não há nada nesse modelo de dados que force o usuário a responder a todas as perguntas - isso é algo que você precisará fazer no nível do aplicativo. No entanto, este modelo deve ser um bom começo para o que você precisa fazer ...
fonte
Você precisará de outra tabela para conter as respostas dos usuários.
Se você decidir que deseja que os usuários possam selecionar "Outros" como opção e preencher seu próprio valor, recomendo uma tabela separada para isso:
fonte
[Ainda não posso comentar, portanto, isso é uma resposta]
Para a solução apresentada pela VansFannel, fiz um modelo mais completo lá.
Por favor, verifique aqui .
fonte