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