Qu'est-ce que les tables de base de données MySQL et les relations soutiendraient une enquête Questions et réponses à des questions conditionnelles? [fermé]

StackOverflow https://stackoverflow.com/questions/540885

Question

Je travaille sur un système d'enquête assez simple en ce moment. Le schéma de base de données va être simple:. Une table Survey, dans un à-plusieurs avec table Question, qui est un à-plusieurs avec la table Answer et avec la table PossibleAnswers

Récemment, le client a réalisé qu'elle veut la capacité de montrer certaines questions uniquement aux personnes qui ont donné une réponse particulière à une question précédente (par exemple. Est-ce que vous achetez des cigarettes? serait suivi par Quoi votre marque de cigarette préférée? , il n'y a pas de point de poser la deuxième question à un non-fumeur).

Maintenant, je commençais à me demander quelle serait la meilleure façon de mettre en œuvre cette condition des questions en termes de mon schéma de base de données? Si question A dispose de 2 réponses possibles: A et B, et question B ne doit apparaître à un utilisateur si la réponse était A

Edit: Ce que je suis à la recherche est un moyen de stocker les informations sur les exigences dans une base de données. Le traitement des données sera probablement fait sur le côté de l'application, que mes compétences SQL sucent;)

Était-ce utile?

La solution

  

Enquête sur la base de données de conception

Dernière mise à jour: 03/05/2015
Schéma et fichiers SQL maintenant disponible à https://github.com/durrantm/survey

entrer image description ici

Si vous utilisez cette (en haut) répondre ou tout autre élément, s'il vous plaît ajouter des commentaires sur les améliorations !!!

Ceci est un vrai classique, fait par des milliers. Ils semblent toujours « assez simple » pour commencer, mais pour être bon, il est en fait assez complexe. Pour ce faire, dans Rails j'utiliser le modèle indiqué sur le schéma ci-joint. Je suis sûr qu'il semble beaucoup trop compliqué pour certains, mais une fois que vous avez construit quelques-unes d'entre elles, au fil des ans, vous vous rendez compte que la plupart des décisions de conception sont des modèles très classiques, au mieux par une structure de données dynamique et souple à la départ.
Plus de détails ci-dessous:

  

Détails de la table pour les tables clés

réponses

réponses table est essentielle, car elle capture les réponses réelles par les utilisateurs. Vous remarquerez que les liens réponses à question_options , pas questions . Ceci est intentionnel.

input_types

input_types sont les types de questions. Chaque question ne peut être de 1 de type, par exemple tous les cadrans de radio, tous les champs de texte (s), etc. Utilisez des questions supplémentaires quand il y a (disons) 5 cadrans radio-et 1 case à cocher pour un « comprennent? » option ou une telle combinaison. Étiquettent les deux questions les utilisateurs considèrent comme un mais ont en interne deux questions, l'une pour les cadrans de radio, une pour la case à cocher. La case à cocher un groupe de 1 dans ce cas.

option_groups

option_groups et option_choices vous permettent de créer des groupes 'communs'. Un exemple, dans une application immobilière, il est peut-être la question « Quel âge est la propriété? ». Les réponses peuvent être souhaités dans les gammes: 1-5 6-10 10-25 25-100 100 +

Alors, par exemple, s'il y a une question sur l'âge de la propriété voisine, l'enquête voudra « réutilisation » les plages ci-dessus, de sorte que même option_group et les options se habituent.

units_of_measure

units_of_measure est que cela puisse paraître. Que ce soit pouces, des tasses, des pixels, des briques ou autre, vous pouvez définir une fois ici.

Pour votre information: Bien que de nature générique, on peut créer une application sur le dessus de cela, et ce schéma est bien adapté à la Ruby On Rails cadre des conventions telles que « id » pour le primaire clé pour chaque table. De plus, les relations sont toutes simples one_to_many de sans throughs many_to_many ou has_many nécessaires. Je serais probablement ajouter has_many: throughs et / ou: les délégués que pour obtenir des choses comme survey_name d'une réponse individuelle facilement without.multiple.chaining.

Autres conseils

Vous pouvez aussi penser à des règles complexes, et ont un champ de condition à base de chaîne dans votre table Questions, accepter / analyse l'un de ces:

  • A (1) = 3
  • ((A (1) = 3) et (A (2) = 4))
  • A (3)> 2
  • (A (3) = 1) et (A (17)! = 2) et C (1)

Où A (x) = y signifie "Réponse de la question x est y" et C (x) signifie que la condition de la question x (valeur par défaut est vrai) ...

Les questions ont un champ de commande, et vous iriez à travers eux un par un, sauter des questions où la condition est fausse.

Cela devrait permettre des enquêtes de toute la complexité que vous voulez, votre interface graphique pourrait créer automatiquement ces en mode « simple » et permettre et « mode avancé » où un utilisateur peut entrer dans les équations directement.

est une façon d'ajouter une table 'exigences question' avec des champs:

  • question_id (lien vers la question "quelle marque?")
  • required_question_id (lien vers la "Fumez-vous?" Question)
  • required_answer_id (lien vers la réponse "oui")

Dans l'application que vous cochez cette table avant de poser une certaine question. Avec une table séparée, il est facile d'ajouter des réponses nécessaires (en ajoutant une autre ligne pour le « parfois » répondre etc ...)

Personnellement, dans ce cas, j'utiliser la structure que vous avez décrit et utiliser la base de données en tant que mécanisme de stockage muet. Je suis fan de mettre ces contraintes complexes et DÉPENDANT dans la couche d'application.

Je pense que la seule façon de faire respecter ces contraintes sans construire de nouvelles tables pour chaque question avec les clés étrangères à d'autres, est d'utiliser la substance T-SQL ou d'autres mécanismes spécifiques des fournisseurs de construire triggers pour faire respecter ces contraintes.

Au niveau de l'application, vous avez donc beaucoup plus de possibilités et il est plus facile au port, donc je préférerais cette option.

J'espère que cela vous aidera à trouver une stratégie pour votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top