Datenbankdesign für eine Umfrage [geschlossen]


129

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:

  1. 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.

  2. 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.


Wie viel ist "ziemlich groß"? Geben Sie uns eine Schätzung, sprechen wir über eine Million oder tausend Millionen?
Jorge Córdoba

1
SQL Server sind eigentlich so konzipiert, dass sie mit Tonnen von Daten arbeiten. Sie sollten keine großen Probleme haben, mit dem Schema zu arbeiten, über das Sie gesprochen haben.
Chris

Antworten:


122

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.

Umfrage_Modell_02


1
Mit welchem ​​Tool haben Sie das Datenbankschema erstellt?
AndHeiberg

Ich benutze Altova UModel. Es ist schnell, bietet eine große Auswahl an Modellierungsstrukturen und speichert in nahezu jedem Format. Es kostet jedoch.
Obimod

9
Sie können auch draw.io verwenden. Es ist kostenlos ohne Anmeldung und einfach zu bedienen.
usr4896260

3
Warum haben wir Survey_Question_Answerund Answer? Ist das nicht Answergenug?
Abubakar Ahmad

1
Ich denke Answerist genug, Survery_question_answerist überflüssig
Batman

62

Mein 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
Geben Sie hier die Bildbeschreibung ein


Hallo, ich mag dein Design. Bitte haben Sie ein Datenmuster (Dumps) für die Tabellen? Wird es wirklich zu schätzen wissen
Emeka Mbah

Hallo! Zuerst danke für deine Arbeit, das ist großartig! Haben Sie vielleicht Hierarchien in einer Ihrer Vorlagen berücksichtigt? Benutzer geben normalerweise Informationen über ihren Anführer und diese Anführer haben Informationen über ihre Anführer und so weiter. Und die Benutzer arbeiten in verschiedenen Bereichen (HR, Produktion) und diese können auch eine Hierarchie haben. Während der Berichterstellung ist es daher häufig erforderlich, zwischen diesen Organisationsebenen zu unterscheiden.
Ruedi

@ Michael: Das ist wirklich hilfreich. Haben Sie Referenzen / Github-Links für Java mit Spring?
Sagar Panda

Ich versuche immer noch herauszufinden, was der Unterschied zwischen option_groupsund option_choicesund was ist der Anwendungsfall.
PHPnoob

@PHPnoob dies denke ich, wie der Name schon sagt, nur Gruppen - Optionen. Wenn Sie also zB zwischen 1 und 5 bewerten können, option_groupssollten Sie genau das zulassen, wenn ich das richtig verstehe.
Anzeigename

18

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:

+-----------+
| tblSurvey |
|-----------|
| SurveyId  |
+-----------+

+--------------+
| tblQuestion  |
|--------------|
| QuestionID   |
| SurveyID     |
| QuestionType |
| Question     |
+--------------+

+--------------+
| tblAnswer    |
|--------------|
| AnswerID     |
| QuestionID   |
| Answer       |
+--------------+

+------------------+
| tblUsersAnswer   |
|------------------|
| UserAnswerID     |
| AnswerID         |
| UserID           |
| Response         |
+------------------+

+-----------+
| tblUser   |
|-----------|
| UserID    |
| UserName  |
+-----------+

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.


Hallo, ich habe eine Frage. Sollte SurveyId nicht auch in der Antworttabelle vorhanden sein oder mindestens einen Zeitstempel haben, der mit der Versionszeit der Umfrage übereinstimmt? Wenn Sie eine Frage in Ihre ursprüngliche Umfrage einfügen, ändern sich die Frage-IDs und die Antworten werden nicht mehr identifizierbar. Oder wenn es überflüssig ist, können Sie erklären, wie?
Shubham

3

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:

  1. Erstellen Sie detaillierte Antworttabellen, um die Antworten pro Frage zu speichern, wie Sie in Abschnitt 2 beschrieben haben. Diese Daten werden im Allgemeinen nicht direkt von Ihrer Anwendung abgefragt, sondern zum Generieren von Zusammenfassungsdaten für Berichtstabellen verwendet. Sie möchten wahrscheinlich auch eine Form der Archivierung oder Löschung für diese Daten implementieren.
  2. Erstellen Sie bei Bedarf auch die Antworttabelle aus 1. Dies kann immer dann verwendet werden, wenn Benutzer eine einfache Tabelle mit Ergebnissen anzeigen möchten.
  3. Planen Sie für alle Analysen, die für Berichtszwecke durchgeführt werden müssen, Jobs, um zusätzliche Zusammenfassungsdaten basierend auf den Daten von 1 zu erstellen.

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.


1

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:

  • Platzieren Sie die Datenbank und melden Sie sich auf ihrer eigenen Festplatte an, nicht standardmäßig auf C
  • Erstellen Sie die Datenbank so groß wie nötig, damit Sie keine Pausen haben, während die Datenbank wächst

Wir haben Protokolltabellen in der SQL Server-Tabelle mit 10 Millionen Zeilen.


1

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.


0

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.


1
Gibt es einen Grund, warum ich die Kommentare nicht auch in die Antworttabelle aufnehmen konnte?
Michael

0

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.


0

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.


0

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.