Я работаю над веб-приложением для контрольного списка контроля качества. У меня уже есть настроенный стол, но я догадываюсь, что наша модель неоптимальна, и я мог бы получить лучшую производительность. Пожалуйста, не имейте в виду, что я использую mysql, поэтому я ограничен его возможностями.
Каждый контрольный список содержит десятки, а иногда и сотни вопросов. Каждый вопрос имеет от 2 до 10 возможных ответов. Каждый вопрос представляет собой строку varchar, как и каждый ответ. Заполненный контрольный список - это когда все вопросы связаны с одним из возможных ответов - когда выбран один ответ.
Контрольные списки различны для разных целей и со временем могут меняться. Поэтому, чтобы избежать непреднамеренного изменения заполненных контрольных списков, когда мы хотим вносить изменения в новые контрольные списки, у нас есть шаблоны. Шаблоны, вопросы и ответы являются зеркалом контрольных списков, вопросов и ответов и представляют «текущую версию» контрольного списка.
Итак, иерархия таблиц выглядит следующим образом
. Клиент
Поскольку мы не хотим, чтобы изменения в текущем шаблоне «возвращались в прошлое» и изменяли заполненные контрольные списки, данные копируются из шаблонов в контрольные списки, когда пользователь отправляется для запуска нового контрольного списка.
Как вы можете догадаться, это создает много дублирования. В ChecklistQuestionAnswers из примерно миллиона строк ответов имеется только 4000 отдельных ответов. Конечно, TemplatesQuestionAnswers также имеет дублирование, но не так плохо.
Так что я думаю, что я хочу сделать, это создать систему контроля версий для шаблонов контрольных списков, чтобы я мог сэкономить место, сохраняя уникальные вопросы с уникальными наборами ответов только один раз. Таким образом, вместо дублирования текста оптом, я могу просто связать контрольный список с версией шаблона, а затем установить контрольный список, какой ответ был выбран для какого вопроса.
Вот что я набросал до сих пор.
У клиентов есть много шаблонов.
шаблон имеет много ревизий, но только
одна текущая ревизия. Каждая ревизия
есть много вопросов, и каждый вопрос
имеет много (от 2 до 10) ответов.
Каждый контрольный список относится к одному
Шаблон. Каждый контрольный список имеет набор
ответы, которые указывают на ответ
выберите для каждого вопроса в его
версия шаблона.
Questions /* all unique question wordings */
Questions.id
Questions.question
Answers /* all unique answer wordings. */
Answers.id
Answers.answer
Templates
Templates.client_id /* relates to client table. */
Templates.template_name
Templates.current_version /* this is related to TemplateVersions.version_number */
TemplateVersions /* A logical grouping of a set of questions and answers */
TemplateVersions.version
TemplateVersions.template_id /* relates this version to a template. */
TemplateQuestions
TemplateQuestions.template_version /* relates a question to a template version */
TemplateQuestions.question_id /* relates a unique question to this template version */
TemplateQuestions.id
TemplateQuestionAnswers
TemplateQuestionAnswers.template_question_id /* relates this answer to a particular template version question */
TemplateQuestionAnswers.answer_id /* relates the unique question to a unique answer */
TemplateQuestionAnswers.id
Checklists
Checklists.id
Checklists.template_version /* relates this question to a template version -- associating this checklist to a client happens through this relationship */
ChecklistAnswers /* ( I might call this something other than 'Answers' since the lack of ChecklistQuestionAnswers breaks 'name symmetry' with TemplateQuestionAnswers ) */
ChecklistAnswers.checklist_id
ChecklistAnswers.question_id
ChecklistAnswers.answer_id
Проблема, от которой я зацикливаюсь, гарантирует, что ChecklistAnswers ассоциирует правильную пару вопросов и ответов - отношения, существующие в версии шаблона, на которую ссылается родительский объект Checklist.
Другими словами, каждая строка в ChecklistAnswers должна «зеркально отражать» вопрос_ид из TemplateQuestions на один дочерний вопрос из TemplateQuestionAnswers, формировать template_version в контрольных списках. Я пытаюсь придумать, как это сделать, и мой мыслительный процесс здесь замыкается. Это действительно «результат» базы данных - заполненный контрольный список - так что все остальные шаблоны и все остальное вроде эпифеноменального или абстракции этого. Если я не могу заставить это работать, я пропустил весь смысл!
Это кажется немного громоздким, поэтому мне интересно, если я делаю решение, сложность которого не стоит экономии места, которую я мог бы получить от его реализации.
Также обратите внимание, я немного упростил это. Существуют и другие аспекты сложности, такие как система категорий для группировки вопросов для составления отчетов, но я не думаю, что нам нужно вдаваться в это здесь.