Manière efficace de stocker un questionnaire dynamic?

En reference à cette question, je fais presque face au même scénario sauf que dans mon cas, les questions sont probablement statiques (elles peuvent changer de time en time, et je pense que ce n'est pas une bonne idée d'append des colonnes pour chaque question, j'ai même décidé d'append, comment les réponses devraient être spécifiées / extraites de), mais les réponses sont de différents types, par exemple la réponse pourrait être oui / non, list-items, text libre, list-items OU text libre (Autre , Veuillez préciser) , des éléments à list multiple, etc.

Quel serait un moyen efficace de mettre en œuvre cela?

Shimmy, j'ai écrit un article en quatre parties qui aborde ce problème – voir Création d'une interface user Dynamic Drive-Data . L'article se penche sur la façon de laisser un user définir quelles sont datatables à stocker sur les clients, donc ce n'est pas un examen exact de votre question, mais c'est assez proche. A savoir, mon article montre comment laisser un user final définir le type de données à stocker, ce qui est dans le sens de ce que vous voulez.

Le diagramme ER suivant donne l'essentiel du model de données:

Modèle de données

Ici, DynamicAtsortingbutesForClients est la table qui indique les attributes créés par l'user qu'un user souhaite suivre pour ses clients. En bref, chaque atsortingbut a une valeur DataTypeId , qui indique s'il s'agit d'un atsortingbut Boolean, d'un atsortingbut Text, d'un atsortingbut Numeric, etc. Dans votre cas, cette table stocke les questions de l'enquête.

La table DynamicValuesForClients contient les valeurs stockées pour un client particulier pour un atsortingbut particulier. Dans votre cas, cette table stocke les réponses aux questions de l'enquête. La valeur réelle est stockée dans la colonne DynamicValue , de type sql_variant , permettant d'y sql_variant tout type de données – numérique, bit, string, etc.

Mon article ne traite pas de la façon de gérer les questions à choix multiples, où un user peut sélectionner une option parmi une list prédéfinie d'options, mais améliorer le model de données pour permettre cela est assez simple. Vous devez créer une nouvelle table nommée DynamicListOptions avec les colonnes suivantes:

  • DynamicListOptionId – une key primaire
  • DynamicAtsortingbuteId – spécifie l'atsortingbut auquel ces questions sont associées
  • OptionText – le text d'option

Donc, si vous aviez un atsortingbut qui était une option à choix multiple, vous remplissiez la list déroulante de l'interface user avec les options renvoyées par la requête:

 SELECT OptionText FROM DynamicListOptions WHERE DynamicAtsortingbuteId = ... 

Enfin, vous stockez la valeur DynamicListOptionId sélectionnée dans la colonne DynamicValuesForClients.DynamicValue pour save l'option de list qu'ils ont sélectionnée (ou utilisez NULL s'ils n'ont pas choisi un élément).

Donner l'article à lire. Vous pouvez download une démo complète et fonctionnelle qui inclut la database complète et son model. En outre, les quatre articles qui composent la série explorent le model de données en profondeur et montrent comment créer une interface user Web (ASP.NET) pour permettre aux users de définir des attributes dynamics, de les afficher pour la saisie de données, etc. .

Bonne programmation!

Enquête ERD

Cela peut ne pas vous convenir exactement, mais voici ce que j'ai à mon travail à time partiel.

J'ai une table de questions, une table de réponses, et une table d'enquête. Pour chaque nouvelle enquête, je crée une enquête (car chaque enquête est unique, mais les questions et les réponses sont souvent répétées). J'ai ensuite une table des répondants qui contient de l'information sur le répondant (et qui renvoie aussi à la table d'enquête, que j'ai oubliée dans le diagramme). J'ai aussi un tableau de réponse qui relie le répondant et le sondage. Ce n'est probablement pas le meilleur moyen mais c'est la façon dont cela fonctionne pour moi, et cela fonctionne assez vite (nous sums à environ 1million + dans la table de réponse et il se comporte comme un rêve).

Avec ce model, j'obtiens des questions réutilisables, des réponses réutilisables (beaucoup de nos questions utilisent «Oui» et «Non»), et un tableau de réponse plutôt mince.