På ett väldigt personligt sätt är undersökningar ett fall där jag tror att man inte normaliserar någonting och lagrar JSON i stort sett som det är är det bättre alternativet.
Utan det kommer du att sluta med alla möjliga bisarra användningsfall som du så småningom kommer att vilja hantera på vägen. Förutom att städa flervalsfrågor av alla slag, måste du också hantera det där "Andra"-svaret i dem, villkorsfrågor, villkorsgrupper av frågor, listan fortsätter och fortsätter. Vad mer, undersökningar är – precis som andra former av data – föremål för förändringar, och saker och ting går från otäcka till nukleära när de gör det.
Förtjänsten med JSON är att, eftersom undersökningar är konceptuellt oberoende av varandra, har du lite eller inget behov av referensintegritet från den ena till den andra, så du kan lika gärna lagra hela trädet av frågor och alternativ som en JSON-blob, och oroa dig för att formatera den i din app.
Samma för varje inlämnat svar, för den delen:ta den ursprungliga klatten, markera det relevanta svaret som valt och så vidare inom det, och lagra den resulterande JSON som den är , snarare än att lagra referenser till de ursprungliga frågorna tillsammans med det som besvarades. Detta gör att du enkelt kan hålla reda på vilka användare som faktiskt är besvarade, i motsats till vad den nuvarande versionen av undersökningen säger, och gör oavsett hur mycket undersökningen har avvikit sedan den ursprungligen besvarades.
Om du behöver bryta svaren senare, notera att Postgres tillåter att indexera JSON med hjälp av GIST-index på hela fältet och BTREE-index på uttryck.