La meilleure façon de les stocker à sélection multiple réponses à l'enquête dans une base de données
Je suis actuellement en train de travailler sur une étude de la création/administration de l'application web avec PHP/MySQL. J'ai connu plusieurs révisions des tables de base de données, et encore une fois, je trouve que j'ai peut-être besoin de repenser le stockage d'un certain type de réponse.
Droit maintenant, j'ai une table qui ressemble à ceci:
survey_answers
id PK
eid
sesid
intvalue Nullable
charvalue Nullable
id = valeur unique attribué à chaque ligne
eid = la question de l'Enquête que cette réponse est en réponse à
sesid = Le sondage "session" (informations sur l'heure et la date de l'enquête de prendre) id
intvalue = la valeur de La réponse si c'est une valeur numérique
charvalue = la valeur de la réponse si elle est une représentation textuelle
Cela m'a permis de continuer à utiliser MySQL fonctions mathématiques pour accélérer le traitement.
J'ai cependant trouvé un nouveau défi: le stockage des questions qui ont des réponses multiples.
Un exemple serait:
Qui est-ce que vous aimez manger? (choisissez toutes les appliquer)
- Girl Scout Cookies
- Bacon
- Maïs
- De La Graisse De Baleine
Maintenant, quand je veux stocker le résultat, je ne suis pas sûr de la meilleure façon de le gérer.
Actuellement, j'ai une table juste pour les choix multiples qui ressemble à ceci:
survey_element_options
id PK
eid
value
id = valeur unique associé à chaque ligne
eid = question/élément que cette option est associée à
valeur = valeur textuelle de l'option
Avec cette configuration, puis je stocker mes retourné une sélection multiple de réponses dans "survey_answers' comme des chaînes de séparées par des virgules, l'identité de la element_options lignes qui ont été sélectionnés dans l'enquête. (c'est à dire quelque chose comme "4,6,7,9"), je me demandais si c'est en effet la meilleure solution, ou s'il serait plus pratique de créer une nouvelle table qui contiendrait chaque réponse choisie, puis un renvoi à une réponse de la ligne qui à son tour références de l'élément et, finalement, l'enquête.
MODIFIER
pour quiconque s'intéresse, ici, c'est l'approche que j'ai fini par prendre (Dans PhpMyAdmin Relations View):
Et rudimentaire de la requête de recueillir des chiffres pour une sélection multiple question devrait ressembler à ceci:
SELECT e.question AS question, eo.value AS value, COUNT(eo.value) AS count
FROM survey_elements e, survey_element_options eo, survey_answer_options ao
WHERE e.id = 19
AND eo.eid = e.id
AND ao.oid = eo.id
GROUP BY eo.value
Vous devez vous connecter pour publier un commentaire.
Cela dépend vraiment de beaucoup de choses.
Cela peut être un peu complexe comme un scénario possible, comme un exemple simple:
Exemple des tables:
Users
(Username
,UserID
)Questions
(qID
,QuestionsText
)Answers
(AnswerText
[dans ce cas, l'exemple pourrait être réutilisable, mais cela ne cause une couche supplémentaire de complexité ainsi],aID
)Question_Answers
([Disponible de réponses à cette question, plusieurs entrées par question]qaID
,qID
,aID
),UserQuestionAnswers
(qaID
,uID
)Remarque: les agissait là que d'un exemple, pas une recommandation
C'est un des chevaux pour les courses chose vraiment.
Vous pouvez stocker une chaîne séparée par des virgules (Mais alors, qu'advient-il lorsque vous avez un littéral virgule dans une de vos réponses).
Vous pouvez stocker un-à-beaucoup de table, tels que:
survey_element_answers
Puis une boucle sur la table. Si vous avez choisi une réponse, il serait de créer une ligne dans cette table. Si vous choisissez deux réponses, il va créer deux lignes dans cette table, etc. Ensuite, vous supprimez le intvalue et charvalue de la survey_answers table.
Un autre choix, puisque vous êtes déjà de stocker l'élément options dans leur propre table, est de créer un plusieurs-à-plusieurs de table, tels que:
survey_element_answers
De nouveau, une ligne par l'option sélectionnée.
Une autre option encore une fois, est de stocker une valeur de masque de bits. Cela permettra d'éliminer la nécessité pour un plusieurs-à-plusieurs table.
survey_element_options
optionnumber doit être unique pour chaque aïd, et l'incrément de départ avec un. Il y aura imposer une limite de 63 options si vous utilisez le type de données bigint, ou de 31 options si vous utilisez int.
Et puis dans votre survey_answers
Answerbitmask est calculé en additionnant tous les optionbitmask de l'ensemble, pour chaque option choisie par l'utilisateur. Par exemple, si 7 ont été stockés dans Answerbitmask, alors cela signifie que l'utilisateur a sélectionné les trois premières options.
Les jointures peuvent être effectués par:
OÙ survey_answers.answerbitmask & survey_element_options.optionbitmask > 0
Donc oui, il y a quelques options à considérer.
Convertir clé primaire pour ne pas l'index unique et ajouter des réponses pour une même question sous le même id.
Par exemple.
Vous pouvez toujours ajouter une autre colonne pour régulier unique PK si nécessaire.
Garder les choses simples. Pas besoin de relation ici.
Si vous n'utilisez pas l'id de clé étrangère dans une autre requête, ou si vous pouvez les résultats de la requête à l'aide de la sesid, essayez un nombre à une relation.
Sinon je serais stocker des réponses à choix multiple, comme un tableau sérialisé, comme JSON ou par le biais de php serialize() de la fonction.