Ditt första schema är det bättre valet av de två. Vid det här laget bör du inte oroa dig för prestandaproblem. Oroa dig för att göra en bra, flexibel, utdragbar design. Det finns alla möjliga knep du kan göra senare för att cache data och göra frågor snabbare. Att använda ett mindre flexibelt databasschema för att lösa ett prestandaproblem som kanske inte ens inträffar är ett dåligt beslut.
Dessutom ses många (kanske de flesta) enkätresultat endast periodiskt och av ett litet antal personer (arrangörer, administratörer, etc.), så du kommer inte ständigt att fråga databasen efter alla resultat. Och även om du var det, kommer prestationen att bli bra. Du skulle förmodligen paginera resultaten på något sätt ändå.
Det första schemat är mycket mer flexibelt. Du kan som standard inkludera frågor som namn och adress, men för anonyma undersökningar kan du helt enkelt inte skapa dem. Om enkätskaparen bara vill se allas svar på tre frågor av femhundra, är det en väldigt enkel SQL-fråga. Du kan ställa in en överlappande radering för att automatiskt ta bort svar och frågor när en undersökning raderas. Att generera statistik blir mycket lättare med detta schema också.
Här är en något modifierad version av schemat du angav. Jag antar att du kan ta reda på vilka datatyper vart går :-)
surveys survey_id (index) title questions question_id (index, auto increment) survey_id (link to surveys->survey_id) question responses response_id (index, auto increment) survey_id (link to surveys->survey_id) submit_time answers answer_id (index, auto increment) question_id (link to questions-question_id) answer