Ik weet dat je met veel dingen tegelijk worstelt, maar het beste antwoord lost het probleem op dat ikegami snel voorbij op weg om het in Perl te doen:
Mensen doen vaak veel meer dan nodig is op applicatieniveau, omdat ze nooit leren om de juiste dingen in de database te doen (zoals je andere vraag die beter beantwoord kan worden door een geschikte SQL-query in plaats van Perl). Maar terzijde:veel mensen doen dat omdat ze het schema niet kunnen veranderen. Sociale heuristieken, zoals de juiste toepassing van bier, effenen dat pad soms. Een beetje werk om de databasemensen te overtuigen, betaalt zich later in veelvouden uit. En, even terzijde, "full-stack developer" laat vaak elk geavanceerd gebruik van databases achterwege.
Ik ga niemand C.J. Date's Database in Depth laten lezen , maar het heeft veel waarde om het schema goed te krijgen. Met recht bedoel ik dat het de minste moeite en complexiteit kost om het te gebruiken. Dingen zouden gemakkelijk moeten zijn, en je zou deze dingen niet op applicatieniveau moeten herschikken.
U wilt het aantal keren tellen dat elk antwoord is geselecteerd. Tellen is iets dat databases heel goed kunnen, dus laat de database het doen.
U heeft enkele vragen. Vragen hebben verschillende antwoorden. Enquêtes groeperen reeksen vragen. Mensen reageren op enquêtes door hun antwoorden aan de vragen te koppelen.
Hier is een eenvoudig schemaontwerp (en uiteindelijk zal een database-man verschijnen en me vertellen dat ik het niet goed heb gedaan, maar dat is prima). De truc is dat niets meerdere kolommen hoeft te hebben die ongebruikt zijn. Alles wordt geleverd in een net klein pakketje (de "relatie" in "relationele database") die gemakkelijk met de andere dingen kan worden verbonden via "buitenlandse sleutels" (bijv. vraag_id om een antwoord op de vraag in kaart te brengen). Antwoorden hebben bijvoorbeeld meerdere rijen voor dezelfde question_id
.
Als iemand binnen wil komen met de mooie modelleertools en de foto wil maken, ga ervoor. Ik markeer dit als community-wiki.
Table: Questions
id
text
Table: Answers
id
text
question_id
Table: Surveys
id
title
Table: SurveyQuestionSet
id
survey_id
question_id
Table: Respondent
id
text
Table: Response
id
respondent_id
survey_id
question_id
answer_id
Eenmaal in kaart gebracht en correct genormaliseerd (lees op normale formulieren ), is het heel eenvoudig om de gewenste gegevens te krijgen met SELECT's. Het ideaal van normaliseren is simpelweg om informatie niet te herhalen of in een inconsistente toestand te laten komen. In deze vormen worden veel dingen veel gemakkelijker om te doen.
En als je zulke dingen wilt oefenen, is de Stackoverflow Data Explorer is een real-life dataset genormaliseerd naar wat ik hier heb gepresenteerd.
Nu tel je gewoon het aantal keren answer_id
verschijnt voor een bepaalde combinatie van enquête en vraag. Slim gebruik van GROUP BY
doet al het werk voor je. U hoeft niet langer door rijen te lopen en tientallen ongebruikte kolommen te bekijken om erachter te komen hoe u ze kunt tellen. Niet alleen dat, maar u kunt deze dingen ook views
maken , wat betekent dat u de query één keer schrijft en de database doet alsof de resultaten een tabel zijn. U kunt dan eenvoudig de weergave opvragen (dus alle JOIN
s en zijn eveneens verborgen), wat veel eenvoudiger is. Opgeslagen procedures worden ook vaak over het hoofd gezien.