Die optimale Möglichkeit, um zu speichern Mehrfachauswahl-Umfrage-Antworten in einer Datenbank
Ich bin derzeit an einer Umfrage-Erstellung/Verwaltung web-Anwendung mit PHP/MySQL. Ich habe gegangen durch mehrere Revisionen der Datenbank-Tabellen, und ich wieder einmal feststellen, dass ich möglicherweise ein Umdenken bei der Lagerung eine bestimmte Art von Antwort.
Gerade jetzt, ich habe eine Tabelle, die wie folgt aussieht:
survey_answers
id PK
eid
sesid
intvalue Nullable
charvalue Nullable
id = eindeutiger Wert zugewiesen jede Zeile
eid = Umfrage-Frage, die diese Antwort ist in der Antwort zu
sesid = Die Umfrage 'Sitzung' (Informationen über die Zeit und das Datum einer Umfrage nehmen) id
intvalue = Der Wert, wenn die Antwort es ist ein numerischer Wert,
charvalue = der Wert der Antwort, wenn es eine textliche Darstellung
Dies erlaubte mir, weiterhin mit MySQL mathematische Funktionen, um die Bearbeitung zu beschleunigen.
Habe ich jedoch eine neue Herausforderung: die Speicherung von Fragen, die mehrere Antworten.
Ein Beispiel wäre:
Welche der folgenden tun, die Sie Essen zu genießen? (wählen Sie alle zutreffenden)
- Girl Scout Cookies
- Speck
- Mais
- Wal Fett
Nun, wenn ich möchte, speichern das Ergebnis, ich bin nicht sicher, der beste Weg, damit umzugehen.
Derzeit habe ich einen Tisch nur für multiple-choice-Optionen, die wie folgt aussieht:
survey_element_options
id PK
eid
value
id = eindeutiger Wert zugeordnet, wobei jede Zeile
eid = Frage/element, dass diese option im Zusammenhang mit
Wert = textueller Wert der option
Mit diesem setup habe ich dann meine zurückgegeben Auswahl mehrere Antworten in "survey_answers' als strings durch Komma getrennt die id ' s der element_options Zeilen, die ausgewählt wurden in der Umfrage. (also so etwas wie "4,6,7,9") Frage ich mich, ob das ist in der Tat die beste Lösung, oder wäre es praktischer, eine neue Tabelle zu erstellen, halten würde, jede gewählte Antwort, und dann der Rückbezug auf eine gegebene Antwort die Zeile, die wiederum verweist zurück auf das element und schließlich die Umfrage.
BEARBEITEN
für alle interessierten, hier ist der Ansatz, den ich landete dabei (In PhpMyAdmin Beziehungen-Ansicht):
Und eine rudimentäre Abfrage zu sammeln, das zählt für mehrfach-Auswahl-Frage würde so Aussehen:
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das hängt wirklich von vielen Dingen ab.
Kann das etwas komplexer als ein mögliches Szenario, wie ein einfaches Beispiel:
Beispiel Tabellen:
Users
(Username
,UserID
)Questions
(qID
,QuestionsText
)Answers
(AnswerText
[in diesem Fall beispielsweise könnte wiederverwendbar sein, aber diese verursacht eine zusätzliche Schicht von Komplexität],aID
)Question_Answers
([Möglichen Antworten auf diese Frage, die mehrere Einträge pro Frage]qaID
,qID
,aID
),UserQuestionAnswers
(qaID
,uID
)Hinweis: als Beispiele Gedacht, nicht als Empfehlung
Es ist Pferde für Kurse, die Sache wirklich.
Können Sie speichern wie ein Komma getrennter string ist (Aber was dann passiert, wenn Sie ein literal Komma in einer Ihrer Antworten).
Können Sie speichern als eine eins-zu-viele-Tabelle, wie:
survey_element_answers
Einer Schleife über die Tabelle. Wenn Sie wählte eine Antwort, es würde eine Zeile in dieser Tabelle. Wenn Sie wählen Sie zwei Antworten, es werden zwei Zeilen in dieser Tabelle, etc. Dann würden Sie entfernen Sie die intvalue und charvalue aus der survey_answers Tabelle.
Andere Wahl, da Sie bereits die Speicherung der element-Optionen in Ihrer eigenen Tabelle, ist das erstellen einer viele-zu-viele-Tabelle, wie:
survey_element_answers
Wieder, eine Zeile pro option ausgewählt.
Anderen option aber wieder wird zum speichern einer Bitmaske Wert. Dies entfernt die Notwendigkeit für eine viele-zu-viele-Tabelle.
survey_element_options
optionnumber sollte eindeutig sein für jeden eid, und die Schrittweite beginnend mit einem. Es wird verhängen eine Obergrenze von 63 Optionen wenn Sie mit bigint-oder 31-Optionen, wenn Sie mit int.
Und dann in Ihre survey_answers
Answerbitmask wird berechnet, indem alle optionbitmask zusammen, für jede option, die der Benutzer ausgewählt hat. Zum Beispiel, wenn 7 gespeichert wurden, in Answerbitmask, dann bedeutet das, dass der Benutzer ausgewählt hat, die ersten drei Optionen.
Verknüpfungen können erfolgen durch:
WO survey_answers.answerbitmask & survey_element_options.optionbitmask > 0
Also ja, es gibt ein paar Optionen zu prüfen.
Konvertieren primären Schlüssel nicht unique-index und fügen Sie Antworten auf die gleiche Frage unter der gleichen id.
Zum Beispiel.
Können Sie noch eine weitere Spalte hinzufügen, die für regelmäßige einzigartige PK, wenn nötig.
Dinge einfach halten. Keine Notwendigkeit für die relation hier.
Wenn Sie nicht die id als Fremdschlüssel in einer anderen Abfrage, oder wenn Sie können die Abfrage-Ergebnisse mit dem sesid, versuchen viele zu-eins-Beziehung.
Ansonsten würd ich store multiple-choice-Antworten als serialisiertes array, wie JSON oder durch php serialize () - Funktion.