Falando muito pessoalmente, as pesquisas são um caso em que acho que não normalizar nada e armazenar JSON praticamente como está é a melhor opção.
Sem isso, você acabará com todos os tipos de casos de uso bizarros que eventualmente desejará gerenciar no futuro. Além de organizar perguntas de múltipla escolha de todos os tipos, você também precisará gerenciar essa resposta "Outro" nelas, perguntas condicionais, grupos condicionais de perguntas, a lista continua. Além do mais, as pesquisas estão – como outras formas de dados – sujeitas a mudanças, e as coisas vão de extravagantes a nucleares quando o fazem.
O mérito do JSON é que, como as pesquisas são conceitualmente independentes umas das outras, você tem pouca ou nenhuma necessidade de integridade referencial de uma para a outra, então você pode armazenar toda a árvore de perguntas e opções como um blob JSON, e se preocupe em formatá-lo em seu aplicativo.
O mesmo para cada resposta enviada:pegue o blob original, marque a resposta relevante como selecionada e assim por diante, e armazene o JSON resultante como está , em vez de armazenar referências às perguntas originais junto com o que foi respondido. Isso permitirá que você acompanhe prontamente o que os usuários realmente respondida, ao contrário do que a versão atual da pesquisa diz, e faça independentemente de quanto a pesquisa divergiu desde que foi respondida originalmente.
Se você precisar extrair as respostas posteriormente, observe que o Postgres permite indexar JSON usando índices GIST em todo o campo e índices BTREE em expressões.