Design do banco de dados do questionário - qual o melhor caminho?

15

Eu tenho UMA página html longa, vários conjuntos de perguntas divididos em pequenas seções (aproximadamente 15 subseções em uma página), o total de perguntas são cerca de 100 perguntas: varia de entrada, múltipla escolha, caixas de seleção, botões de opção, área de texto, e upload de arquivo. Uma pergunta pode conter muitas respostas obtidas de grupos de caixas de seleção, grupos de listas de seleção, grupos de seleções múltiplas ou todas combinadas em uma única resposta. Eu pensei em usar esse design de banco de dados abaixo, mas descobri recentemente que não é a boa abordagem, afinal.

  1. Um cliente pode ter apenas um conjunto de perguntas: um cliente por 100 perguntas.
  2. Para a abordagem antiga, eu não mantenho perguntas no banco de dados, mas atribuo como constante na codificação PHP. O problema é que tenho que comparar a pergunta no PHP para sincronizá-la com a resposta no banco de dados. Se uma pergunta tivesse sido alterada / excluída / movida do PHP, eu definitivamente me perderia para combiná-la com a resposta no banco de dados do questionário. Melhor solução?
  3. Posso manter várias respostas obtidas de vários elementos no formulário em um campo como uma resposta? Como recuperar esse campo e exibi-lo novamente para visualização do cliente no formulário?
  4. Qual opção abaixo devo escolher?

OPÇÃO 1: Abordagem antiga (1 tabela)

TABELA: Questionário

  • ID (PK)
  • Identificação do Cliente
  • Status
  • A1
  • A2
  • A3
  • .
  • .
  • .
  • A100

OPÇÃO 2: Nova abordagem (2 tabelas)

TABELA: Pergunta

  • QID (PK)
  • Pergunta (varchar)

TABELA: Resposta

  • AJUDA (PK)
  • Identificação do Cliente
  • QID (int)
  • Resposta (varchar)

Ou opção 3?

Modular
fonte
Você pode adicionar mais informações sobre o aplicativo, por favor. - Os questionários são criados dinamicamente? IE: este questionário deve ter essas perguntas enquanto outro questionário deve ter essas outras perguntas. - As perguntas dos questionários são dinâmicas? IE: O cliente pode adicionar novas perguntas posteriormente. Independentemente de se tratar de um sistema dinâmico ou estático, você terá que armazenar os resultados 1: 1 da pergunta-resposta de maneira diferente de 1: M Pergunta: Respostas no banco de dados.
Zambonilli 30/01
Sim e não, respectivamente (pergunta dinâmica pode ser mais tarde na 2ª fase, mas não agora.)
Modular
Eu votei para fechar estas 100 perguntas: varia de entrada, múltipla escolha, caixas de seleção, botões de opção, área de texto e upload de arquivos é muito amplo para ser útil.
Evan Carroll

Respostas:

17

Definitivamente, não codifique seu questionário. Use um banco de dados relacional ou arquivos xml. Eu proponho as seguintes tabelas

  • Questionnaire: Descrição geral do questionário. Título, nome da pesquisa, data de lançamento do questionário, versão e assim por diante.

  • Section: As seções em que um questionário é composto. Número da seção, título da seção, descrição.

  • Question: As perguntas pertencentes a uma seção. Número da pergunta, texto da pergunta, descrição, tipo de pergunta (texto, múltipla escolha etc.).

  • Question_Choice: As respostas possíveis pertencentes a uma pergunta correspondente às caixas de seleção únicas, botões de opção e assim por diante. Texto da escolha, número da escolha, ordem.

  • Respondent: As pessoas que respondem às perguntas. Dados pessoais, número do usuário.

  • Interview: Entrevistas, testes ou pesquisas (dependendo da natureza do questionário) pertencentes a um respondente e a um questionário. Se um respondente sempre puder responder apenas a um questionário (ou se a pesquisa for anônima), esta tabela estará obsoleta e poderá ser mesclada com a tabela Respondent. Data da entrevista (ou data do teste ou data da pesquisa), entrevistador (se aplicável).

  • Answer: Respostas pertencentes a uma entrevista (ou respondente, veja acima) e a uma pergunta. Responda o texto (para perguntas sobre o tipo de texto), escolha (para os botões de opção).

  • Answer_Choice: Opções pertencentes a uma resposta e uma pergunta_ escolha quando várias opções podem ser verificadas.

Essa é uma abordagem muito normalizada; no entanto, você pode decidir concatenar as opções em uma sequência ou armazená-las como padrão de bits ou simplificá-las de outra maneira, dependendo de suas necessidades.

Olivier Jacot-Descombes
fonte
6

Você precisa de algumas mesas,

1 - As perguntas (ID da pergunta, tipo de entrada, visível, tipo de pergunta, texto da pergunta, respostas esperadas ...)

2 - As respostas (ID da pergunta, ID do usuário, ID da atividade, resposta ....)

3 - Os usuários (ID do usuário, nome do usuário ......)

4 - Uma tabela para armazenar uma atividade de pergunta / resposta (ID da atividade, dados / hora, ID do usuário)

Você também pode gostar de ter uma tabela que especifique as perguntas que devem ser aplicadas a cada atividade - agrupadas por usuário ou talvez uma coleção de perguntas. As chaves estrangeira / primária serão as colunas que têm o mesmo nome em várias tabelas e devem ser indexadas.

Se você usar essa estrutura, poderá adicionar uma pergunta ou usuário ou alterar uma resposta sem precisar alterar o esquema ou o código de apresentação - verifique se o código da apresentação é criado dinamicamente no tempo de execução - basta adicionar um registro no local apropriado.

Essa abordagem pode levar mais tempo para se desenvolver inicialmente do que uma abordagem codificada, mas será muito mais simples de manter, pois você só precisará alterar dados para alterar o comportamento.

(Uma dica: para criar sua camada de apresentação, você precisará de uma consulta que obtenha as perguntas apropriadas a serem exibidas. Em seguida, percorra esse conjunto de resultados e chame um método para processar a pergunta na tela, os métodos escolhidos como apropriados para o apresentação dessa pergunta [caixa de texto, grupo de rádio etc.])

adam f
fonte
+1 Não tem certeza da Tabela 4, mas boa resposta geral. Gosto particularmente da mudança de nomes de tabelas singulares para o plural, isto é, Pergunta >> Perguntas.
precisa saber é o seguinte