Laden...

Wie designe ich die Datenbank für ein Quiz mit drei verschiedenen Fragearten?

Erstellt von mapi vor 8 Jahren Letzter Beitrag vor 8 Jahren 5.352 Views
M
mapi Themenstarter:in
10 Beiträge seit 2016
vor 8 Jahren
Wie designe ich die Datenbank für ein Quiz mit drei verschiedenen Fragearten?

verwendetes Datenbanksystem: <Microsoft Access>

Hallo liebe Leute 😄,

ich hab eine (warscheinlich) einfach Frage zu euch, aber ich sitze seit 1,5Std vor meinem Blatt und weiss einfach nicht wie ich das Designen soll. ( Bin sehr neu in der Programmierung)

Ich habe ein Quiz... Und es gibt 3 verschiedene Arten von Quizfragen:

  • (1)Normal: Frage -> Antwort eingeben
  • (2)Multiple Choice -> aus 4 Antwortmöglichkeiten eine auswählen
  • (3)Bild -> Frage, Bild gezeigt (z.B. Was ist das? -> Antwort eingeben

Jetzt versuche ich die ganze Zeit auf Blatt aufzuzeichnen wie ich das denn mit den verschiedenen Tabellen und den Relationen (PKs u FKs) lösen könnte:
Wieviele Tabellen brauche ich? Und wie sind die verknüpft?
Soweit war ich bisher:

Frage
*PK Frage _ID
-FrageText
-Frageart (??Vielleicht ein int; 1 für normal, 2 für MultipleChoice, 3 für Bild??)

Fragentyp_Normal
-AntwortText

Fragentyp_MultipleChoice
-AntwortText1
-AntwortText2
-AntwortText3
-AntwortText4

Fragentyp_Bild
-Bild
-AntwortText

EDIT:
hier ein Bild wie ich das mein: ANHANG

DANKE 👍

5.299 Beiträge seit 2008
vor 8 Jahren

Das mit Antwort eingeben wird kaum funktionieren.

Die natürliche Sprache hält immer hunderte von Formulierungs-Möglichkeiten bereit, dieselbe Frage richtig zu beantworten.

Es sei denn, die Frage fragt nach einem einzigen Wort, und das muss richtig geschrieben sein.

Der frühe Apfel fängt den Wurm.

M
mapi Themenstarter:in
10 Beiträge seit 2016
vor 8 Jahren

Ja das wäre ja der Plan! Fragen z.B.

  • Was ist die Hauptstadt von XY?
  • Wer war Torschützenkönig bei der WM XY?

Die dort eingefügten Fragen lassen nur 1 Antwort zu!

B
1 Beiträge seit 2015
vor 8 Jahren

Dann musst du natürlichen schauen ob du auf Groß & Kleinschreibung achtest oder um bei deinem Beispiel zu bleiben, der Torschützenkönig der WM, mit Vor&Nachname oder reicht der Nachname.

5.299 Beiträge seit 2008
vor 8 Jahren

ok, dann kannste halt 3 verschiedene Tabellen für die 3 verschiedenen Arten Frage anlegen.
Eine Relation zwischen denen besteht nicht, sondern es muss noch die Tabellen Quiz und QuizFrage geben, die allen 4 anderen Tabellen untergeordnet ist.
Ein QuizFrage-Datensatz hat also Verweise auf das Quiz und auch auf alle 3 Fragen.
Nur durch Businesslogik kannst du dafür sorgen, dass 2 dieser Verweise immer genullt sind.

Ich würd dir übrigens sehr empfehlen, die Datenbank wegzulassen.
Das wird alles noch höchst kompliziert, und das Datenmodell wird sich noch zig-mal ändern.
Da ist das immer nur ein fürchterlicher Klotz am Bein, wenn du die ganze Entwicklungszeit diese unhandliche DB-Kommunikation mit rumschleppst.

Ich weiß, das glaubt mir niemand, dass man Daten viel einfacher mit Dataset.WriteXml(filePath) auf Platte beamt, als mit DataAdaptern, EntityFramework oder gar mit DbCommands, Connections, Readern und und und.

Ah - ein Argument bringe ich noch:
Die Oberfläche databinding-getrieben zu entwickeln - das ist der Hauptpunkt, und die eigentliche Aufgabe einer Datenverarbeitung.
Databinding erfordert zwingend ein typisiertes Datenmodell.
Das heisst, so oder so muss das Datenmodell - was ja eigentlich nur ein Konzept ist, in Code umgesetzt sein - so oder so.
Wenn du nun dir eine Datenbank ans Bein bindest, dann musst du dasselbe Datenmodell ein zweites mal umsetzen - diesmal nicht in c#-Code, sondern nun in Form von letztlich Sql-Code.
Damit hast du dasselbe DM zwiemal auf grundverschiedene, und vollkommen inkompatible Weisen umgesetzt, und dennoch müssen beide Umsetzungen einander zu 100% entsprechen.
Und dann hast du das Vergnügen, eine Vermittlungs-schicht zwischen die beiden Modell konstruieren zu dürfen, damit Daten von einem Datenmodell ins annere fließen können.
Und jede Veränderung wirft das ganze Konstrukt über den Haufen, und jede kleine Abweichung der Modelle untereinander führt zum Crash, aber in der Vermittlungs-Schicht kann eiglich ebensoviel schieflaufen.

Alles unnötig.
Denn du kannst mit Dataset.Read-/Write-Xml ein Dataset-Datenmodell auf Platte schreiben und laden - eine Codezeile, nur ein Datenmodell, keine Vermittlerschicht.
Es ist wirklich einfacher.

Gut Pladoyer-Ende.
Wenns dich interessiert, habich hier ein 3-teiliges Tut verzapft, das fängt bei Adam+Eva an, und vermittelt glaub alles erforderliche Handwerkszeug:
http://www.codeproject.com/Articles/1030969/Relational-Datamodel-for-Beginners

Einen Vorgeschmack vom databinding-getriebenem Entwickeln kannst du auch auf Video haben:
http://www.vb-paradise.de/index.php/Thread/94955-die-vier-views-auf-video/#post798777
Weil es geht ratzfatz, wenn mans verstanden hat, und man versteht die Stärke des Ansatzes eiglich nur, wenn mans in Aktion sieht.

Hier, ich hab mal ein denkbares Modell angehängt. Der Witz ist die wechselseitige Relation zwichen MultipleChoice-Frage (MCFrage) und MCAntwort.
Weil eine MCFrage kann ja viele Antworten haben. Aber ausserdem sollte sie auf genau eine Antwort verweisen, die richtig ist.

Der frühe Apfel fängt den Wurm.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Hier mal ein mögliche Vorgehen um sich die Sache zu erarbeiten.

Erst mal allen Nötigen Beteiligten und wichtige Eigenschaften neiderschreiben. Hast du ja grob gemacht.

Quiz
ID
Name

Frage
ID
-FrageText

Fragentyp_Normal
ID
-AntwortText

Fragentyp_MultipleChoice
ID
-AntwortText1
-AntwortText2
-AntwortText3
-AntwortText4

Fragentyp_Bild
ID
-Bild
-AntwortText

Hab mal Quiz hinzugefügt und Frageart (die Entscheidung treffen wir später) entfernt.

Dann die Realtionen zwischen den Tabellen klaren 1:n n:n usw.

Quiz
ID
Name

QuizFrage
QuizID
FrageID

Frage
ID
-FrageText

Fragentyp_Normal
ID
-AntwortText
FrageID

Fragentyp_MultipleChoice
ID
-AntwortText1
-AntwortText2
-AntwortText3
-AntwortText4
FrageID

Fragentyp_Bild
ID
-Bild
-AntwortText
FrageID

Hab zwische Quiz Frage mal eine n:m Beziehung gemaacht.

Als nächtes Fast man gemeinsammes zusammen. Git genau eine Antwort auf eine Frage also Packen wie die Antwort zur Frage und stellen Fest das bei MultipbeChoice die Bezeichnung falsch Gewählz ist. Ist ja geine Antwort sondern eine Vorgeschlagene Antwort Ich mach mal Text draus Prüfung in der BL ist dann Antwort = Fragentyp_MultipleChoice.Text.

Quiz
ID
Name

QuizFrage
QuizID
FrageID

Frage
ID
-FrageText
-AntwortText

Fragentyp_Normal
ID
FrageID

Fragentyp_MultipleChoice
ID
-Text1
-Text2
-Text3
-Text4
FrageID

Fragentyp_Bild
ID
-Bild
FrageID

Fragentyp_Normal enthält jetzt nicht meher viele jetzt treffen wie die Desinge entscheidung es über FrageTyp abzubilden und die Tabelle zu entfernen (ist nicht unbedingt nötig). Und Fragentyp_MultipleChoice können wir auch über 1:n Abbilden.

Quiz
ID
Name

QuizFrage
QuizID
FrageID

Frage
ID
-FrageText
-AntwortText
-Typ

Fragentyp_Normal
ID
FrageID

Fragentyp_MultipleChoice
ID
-Text
FrageID

Fragentyp_Bild
ID
-Bild
FrageID

Typ füde sich ja jetzt immer widerholen. Deswegen Normalisieren (mal googeln) wir weiter und fügen eine Typ Tabelle hinzu.

Quiz
ID
Name

QuizFrage
QuizID
FrageID

Frage
ID
-FrageText
-AntwortText
-TypID

Typ
ID
-Text

Fragentyp_Normal
ID
FrageID

Fragentyp_MultipleChoice
ID
-Text
FrageID

Fragentyp_Bild
ID
-Bild
FrageID

So das war es dann, grundlegend nach schema F vorgegangen und ein paar kleine Desinge entscheidungen getroffen.

p.s.
@ErfinderDesRades
Meine Tabellen sehen ein bisschen anders aus als deine 😉

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

5.299 Beiträge seit 2008
vor 8 Jahren

p.s.
@ErfinderDesRades
Meine Tabellen sehen ein bisschen anders aus als deine 😉 Ja, und ich glaub, dein Modell kannst du auch in einem typDataset kaum umsetzen.

Das wär aber besser, weil was im typDataset umgesetzt ist, damit kann man gleich los-programmieren, Daten generieren, Databinding und so.

Der frühe Apfel fängt den Wurm.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Mit Typisierten Dataset kenne ich mich ehrlich gesagt nicht so aus. Ich sehr aber jetzt kein Problem, wenn dein Model unersetzbar sein sollte, sollte meines auch funktionieren.

Grundlegend ging die Frage ja auch um eine Relationale Datenbank und wie die Daten gehalten werden sollte deiner Anwendung (außer in DAL) egal sein.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

5.299 Beiträge seit 2008
vor 8 Jahren

Wenn dein Model unersetzbar sein sollte,... Es ist bereits umgesetzt - du siehst ja das Bildchen.
Das ist eben das feine an Wysiwyg, dass was man angucken kann, gleichzeitig kompilierten, nutzbaren Code darstellt.

..., sollte meines auch funktionieren. eher nicht. Ist ja nur hingeschrieben, und wurde noch kein kompilierbarer Code für generiert (oder gecodet).

Knackpunkt ist das Polymorphie-Problem, also die Idee, dass der Fremdschlüssel eines Frage-Datensatzes entweder auf eine BildFrage, oder auf NormalFrage, oder auf MCFrage verweisen können soll.
Dieser Gedanke ist naheliegend, und wär schön, aber geht numal nicht, nicht mittm Dataset, und ich glaub auch nicht in Access oder EF oder sonstwo.

Allenfalls mit einem komplett von Hand gecodetem Datenmodell ist das denkbar, und dazu ein händisch gecodetes DAL, und das DAL muss tricksen, also per Code die polymorphe Relation gewährleisten, die in der Datenbank garnicht formulierbar ist.

Ich denke, da kommst du ganz schnell auf über 500 Zeilen händischen Codes, wo ich immernoch nicht mehr als meine beiden Zeilen brauche: Dataset.Read-/Write-Xml()
Und (ich bin noch nicht fertig 😉 ) du hast das ganze Gschiss mit dem zweifach umgesetzten Datenmodell, und der Adapter-Schicht dazwischen, was alles immer peinlich genau aufeinander abzustimmen ist.

Der frühe Apfel fängt den Wurm.

M
mapi Themenstarter:in
10 Beiträge seit 2016
vor 8 Jahren

Hi, VIELEN DANK für eure Mühen 👍 👍 😁
Ist jetzt schon spät, werde mich morgen mal genauer mit diesem Dataset.Read-/Write-Xml und den ganzen Links beschäftigen die hier gepostet wurden!
Und melde mich dann evtl nochmal 👍

Liebe Grüße und Danke 🙂

5.299 Beiträge seit 2008
vor 8 Jahren

wenn du dich damit beschäftigst, beachte die Links aus post#5 - das kann dir sehr viel Zeit ersparen.
Ich kenn das, wenn Threads länger werden, werden die wichtigsten Sachen schnell übersehen.

Der frühe Apfel fängt den Wurm.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Knackpunkt ist das Polymorphie-Problem, also die Idee, dass der Fremdschlüssel eines Frage-Datensatzes entweder auf eine BildFrage, oder auf NormalFrage, oder auf MCFrage verweisen können soll.
Dieser Gedanke ist naheliegend, und wär schön, aber geht numal nicht, nicht mittm Dataset, und ich glaub auch nicht in Access oder EF oder sonstwo.

Nein Bild-, Normale und MCFrage haben den Fremdschlüssel von Frage. Für Bild- und NormaleFrage Bilde ich damit die 1:1 beziehung ab. Für MCFrage die 1:n Beziehung.

EF kann das mit der Polymorphie, auch wenn ich es noch nicht benutzt habe. Polymorphie gehört aber zu OOP. Und wenn du sie nicht verwendest weil deine Datenbank das nicht kann machst du was falsch. Oder anders ausgedrückt du hast kein Vernünftiges OOP Model und auch kein gutes Datenmodel für eine Relationale Datenbank. Dein Model passt für ein Typisiertes Dataset. Wo sind die noch mal Standart zur Datenspeicherung?

Allenfalls mit einem komplett von Hand gecodetem Datenmodell ist das denkbar, und dazu ein händisch gecodetes DAL, und das DAL muss tricksen, also per Code die polymorphe Relation gewährleisten, die in der Datenbank garnicht formulierbar ist.

Ja, ich muss wirklich Quellcode per Hand schreiben. Passiert schon mal als Programmierer.
Und ist off auch besser, als das was man sich als nicht Programmierer so zusammen Klicken kann.

Und ja wenn die Datenquelle keine Polymorphie breitstellt muss isch das per Hand machen.
Vorteil ist ich kann meine Datenquelle, dann mit relative wenig aufwand austauschen.

Ich denke, da kommst du ganz schnell auf über 500 Zeilen händischen Codes, wo ich immernoch nicht mehr als meine beiden Zeilen brauche: Dataset.Read-/Write-Xml()
Und (ich bin noch nicht fertig 😉 ) du hast das ganze Gschiss mit dem zweifach umgesetzten Datenmodell, und der Adapter-Schicht dazwischen, was alles immer peinlich genau aufeinander abzustimmen ist.

Du schreibst vielleicht nur 2 Zeilen. Dafür brauchst du Zeit um die mit deinem Generator die Sachen zusammen zu Klicken (ob das wirklich schneller ist bleibt jeden selbst überlassen). Und der Erzeugt dann meistens mehr als 500 Zeilen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

5.299 Beiträge seit 2008
vor 8 Jahren

Hi!

Ich konnts nicht lassen, und habs noch weiter ausgeführt, und habich in die Snippets gepackt:
Kleine Datenverarbeitung DatasetOnly
Da kann mans jetzt angucken und probieren, diskutieren, Erweiterungen, Verbesserungen, Alternativen posten - am besten wäre natürlich mit angehängten, lauffähigen Zips, auf der Vorlage basierend oder auch from Scratch.

Der frühe Apfel fängt den Wurm.

T
314 Beiträge seit 2013
vor 8 Jahren

Funktioniert ein Typed Dataset überhaupt in Verbindung mit MS Access?

49.485 Beiträge seit 2005
vor 8 Jahren

Hallo ErfinderDesRades,

ich habe ein paar Anregungen zur Verbesserung deines Datenmodell, welches du in dem verlinkten Thread vorgestellt hast. Jeweils begonnen mit einer in den jeweiligen Aspekt einleitenden und anregend gemeinten Frage.

Warum gibt es keine Fragen mit Bild und Multiple-Choice-Antwort? Nach dem Motto, wer ist auf dem Bild zu sehen: A, B, C?

Warum unterscheidest du eine Bildfrage von einer Text-Frage? Es sind doch auch Fragen denkbar, die Bild und Text erfordern. Oder mehr als ein Bild. Nach dem Motto, auf welchem der Bilder ist Person X zu sehen: 1, 2 3? Mach doch so, dass man als statt Text besser HTML oder sicherer BBCode verwenden und so beliebige Bilder (und andere Objekte z.B. Videos ) einbinden kann.

Warum unterscheidest du Spell- und MC-Antworten? Mach es doch so, dass zu jeder Frage beliebig viele Antworten möglich sind. Und wenn es zu einer Frage nur eine Antwort gibt, dann wird diese nicht als MC-Radiobutton angezeigt, sondern als Spell-Eingabefeld.

Im Ergebnis hast du ein wesentlich einfacheres Datenmodell mit nur einer Art von Fragen und nur einer Art von Antworten, sparst dir redundante IDs-Felder, die im momentanen Modell zudem noch semantischen Einschränkungen unterliegen (immer nur eine gesetzt) und erreichst trotzdem alles, was du willst und bist sogar noch deutlich flexibler.

Selbst wenn du dich dafür entscheidest, die Trennung zwischen Text und Bildfragen aufrecht zu erhalten, solltest du die explizit Trennung zwischen Spell- und MC-Antworten aufgeben. Mindestens sollte die unterschiedliche Art von Fragen und die unterschiedliche Art von Antworten entkoppelt sein, so dass man beliebig kombinieren kann. Empfehlen würde ich persönlich natürlich die Umsetzung aller Vorschläge.

Bei Multiple-Choice (also wenn es mehr als eine Antwort gibt (egal, ob 2 z.B. Ja/Nein, 3, 4 oder mehr) wäre es schön, wenn man bei der Frage noch angeben kann, ob die Antworten in der vorgegebenen Reihenfolge angezeigt werden oder in einer zufälligen.

herbivore

5.299 Beiträge seit 2008
vor 8 Jahren

Funktioniert ein Typed Dataset überhaupt in Verbindung mit MS Access? ja sicher.
Dem Dataset ists egal, ob es in eine Db persistiert oder einfach mit .Write-/Read-Xml() auf Platte. Das kann man sogar nachträglich noch umändern.

Bei mit Db ist nur wesentlich mehr zu beachten, weil wie gesagt das Datenmodell zweimal umgesetzt werden muss, in zwei gänzlich unterschiedlichen Systemen.
Erfordert also auch noch eine Vermittler-Schicht dazwischen, und alles drei muss erstmal aufgesetzt, und dann die ganze Entwicklungszeit immer perfekt aufeinander abgestimmt sein.

Hingegen ohne Db kann man prototypisch datasetOnly sehr zügig entwickeln, und wenns dann in Richtung Alpha-Version geht, die Db immer noch dranpatchen.
Weil ist ja nicht unwahrscheinlich, dass ein Produktiv-System mit sone Winz-"Embedded-Database" nicht mehr auskommt.

Der frühe Apfel fängt den Wurm.