Ich muss eine Umfrage erstellen, in der die Antworten in einer Datenbank gespeichert werden. Ich frage mich nur, wie dies am besten in der Datenbank implementiert werden kann, insbesondere in den erforderlichen Tabellen. Die Umfrage enthält verschiedene Arten von Fragen. Zum Beispiel: Textfelder für Kommentare, Multiple-Choice-Fragen und möglicherweise Fragen, die mehr als eine Antwort enthalten können (dh alle zutreffenden prüfen).
Ich habe zwei mögliche Lösungen gefunden:
Erstellen Sie eine riesige Tabelle, die die Antworten für jede Umfrage enthält. Jede Spalte würde einer Antwort aus der Umfrage entsprechen. dh SurveyID, Answer1, Answer2, Answer3
Ich denke nicht, dass dies der beste Weg ist, da diese Umfrage viele Fragen enthält und nicht sehr flexibel erscheint, wenn sich die Umfrage ändern soll.
Das andere, woran ich dachte, war das Erstellen einer Frage- und Antworttabelle. Die Fragentabelle würde alle Fragen für die Umfrage enthalten. Die Antworttabelle würde individuelle Antworten aus der Umfrage enthalten, wobei jede Zeile mit einer Frage verknüpft ist.
Ein einfaches Beispiel:
tblSurvey : SurveyID
tblQuestion : QuestionID, SurveyID , QuestionType, Question
tblAnswer : AnswerID, UserID , QuestionID , Answer
tblUser : UserID, UserName
Mein Problem dabei ist, dass es Unmengen von Antworten geben könnte, die die Antworttabelle ziemlich groß machen würden. Ich bin mir nicht sicher, ob das in Bezug auf die Leistung so großartig ist.
Ich würde mich über Ideen und Vorschläge freuen.
quelle
Antworten:
Ich denke, dass Ihr Modell Nr. 2 in Ordnung ist. Sie können sich jedoch das komplexere Modell ansehen, in dem Fragen und vorgefertigte Antworten (angebotene Antworten) gespeichert und in verschiedenen Umfragen wiederverwendet werden können.
- Eine Umfrage kann viele Fragen haben. Eine Frage kann in vielen Umfragen (wieder) verwendet werden.
- Für viele Fragen kann eine (vorgefertigte) Antwort angeboten werden. Eine Frage kann viele Antworten bieten. Eine Frage kann in verschiedenen Umfragen unterschiedliche Antworten haben. In verschiedenen Umfragen kann eine Antwort auf verschiedene Fragen angeboten werden. Es gibt eine Standardantwort "Andere". Wenn eine Person eine andere auswählt, wird ihre Antwort in Answer.OtherText aufgezeichnet.
- Eine Person kann an vielen Umfragen teilnehmen, eine Person kann bestimmte Fragen in einer Umfrage nur einmal beantworten.
quelle
Survey_Question_Answer
undAnswer
? Ist das nichtAnswer
genug?Answer
ist genug,Survery_question_answer
ist überflüssigMein Design ist unten gezeigt.
Das neueste Erstellungsskript finden Sie unter https://gist.github.com/durrantm/1e618164fd4acf91e372
Das Skript und die Datei mysql workbench.mwb sind auch unter https://github.com/durrantm/survey verfügbar
quelle
option_groups
undoption_choices
und was ist der Anwendungsfall.option_groups
sollten Sie genau das zulassen, wenn ich das richtig verstehe.Auf jeden Fall Option 2, auch ich denke, Sie haben möglicherweise ein Versehen im aktuellen Schema, Sie möchten möglicherweise eine andere Tabelle:
Jede Frage wird wahrscheinlich eine festgelegte Anzahl von Antworten haben, aus denen der Benutzer auswählen kann. Dann werden die tatsächlichen Antworten in einer anderen Tabelle verfolgt.
Datenbanken sind so konzipiert, dass sie viele Daten speichern, und die meisten lassen sich sehr gut skalieren. Es besteht keine wirkliche Notwendigkeit, ein weniger normales Formular zu verwenden, um Platz zu sparen.
quelle
In der Regel sollte das Ändern des Schemas basierend auf einer Änderung durch einen Benutzer (z. B. Hinzufügen einer Frage zu einer Umfrage) als ziemlich stinkend angesehen werden. Es gibt Fälle, in denen dies angemessen sein kann, insbesondere wenn Sie mit großen Datenmengen arbeiten, aber wissen, worauf Sie sich einlassen, bevor Sie eintauchen. Wenn Sie für jede Umfrage nur eine "Antwort" -Tabelle haben, ist das Hinzufügen oder Entfernen von Fragen möglicherweise sehr kostspielig und es ist sehr schwierig, Fragen auf frageunabhängige Weise durchzuführen.
Ich denke, Ihr zweiter Ansatz ist der beste, aber wenn Sie sicher sind, dass Sie viele Skalenprobleme haben werden, hat eine Sache, die in der Vergangenheit für mich funktioniert hat, ein hybrider Ansatz:
Dies ist absolut viel mehr Arbeit zu implementieren, daher würde ich dies wirklich nicht empfehlen, es sei denn, Sie wissen mit Sicherheit, dass diese Tabelle auf massive Bedenken stoßen wird.
quelle
Der zweite Ansatz ist am besten.
Wenn Sie es weiter normalisieren möchten, können Sie eine Tabelle für Fragetypen erstellen
Die einfachen Dinge zu tun sind:
Wir haben Protokolltabellen in der SQL Server-Tabelle mit 10 Millionen Zeilen.
quelle
Nr. 2 sieht gut aus.
Für eine Tabelle mit nur 4 Spalten sollte dies auch bei einigen Millionen Zeilen kein Problem sein. Dies kann natürlich davon abhängen, welche Datenbank Sie verwenden. Wenn es so etwas wie SQL Server ist, wäre es kein Problem.
Sie möchten wahrscheinlich einen Index für das Feld QuestionID in der Tabelle tblAnswer erstellen.
Natürlich müssen Sie angeben, welche Datenbank Sie verwenden, sowie die geschätzten Volumes.
quelle
Sieht für eine kleine Umfrage ziemlich vollständig aus. Vergessen Sie nicht, eine Tabelle für "offene Werte" hinzuzufügen, in der ein Kunde seine Meinung über ein Textfeld abgeben kann. Verknüpfen Sie diese Tabelle mit einem Fremdschlüssel mit Ihrer Antwort und platzieren Sie Indizes für alle Ihre relationalen Spalten, um die Leistung zu verbessern.
quelle
Nummer 2 ist richtig. Verwenden Sie das richtige Design, bis Sie ein Leistungsproblem feststellen. Die meisten RDBMS haben kein Problem mit einer schmalen, aber sehr langen Tabelle.
quelle
Eine große Antworttabelle an und für sich ist kein Problem. Solange die Indizes und Einschränkungen gut definiert sind, sollte es Ihnen gut gehen. Ihr zweites Schema sieht für mich gut aus.
quelle
Mit dem richtigen Index ist Ihre zweite Lösung normalisiert und für ein traditionelles relationales Datenbanksystem geeignet.
Ich weiß nicht, wie groß ist riesig, aber es sollte problemlos ein paar Millionen Antworten enthalten.
quelle
Sie können das gesamte Formular als JSON-Zeichenfolge speichern.
Sie sind sich Ihrer Anforderung nicht sicher, aber dieser Ansatz würde unter bestimmten Umständen funktionieren.
quelle