Знам, че се борите с много неща едновременно, но най-добрият отговор решава проблема, който ikegami бързо премина на път да го направи в Perl:
Хората често правят много повече, отколкото им е необходимо на ниво приложение, защото никога не се научават да правят правилните неща в базата данни (като вашия друг въпрос на което се отговаря по-добре чрез подходяща SQL заявка вместо Perl). Но, като настрана, много хора правят това, защото не могат да променят схемата. Социалната евристика, като например подходящото приложение на бирата, понякога изглажда този път. Малко работа за убеждаване на хората в базата данни се изплаща многократно по-късно. И, като друга страна, „разработчикът на пълен стек“ често пропуска всякакво сложно използване на бази данни.
Няма да карам никого да чете База данни в дълбочина на C.J. Date , но има голяма полза от правилната схема. С право имам предвид, че налага най-малко усилия и сложност при използването му. Нещата трябва да са лесни и не трябва да пренареждате тези неща на ниво приложение.
Искате да преброите колко пъти е избран всеки отговор. Преброяването е нещо, което базите данни правят много добре, така че оставете базата данни да го направи.
Имате някои въпроси. Въпросите имат различни отговори. Проучванията обединяват набори от въпроси. Хората отговарят на анкети, като свързват отговорите си с въпросите.
Ето един прост дизайн на схема (и някой човек от базата данни в крайна сметка ще се появи и ще ми каже, че не съм го направил както трябва, но това е добре). Номерът е, че нищо не трябва да има няколко колони, които не се използват. Всичко идва в спретнат малък пакет („връзката“ в „релационна база данни“), който лесно се свързва с другите неща чрез „външни ключове“ (например question_id за картографиране на отговор на въпроса). Отговорите, например, ще имат няколко реда за един и същ question_id
.
Ако някой иска да влезе с изисканите инструменти за моделиране и да направи картината, направете го. Означавам това като уики на общността.
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
След като се начертаят и нормализират правилно (прочетете за нормални форми ), много е лесно да получите данните, които искате с SELECT. Идеалът за нормализиране е просто да не се повтаря информацията или да се позволи тя да изпадне в непоследователно състояние. В тези форми много неща стават много по-лесни за правене.
И ако искате да практикувате такива неща, Stackoverflow Data Explorer е набор от данни от реалния живот, нормализиран спрямо това, което съм представил тук.
Сега просто преброите колко пъти answer_id
се показва за определена комбинация от анкета и въпрос. Елегантно използване на GROUP BY
върши цялата работа вместо вас. Вече не е нужно да преглеждате редове, разглеждайки десетки неизползвани колони, опитвайки се да разберете как да ги преброите. Не само това, но можете да направите тези неща прегледи
, което означава, че пишете заявката веднъж и базата данни се преструва, че резултатите й са таблица. След това можете просто да направите заявка за изгледа (така че всички JOIN
s и по същия начин са скрити), което е много просто. Съхранените процедури също често се пренебрегват.