149 Stimmen

Datenbankentwurf für eine Umfrage

Ich muss eine Umfrage erstellen, deren Antworten in einer Datenbank gespeichert werden. Ich frage mich nur, wie ich dies am besten in der Datenbank implementieren kann, insbesondere die 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 (z. B. alles ankreuzen, was zutrifft).

Ich habe mir zwei mögliche Lösungen einfallen lassen:

  1. Erstellen Sie eine riesige Tabelle, die Folgendes enthält die Antworten für jede Umfrage Eingabe enthält. Jede Spalte würde entspricht einer Antwort aus der Umfrage entsprechen, z. B. SurveyID, Answer1, Antwort2, Antwort3

    Ich glaube nicht, dass dies der beste Weg ist. da es eine Menge Fragen gibt in dieser Umfrage und scheint nicht sehr flexibel, wenn sich die Umfrage ändern soll.

  2. Die andere Sache, an die ich dachte, war eine Tabelle mit Fragen und Antworten Tabelle. Die Fragetabelle würde enthält alle Fragen für die Umfrage enthalten. Die Antworttabelle enthält einzelne Antworten aus der Umfrage, wobei jede Zeile mit einer Frage verknüpft ist.

    Ein einfaches Beispiel:

    tblSurvey : UmfrageID

    tblFrage : QuestionID, UmfrageID , QuestionType, Frage

    tblAntwort : AntwortID, Benutzer-ID , FrageID , Antwort

    tblBenutzer : BenutzerID, Benutzernamen

    Mein Problem dabei ist, dass es Tonnen von Antworten geben könnte, was die die Antworttabelle ziemlich groß wird. Ich bin nicht sicher, ob das so toll ist, wenn es die Leistung angeht.

Ich würde mich über jede Idee und jeden Vorschlag freuen.

0 Stimmen

Wie viel ist "ziemlich viel"? Geben Sie uns eine Schätzung, sprechen wir von einer Million oder von tausend Millionen?

1 Stimmen

SQL-Server sind eigentlich für die Arbeit mit "Tonnen" von Daten konzipiert. Sie sollten keine großen Probleme haben, mit dem von Ihnen erwähnten Schema zu arbeiten.

141voto

Damir Sudarevic Punkte 21527

Ich denke, dass Ihr Modell Nr. 2 in Ordnung ist. Sie können sich jedoch auch das komplexere Modell ansehen, bei dem Fragen und vorgefertigte Antworten (angebotene Antworten) gespeichert und in verschiedenen Umfragen wiederverwendet werden können.

- Eine Umfrage kann viele Fragen enthalten; eine Frage kann in vielen Umfragen (wieder)verwendet werden.
- Eine (vorgefertigte) Antwort kann auf viele Fragen gegeben werden. Auf eine Frage können mehrere Antworten angeboten werden. Zu einer Frage können in verschiedenen Umfragen unterschiedliche Antworten angeboten werden. Eine Antwort kann für verschiedene Fragen in verschiedenen Umfragen angeboten werden. Es gibt eine Standardantwort "Andere"; wenn eine Person "Andere" wählt, wird ihre Antwort in Answer.OtherText gespeichert.
- Eine Person kann an vielen Umfragen teilnehmen, eine Person kann eine bestimmte Frage in einer Umfrage nur einmal beantworten.

survey_model_02

1 Stimmen

Welches Tool haben Sie für die Erstellung des Datenbankschemas verwendet?

0 Stimmen

Ich verwende Altova UModel. Es ist schnell, bietet eine große Auswahl an Modellierungsstrukturen und speichert in so ziemlich jedem Format. Allerdings kostet es auch.

11 Stimmen

Sie können auch Folgendes verwenden zeichnen.io Es ist kostenlos, ohne Anmeldung und einfach zu benutzen.

82voto

Michael Durrant Punkte 88734

Mein Entwurf ist unten abgebildet.

Das neueste Erstellungsskript finden Sie unter https://gist.github.com/durrantm/1e618164fd4acf91e372

Das Skript und die Datei mysql workbench.mwb sind auch verfügbar unter
https://github.com/durrantm/survey enter image description here

1 Stimmen

Hallo, mir gefällt Ihr Entwurf. Bitte haben Sie irgendwelche Datenbeispiele (Dumps) für die Tabellen? Wird wirklich zu schätzen wissen

0 Stimmen

