Design do banco de dados de pesquisa: associe uma resposta a um usuário

12

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 é:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

Esta pergunta está relacionada a esta: Design do banco de dados de pesquisa: primeira versão. Existem erros?

VansFannel
fonte
1
Parece que você precisará de outra tabela para lidar com o relacionamento muitos para muitos entre Usuários e Opções.
precisa saber é o seguinte

Respostas:

7

Você precisa fazer uma distinção entre as respostas possíveis e as respostas selecionadas .

A Optiontabela precisa ser duas tabelas. A Optiontabela deve ser 1: M para Questione deve incluir as respostas possíveis para essa pergunta.

Então você precisa criar uma nova entidade de interseção, chame-a Selected_Optionque fica entre Usere Option.

Se sua pergunta der ao usuário a oportunidade de preencher um valor como resposta (ou seja, "OTHER: ..."), esse valor será armazenado na Selected_Optiontabela. Caso contrário, o valor escolhido pelo usuário seria o valor encontrado em Option.


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:

  • Suas perguntas têm todos os mesmos conjuntos de respostas (colunas)
  • Algumas de suas respostas (colunas) estão agrupadas.
  • Blocos de perguntas são agrupados.

Tomando o instantâneo do seu formulário como um guia, dividimos os elementos do seu formulário em entidades codificadas por cores:

Exemplo de formulário com código de cores

Isso pode ser acomodado pelo seguinte ERD lógico:

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.

Joel Brown
fonte
Atualizei minha pergunta com uma imagem de uma pergunta de pesquisa típica.
VansFannel
1
@VansFannel - Atualizei minha resposta para refletir sua pergunta editada.
Joel Brown
Muito obrigado! Você me ajudou muito. Adicionei meu design final como uma pergunta aqui: dba.stackexchange.com/questions/16066/… Você pode verificá-lo, se desejar.
VansFannel
Uma pergunta: o que significa "sequência" e "valor"? Eu não trabalhei muito com ERD (desculpe).
VansFannel
@VansFannel - As notas de atributo no ERD são apenas colunas não triviais (ou não óbvias) nas tabelas. Espero que você adivinhe onde colocar IDs, FKs, descrições etc. Pois sequenceestou sugerindo que você precisará / deseja controlar a ordem em que os itens são exibidos. Pois valueestou apontando que um valor inserido pelo usuário (não apenas uma seleção de opção) pode ser apropriado.
Joel Brown
13

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:

insira a descrição da imagem aqui

Detalhes da tabela para tabelas principais

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.

Michael Durrant
fonte
Ótimo! Obrigado pela sua resposta. Eu vou aprender muito com isso. Obrigado.
VansFannel 21/04
Ótima resposta. Muito útil, pois estou enfrentando um problema de design semelhante no momento. :)
Dr. Mike
Essa deveria ter sido a resposta selecionada. Muito útil, obrigado!
dsignr
@ Michael "Você notará que as respostas respondem aos links das perguntas, não às perguntas. Isso é intencional." Você poderia fornecer mais explicações sobre o porquê? :)
Pak
@ Michael Olá, ótima resposta! Se você precisaria personalizar o CSS de algumas perguntas em uma página HTML, como faria isso? Eu criei uma propriedade CssFile na tabela de minhas empresas, mas preciso ser mais específico em um nível de pergunta. Obrigado.
Patrick Patrick
2

Dê uma olhada nesta idéia geral:

insira a descrição da imagem aqui

(Apenas os campos mais essenciais estão incluídos no modelo acima, por questões de brevidade.)

Este modelo possui as seguintes características:

  • Uma única pergunta pode ser compartilhada entre várias pesquisas (e uma única pesquisa, é claro, pode conter várias perguntas). O SURVEY_QUESTION é a tabela "link" que implementa esse relacionamento M: N.
  • A ordem das perguntas na pesquisa é determinada por SURVEY_QUESTION.QUESTION_NO. Como {SURVEY_NO, QUESTION_NO} é uma chave (alternativa), indicada U1no 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.
  • Cada pergunta tem uma série de respostas possíveis ou "opções". A ordem visual das opções é determinada por OPTION.OPTION_NO e, como está no PK, não há duas opções para ocupar o mesmo "slot" na mesma pergunta.
  • Usuários diferentes podem fornecer respostas diferentes para a mesma pergunta (e, é claro, um usuário pode responder a várias perguntas). Esse relacionamento M: N é implementado através da tabela "link" ANSWER.
  • Um usuário responde à pergunta escolhendo no máximo uma de suas opções. Isso é garantido excluindo o OPTION_NO do PK da RESPOSTA. Se você deseja permitir que o usuário selecione várias opções, inclua OPTION_NO no PK.

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 ...

Branko Dimitrijevic
fonte
Atualizei minha pergunta com uma imagem de uma pergunta de pesquisa típica.
VansFannel 04/04
1

Você precisará de outra tabela para conter as respostas dos usuários.

user_answers
------------
  user_answer_id - chave primária exclusiva
  user_id - tabela FK para usuário
  selected_option_id - tabela FK para opção
  question_id - tabela de FK para pergunta

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:

user_alt_answers
----------------
  user_alt_answer_id - PK
  alt_answer_text - texto que o usuário digitou para uma opção "outro".
  user_answeR_id - tabela de FK para user_answers
FrustratedWithFormsDesigner
fonte
Atualizei minha pergunta com uma imagem de uma pergunta de pesquisa típica.
VansFannel
0

[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 .

Marcus Vinicius Pompeu
fonte