Vím, že se potýkáte s mnoha věcmi současně, ale nejlepší odpověď řeší problém, který ikegami rychle prošel na cestě k tomu, aby to udělal v Perlu:
Lidé často na úrovni aplikace dělají mnohem více, než potřebují, protože se nikdy nenaučí dělat správné věci v databázi (jako je vaše jiný dotaz což je lépe zodpovězeno vhodným SQL dotazem namísto Perlu). Ale mimochodem, mnoho lidí to dělá, protože nejsou schopni změnit schéma. Sociální heuristika, jako je vhodná aplikace piva, někdy tuto cestu uhladí. Trocha práce s přesvědčováním lidí v databázi se později vyplatí několikanásobně. A jako další stranou, "full stack developer" často opomíjí jakékoli sofistikované použití databází.
Nebudu nikoho nutit číst Databázi do hloubky C.J. Date , ale správné schéma má velkou hodnotu. Po právu mám na mysli, že jeho použití vyžaduje nejmenší úsilí a složitost. Věci by měly být snadné a neměli byste je muset přeskupovat na úrovni aplikace.
Chcete spočítat, kolikrát byla vybrána každá odpověď. Počítání je něco, co databáze umí velmi dobře, tak to nechte dělat databázi.
Máte nějaké otázky. Otázky mají různé odpovědi. Průzkumy seskupují sady otázek. Lidé reagují na průzkumy tak, že své odpovědi spojují s otázkami.
Zde je jednoduchý návrh schématu (a nakonec se objeví nějaký databázový chlapík a řekne mi, že jsem to neudělal správně, ale to je v pořádku). Trik je v tom, že nic nemusí mít více sloupců, které se nepoužívají. Vše přichází v úhledném malém balíčku ("vztah" v "relační databázi"), který lze snadno propojit s ostatními věcmi prostřednictvím "cizích klíčů" (např. question_id pro mapování odpovědi na otázku). Odpovědi budou mít například více řádků pro stejné question_id
.
Pokud někdo chce přijít s efektními modelovacími nástroji a udělat obrázek, jděte do toho. Označuji to jako komunitní 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
Po správném zmapování a normalizaci (přečtěte si o normálních formách ), je velmi snadné získat požadovaná data pomocí SELECTů. Ideálem normalizace je jednoduše neopakovat informace nebo dovolit, aby se dostaly do nekonzistentního stavu. V těchto formách je mnoho věcí mnohem jednodušších.
A pokud si takové věci chcete procvičit, Průzkumník dat Stackoverflow je soubor skutečných dat normalizovaný podle toho, co jsem zde uvedl.
Nyní jednoduše spočítáte, kolikrát answer_id
zobrazí se pro konkrétní kombinaci průzkumu a otázky. Jednoduché použití GROUP BY
dělá veškerou práci za vás. Už nemusíte procházet řádky a dívat se na desítky nepoužívaných sloupců a snažit se přijít na to, jak je spočítat. Nejen to, ale tyto věci můžete vytvořit zobrazení
, což znamená, že dotaz napíšete jednou a databáze předstírá, že jeho výsledky jsou tabulkou. Poté můžete jednoduše dotazovat pohled (takže všechny JOIN
s a podobně jsou skryté), což je velmi jednoduché. Uložené procedury jsou také často přehlíženy.