Hallo! Zunächst einmal vielen Dank für Ihre Arbeit, das ist großartig! Hast du vielleicht Hierachien in einer deiner Vorlagen berücksichtigt? Die Benutzer geben normalerweise Informationen über ihre Vorgesetzten und diese Vorgesetzten haben Informationen über ihre Vorgesetzten und so weiter. Und die Benutzer arbeiten in verschiedenen Abteilungen (HR, Produktion) und diese können auch eine Hierarchie haben. Bei der Berichterstattung ist es daher oft notwendig, zwischen diesen Organisationsebenen zu unterscheiden.

0 Stimmen

@michael: Das ist wirklich hilfreich. haben Sie irgendwelche Referenzen/Github Links für Java mit Frühling?

22voto

tplaner Punkte 8205

Definitiv Option #2, auch ich denke, dass Sie möglicherweise ein Versehen in der aktuellen Schema haben, möchten Sie möglicherweise eine andere Tabelle:

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

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

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

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

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

Für jede Frage wird es wahrscheinlich eine bestimmte Anzahl von Antworten geben, aus denen der Benutzer auswählen kann, und die tatsächlichen Antworten werden dann in einer anderen Tabelle erfasst.

Datenbanken sind für die Speicherung großer Datenmengen ausgelegt, und die meisten sind sehr gut skalierbar. Es besteht keine wirkliche Notwendigkeit, eine geringere normale Form einfach um Platz zu sparen.

0 Stimmen

Hallo, ich habe eine Frage. Sollte die SurveyId nicht auch in der Antworttabelle vorhanden sein oder zumindest ein Zeitstempel, der mit dem Versionszeitpunkt der Umfrage übereinstimmt? Wenn Sie eine Frage in Ihre ursprüngliche Umfrage einfügen, würden sich die questionIds ändern, und die Antworten wären nicht mehr identifizierbar. Oder wenn es redundant ist, könnten Sie erklären, wie?

3voto

Ryan Brunner Punkte 14463

Generell gilt, dass die Änderung eines Schemas auf der Grundlage von Änderungen, die ein Benutzer vornehmen kann (z. B. das Hinzufügen einer Frage zu einer Umfrage), als ziemlich schmutzig angesehen werden sollte. Es gibt Fälle, in denen dies sinnvoll sein kann, vor allem bei großen Datenmengen, aber Sie sollten wissen, worauf Sie sich einlassen, bevor Sie sich darauf einlassen. Wenn Sie nur eine Tabelle "Antworten" für jede Umfrage haben, bedeutet das, dass das Hinzufügen oder Entfernen von Fragen potenziell sehr kostspielig ist, und es ist sehr schwierig, Analysen auf eine fragestellungsunabhängige Weise durchzuführen.

Ich denke, dass Ihr zweiter Ansatz am besten ist, aber wenn Sie sicher sind, dass Sie viele Probleme mit der Größe haben werden, hat sich für mich in der Vergangenheit ein hybrider Ansatz bewährt:

  1. Erstellen Sie detaillierte Antworttabellen, um die Antworten auf die einzelnen Fragen zu speichern, wie in Punkt 2 beschrieben. Diese Daten werden in der Regel nicht direkt aus Ihrer Anwendung abgefragt, sondern dienen der Erstellung von Zusammenfassungen für Berichtstabellen. Wahrscheinlich möchten Sie auch eine Form der Archivierung oder Löschung für diese Daten implementieren.
  2. Erstellen Sie gegebenenfalls auch die Antworttabelle aus 1. Diese kann immer dann verwendet werden, wenn die Benutzer eine einfache Tabelle mit den Ergebnissen sehen möchten.
  3. Für alle Analysen, die zu Berichtszwecken durchgeführt werden müssen, planen Sie Aufträge zur Erstellung zusätzlicher Zusammenfassungsdaten auf der Grundlage der Daten aus 1.

Dies ist absolut viel mehr Arbeit zu implementieren, so würde ich wirklich nicht raten, dies, es sei denn, Sie wissen sicher, dass diese Tabelle wird in massive Skala Probleme laufen.

1voto

kevchadders Punkte 8225

Nr. 2 sieht gut aus.

Bei einer Tabelle mit nur 4 Spalten sollte das kein Problem sein, auch nicht bei mehreren Millionen Zeilen. Natürlich kann dies davon abhängen, welche Datenbank Sie verwenden. Wenn es sich um eine Datenbank wie SQL Server handelt, dürfte es kein Problem sein.

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, und auch die geschätzten Mengen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X