2010-04-09 4 views
0

Je travaille sur une application Web pour une liste de contrôle du contrôle qualité. J'ai déjà installé une table, mais j'ai l'intuition que notre modèle est sous-optimal et que je pourrais obtenir de meilleures performances. S'il vous plaît ne pas que j'utilise mysql, donc je suis limité à ses capacités.Jeux d'ensembles? Ou, implémentation de la gestion des versions pour les ensembles d'ensembles

Chaque liste de vérification comporte des dizaines, parfois des centaines de questions. Chaque question a entre 2 et 10 réponses possibles. Chaque question est une chaîne de caractères varchar, et chaque réponse aussi. Une liste de contrôle complète est lorsque toutes les questions sont associées à l'une de ses réponses possibles - lorsqu'une réponse est choisie.

Les listes de contrôle sont différentes à différentes fins et peuvent changer au fil du temps. Donc, pour garder les listes de contrôle remplies par inadvertance lorsque nous voulons avoir des changements dans les nouvelles listes de vérification, nous avons des modèles. Les modèles, les questions et les réponses sont un miroir des listes de vérification, des questions et des réponses et représentent la «version actuelle» de la liste de contrôle.

Ainsi, la hiérarchie de la table se présente comme suit

. clients

  • Modèles
    • TemplateQuestions
      • TemplateQuestionAnswers
  • listes de vérification
    • ChecklistQuestions
      • ChecklistQuestionAnswers

Parce que nous ne voulons pas de changements dans le modèle actuel de « remonter le temps » et modifier des listes de contrôle terminé, les données sont copiées à partir des modèles en listes de vérification lorsque un utilisateur va commencer une nouvelle liste de contrôle.

Comme vous pouvez le deviner, cela crée beaucoup de duplication. Dans ChecklistQuestionAnswers, sur environ un million de lignes de réponses, il n'y a que 4 000 réponses distinctes. Bien sûr, TemplatesQuestionAnswers a aussi une duplication, mais pas aussi mauvaise. Donc, ce que je pense que je veux faire est de créer un système de gestion des versions pour les modèles de liste de contrôle, afin que je puisse économiser de l'espace en stockant des questions uniques avec des ensembles de réponses uniques une seule fois. De cette façon, au lieu de dupliquer du texte en gros, je peux simplement lier une liste de contrôle à une version d'un modèle, puis une liste de contrôle est la réponse qui a été choisie pour quelle question.

Voici ce que j'ai esquissé jusqu'à maintenant.

Un client possède de nombreux modèles. Un modèle a de nombreuses révisions, mais seulement une révision en cours. Chaque révision a beaucoup de questions, et chaque question a beaucoup (entre 2 et 10) réponses. Chaque liste de contrôle se rapporte à un modèle .Chaque liste de contrôle a un réponses qui indiquent la réponse sélectionnez pour chaque question dans sa version du modèle.

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 

Le hic, j'enferrons sur est la garantie que ChecklistAnswers associe une bonne paire de questions-réponse - la relation qui existe dans la version du modèle qu'il est parent Liste de contrôle fait référence. En d'autres termes, chaque ligne dans ChecklistAnswers doit «mettre en miroir» un question_id de TemplateQuestions à une question enfant de TemplateQuestionAnswers, former la version template_version dans Checklists. J'essaie de penser à la façon de faire cela et à mon processus de réflexion court-circuit ici. C'est vraiment le «livrable» de la base de données - une liste de contrôle complète - de sorte que tous les autres modèles et tout est une sorte d'épiphénomène ou une abstraction de cela. Si je n'arrive pas à faire fonctionner ça, j'ai raté le point entier! C'est un peu compliqué, donc je me demande si je fais une solution dont la complexité ne vaut pas l'économie d'espace que je pourrais obtenir en l'implémentant.

Notez également, j'ai simplifié un peu. Il y a d'autres dimensions de la complexité, comme un système de catégories pour regrouper des questions pour la production de rapports, mais je ne pense pas que nous ayons besoin d'en parler ici.

Répondre

1

Pour autant que je comprends:

Une simple amélioration dans ce que vous faites peut-être utiliser 3 tables pour les modèles et seulement 2 tables pour les listes de contrôle réelles: Liste de contrôle (clé étrangère à une version d'un modèle utilisé) réponse (clé étrangère à check-list, clé étrangère à templateAnswer)

donc, si vous voulez récupérer une liste de réponses pour une liste de contrôle particlar vous devez:

select <whatever columns you like> 
from checklist c, answer a, templateAnswer ta, templateQuestion tq 
where a.checklist_id = c.id AND a.ta_id = ta.id AND ta.tq_id = tq.id AND 
c.id = <something> 

ps. Si les questions partagent des réponses, et qu'elles le font probablement dans plusieurs cas ("oui", "non"), vous pouvez avoir une table pour les réponses uniques: templateAnswers et une table templateAnswerUsage (clé étrangère pour la réponse du template et la clé étrangère pour templateQuestion). De cette façon, vous n'avez pas de duplication du texte de réponse. Il s'agit essentiellement de nombreuses relations entre les questions et les réponses. Cela peut ne pas être logique si la taille moyenne des réponses est supérieure à la taille des ID que vous utiliserez.

+0

Dans mon croquis, je n'ai que deux tableaux pour les listes de vérification - Listes de contrôle et liste de vérification - n'ai-je pas précisé cela? (Je sais que c'est embarrassant :) Je ne pense pas que les requêtes seront le problème, mais obtenir des valeurs avec des relations significatives et correctes * dans * le tableau ChecklistAnswers est ce que je ne peux pas comprendre. Et les questions partagent des réponses - donc le tableau Réponses de la proposition. – user151841

+0

Désolé, j'ai manqué une partie de votre solution d'esquisse. Je pense que votre problème est que dans ChecklistAnswers vous avez une clé étrangère à la table de réponses (ou n'est-ce pas vrai?), Où vous devriez avoir une clé étrangère à la table TemplateQuestionAnswers. TemplateQuestionAnswers lie déjà les réponses possibles à des questions, donc si vous le référencez, vous conserverez la liaison. –

+0

Je pense que vous êtes sur quelque chose, mais mon cerveau court-circuite à nouveau ...: P – user151841

Questions connexes