Problem bei Datenbankdesign (Rekursivität...)
Nicolas
- datenbank
Hallo,
also ich grüble jetzt schon lange Zeit über mein Datenbankdesign, aber irgendwie drehe ich mich gedanklich im Kreis. Vielleicht kann mich jemand von Euch "inspirieren".
Ich entwickle eine einfache Know-how und Fehlerdatenbank für Kunden und Mitarbeiter. Es gibt verschiedene Produkte, und ich beginne exemplarisch mit einem Bestimmten, aber es soll dann übertragbar / erweiterbar sein...
Es gibt eine Menge von Problemlösungen, die zunächst alle angezeigt werden, aber dann mit folgendem Prozedere eingeschränkt werden sollen.
Es soll einen Fragekatalog mit Antworten geben, durch den der Anwender sequentiell geleitet wird. Als erstes zum Beispiel die Frage:
Welches Produkt? A, B oder C?
Wenn der Kunde nun Produkt A auswählt sollen alle folgenden Fragen sich auf eben dieses Produkt beziehen. Dann z.B.:
Ist Option XYZ vorhanden? (ja / nein)
Dann soll z.B. eine Frage gestellt werden, die aus beiden bisherigen Antworten resultiert. Außerdem soll die Menge der auf die nächste Frage hin präsentierten Antworten durch die bisherigen Antworten eingeschränkt sein.
Könnt Ihr mir folgen? Ist schwer, meine Gedanken in Worte zu fassen und nichts Wichtiges zu vergessen!
----------------------------------
Also mein Problem ist Folgendes:
Wie kann ich die Beziehung zwischen Fragen und Antworten anlegen? Es ist ja eine m:n-Beziehung. Also eine Verbindung über eine zusätzliche Tabelle ist mir schon klar, aber ich muss ja irgendwie dann immer die bisher gegebenen Antworten berücksichtigen / speichern. Wie mache ich das bloß?
Und dann muss ich noch die Problemlösungen (das Ergebnis für den Kunden aus der Fragerei...) irgendwie mit den Antworten auf die Fragen verknüpfen, damit bei einer bestimmten Antwort nicht mehr zutreffende Lösungen ausgeblendet werden, gell?
Das ganze statisch für dieses eine Produkt umzusetzen wäre ja kein Problem (denke ich im Augenblick), aber die Erweiterbarkeit (anderes Produkt --> andere Fragen, andere Anzahl von Fragen, völlig andere Merkmale der Lösungen...) bereitet mir Sorgen.
Über ein Frontend (Java-Applet/Servlet) soll es außerdem möglich sein, außer Abfragen der beschriebenen Art auch die ganze Geschichte zu erweitern, also Lösungen einzufügen, Fragen / Antworten hinzuzufügen, etc.
Bei mir dreht sich gerade alles...
Kann mir jemand Tipps geben oder meine Gedanken sortieren?
Gruß Nicolas
Hi Nicolas,
nichts leicher als das :-)
Tabelle Produkt:
Name ID
--------------------------
Auto 0
Haus 1
Ehefrau 2
Tabelle Fragen:
Frage Produkt ID
-----------------------------------------------------------
Fahren Sie einen Audi? 0 0
Ist Ihr Audi älter als 10Jahre 0 01
Raucht Ihr Audi hinten raus 0 010
Wo steht ihr Haus 1 0
Lieben Sie Ihre Frau 2 0
Tabelle Antworten:
Antwort Produkt ID
-----------------------------------------------------------------
Ja 0 0
Ja 0 01
Nein 0 00
Nein 0 010
Ja 0 011
etc.
So, wenn Du nun Produkt Auto ausgewählt hast, suchst Du die Frage mit der ID "0" (da Du die erste Frage stellst) und dem Produkt "0" (Auto). Der User sagt "Ja". "Ja" ist mit einer 1 kodiert. Der ID-String ist nun "0"+"1" = "01". Die nächste Frage ist also "Ist Ihr Audi älter als 10Jahre?" "Ja" und "Nein" sind wieder kodiert, als 0 und 1. Die ID bei Ja (0) ist dann "010" und somit heißt die nächste Frage "Raucht Ihr Audi hinten raus" etc.
Das wäre jetzt mal die Lösung, die mir so einfällt. Du kannst statt 0 und 1 natürlich bis zu 16 verschiedene Antworten geben (0-F). Die Produkte können über die Produkt-ID nahezu unendlich werden. Nur der Pflegeaufwand wird leider dann auch unendlich. Aber das ist bei einem "Expertensystem" (Buzzword aus den 90ern) leider so ;-)
Gruß
Hans
Hallo Hans,
vielen Dank erstmal für die sehr schnelle und trotzdem ausfühliche Hilfe.
Name ID
Auto 0
Haus 1
Ehefrau 2Tabelle Fragen:
Frage Produkt ID
Fahren Sie einen Audi? 0 0
Ist Ihr Audi älter als 10Jahre 0 01
Raucht Ihr Audi hinten raus 0 010
Wo steht ihr Haus 1 0
Lieben Sie Ihre Frau 2 0Tabelle Antworten:
Antwort Produkt ID
Ja 0 0
Ja 0 01
Nein 0 00
Nein 0 010
Ja 0 011etc.
So, wenn Du nun Produkt Auto ausgewählt hast, suchst Du die Frage mit der ID "0" (da Du die erste Frage stellst) und dem Produkt "0" (Auto). Der User sagt "Ja". "Ja" ist mit einer 1 kodiert.
Wieso ist ja mit einer "1" kodiert? Wo steht diese "1"? Das verstehe ich noch nicht ganz. Und die Id in der dritten Tabelle ist mir auch noch nicht so ganz klar, aber da werde ich nochmal nachdenken...
Ich stehe etwas auf dem Schlauch, aber ist auch eine Kodierung im Dezimalsystem möglich? Oder warum hast Du jetzt Dual bzw Hex ausgewählt?
Das wäre jetzt mal die Lösung, die mir so einfällt. Du kannst statt 0 und 1 natürlich bis zu 16 verschiedene Antworten geben (0-F). Die Produkte können über die Produkt-ID nahezu unendlich werden. Nur der Pflegeaufwand wird leider dann auch unendlich. Aber das ist bei einem "Expertensystem" (Buzzword aus den 90ern) leider so ;-)
Der Pflegeaufwand macht mir dann tatsächlich Sorgen. Die Anzahl der Produkte hält sich in Grenzen (sind im Augenblick etwa fünf), aber die Anzahl der Variationen und Optionen ist deutlich größer. Daher auch die vielen Fragen zur genauen Identifikation des Produktes, um dann passende Lösungen präsentieren zu können.
Auf jeden Fall schon mal ganz vielen Dank an Dich!
Gruß Nicolas
Hi !
Tabelle Antworten:
Antwort Produkt ID
Ja 0 0
Ja 0 01
Nein 0 00
Nein 0 010
Ja 0 011etc.
So, wenn Du nun Produkt Auto ausgewählt hast, suchst Du die Frage mit der ID "0" (da Du die erste Frage stellst) und dem Produkt "0" (Auto). Der User sagt "Ja". "Ja" ist mit einer 1 kodiert.
Wieso ist ja mit einer "1" kodiert? Wo steht diese "1"? Das verstehe ich noch nicht ganz. Und die Id in der dritten Tabelle ist mir auch noch nicht so ganz klar, aber da werde ich nochmal nachdenken...
Ich stehe etwas auf dem Schlauch, aber ist auch eine Kodierung im Dezimalsystem möglich? Oder warum hast Du jetzt Dual bzw Hex ausgewählt?
Also, das ganze kann man sich ja wie einen Binär-Baum vorstellen. Da kannst Du "links" und "rechts" abbiegen. Du kannst auch "0" und "1" sagen. Nun sagen wir mal, alle "Ja"'s haben den Code "1" und alle "Nein"'s einer Frage haben den Code 0. Somit hast Du bei
0 -> erste Antwort ist Nein
01 -> 1. A. ist Nein, 2. A. ist Ja
010 -> 1. A. ist Nein, 2. A. ist Ja, 3. A. ist Nein
Somit hangelst Du dich durch den Baum, bis der User abbricht oder Du auf den letzten Knoten triffst. Um die für die bisher gegebenen Antworten richtige Frage zu finden, suchst Du die Frage, die gestellt werden muß, wenn die 1. A. Nein, die 2. A. Ja und die 3. A. Nein ist. Also suchst Du die Frage, bei der die ID="010" ist.
Und Hex-System:
9C3 -> multiple choice. 1. Frage die 9.Antwort geklickt, 2. Frage die 12. Antwort, 3. Frage die 3. Antwort gewählt.
Gruß
Hans
So nochmal gelesen, und schon etwas klarer.
Dezimalsystem ginge natürlich genauso, nur das ich dann statt 2 bzw 16 möglichen Antworten 10 hätte, richtig?
Dann muss ich jetzt bloß noch den Problemlösungen die kodierten Id's zuordnen...
Aber die "1" für das erste Ja verstehe ich immer noch nicht. Wie bildet sich denn die Spalte Id aus der Tabelle Antworten?
Gruß Nicolas
Hi !
Aber die "1" für das erste Ja verstehe ich immer noch nicht. Wie bildet sich denn die Spalte Id aus der Tabelle Antworten?
Ja, das ist mein Fehler. Sollte eigentlich so heißen:
Antwort Produkt ID
------------------------------------------------
Ja 0 1
Nein 0 0
So, jetzt suchst Du alle Antworten, die bei ID entweder
Also bei ersterem:
Frage Länge
0 1 ("0","1")
1 2 ("00","01","10","11")
2 3 ("000","001","011",...)
Also bei letzterem
Frage Bereich
0 1..9
1 10..99
2 100..999
etc.
Gruß
Hans
Alles klar, dann ist jetzt einiges klarer. Du hast mir sehr geholfen...
Dankeschön!
Hi Leute
@Hans, das ist ein interessanter Lösungsansatz. Ich hätte jedoch einen anderen gewählt:
Tabelle Fragen:
ID Frage verfeinert (FrageID) wenn (AntwortID)
----------------------------------------------------------------
1 Welche Automarke fahren Sie? null null
2 Wow, ein Porsche! War der teuer? 1 3
3 Welches Modell? 1 null
4 Welchen Motor hat das Fahrzeug? 3 null
5 Partikelfilter vorhanden? 4 11
Tabelle Antworten:
ID Antwort
--------------------
1 Audi
2 BMW
3 Porsche
4 A3
5 A4
6 911 Carrera
7 Ja
8 Nein
9 Weiss nicht
10 Benziner
11 Diesel
Welche Antworten zu welcher Frage passen wird in einer separaten Zuordnungstabelle gespeichert.
Nachdem du eine Antwort erhalten hast suchst du nach der nächsten Frage, welche die vorherige verfeinert und, falls vorhanden, sich auf die gegebene Antwort bezieht. Die Feldernamen können ohne Zweifel besser gewählt werden.
Wie beurteilst ihr diese Lösung?
Gruss
Tom2
Hi Tom2,
ja, wenn jetzt noch eine ProduktID eingeführt wird, dann kann man auch Dein Konzept auf beliebige Themen erweitern. Gute Idee !
Gruß
Hans
Hallo Tom,
vielen Dank für Deine Idee.
Ich sehe den Vorteil gegenüber Hans' Lösung, dass die Anzahl der möglichen Antworten pro Frage nicht durch die Wahl des Zahlensystems auf z.B. 16 (hex) beschränkt ist.
Ein Problem bereitet mir die "Speicherung" der bisher gegebenen Antworten. Ich möchte ja z.B. für Frage 10 noch wissen, was auf Frage 3 geantwortet wurde. Siehst Du da eine Möglichkeit, bzw. hast Du daran gedacht? Bei Hans muss ich ja einfach nur die entsprechende Stelle der Id nehmen und kann wieder auf die Antwort schließen...
Gruß Nicolas
Hallo Nicolas
Ein Problem bereitet mir die "Speicherung" der bisher gegebenen Antworten.
Wofür willst du denn die Antworten speichern? Wenn nicht permanent gespeichert werden soll, dann würde ich die bisherigen Antworten einfach als hidden-Felder zum Client mitsenden.
<input type="hidden" name="frage[id]" value="antwort" />
Willst du jedoch eine Art Umfrage machen, so dass die gegebenen Antworten wieder zurück in die Datenbank fliessen, dann braucht jeder Benutzer eine eindeutige ID. Diese speicherst du mit der FrageID und der AntwortID zusammen in eine neue Tabelle. Durch eine 1:n-Beziehungen zwischen [der Fragen- und der Antwort-Tabelle] zur BenutzerAntwort-Tabelle kannst du auch gleich den Fall abecken, dass ein Benutzer mehrere Antworten auf eine Frage geben kann.
Tabelle: BenutzerAntworten
ID BenutzerID FragenID AntwortID
----------------------------------
1 283 77 1
2 283 77 6
2 283 99 2
Ist dir egal, welcher Benutzer was geantwortet hat, d.h. du willst nur die Nennungen zählen, dann würde ich eine Zähler-Spalte an die Antwort-Tabelle oder die Zuordnungstabelle (Frage -> Antwortmöglichkeiten) anhängen. Das Design scheint ausreichend flexibel zu sein.
HTH & Gruss
Tom2
Hallo Tom2,
Wofür willst du denn die Antworten speichern? Wenn nicht permanent gespeichert werden soll, dann würde ich die bisherigen Antworten einfach als hidden-Felder zum Client mitsenden.
<input type="hidden" name="frage[id]" value="antwort" />
Das klingt so ziemlich gut. Hab ich noch nie etwas von gehört, und leider blieb eine kurze Suche auch recht erfolglos. Kannst Du mir das nochmal erläutern, wie das funktioniert? Also SQL-seitig und vor allem auch, wie ich dann auf dem Client auf die Daten zugreifen kann (nutze Java)? Dafür wäre ich Dir sehr dankbar.
Willst du jedoch eine Art Umfrage machen, so dass die gegebenen Antworten wieder zurück in die Datenbank fliessen, dann braucht jeder Benutzer eine eindeutige ID.
Nein, das habe ich bar nicht vor. Ich möchte nur die Antworten solange speichern, bis der Kunde seine Lösung gefunden, bzw. eine Serviceanfrage abgesendet hat.
Ist dir egal, welcher Benutzer was geantwortet hat, d.h. du willst nur die Nennungen zählen, dann würde ich eine Zähler-Spalte an die Antwort-Tabelle oder die Zuordnungstabelle (Frage -> Antwortmöglichkeiten) anhängen. Das Design scheint ausreichend flexibel zu sein.
Das war bislang noch nicht geplant, aber zu Statistikzwecken liesse sich das wohl ohne großen Aufwand umsetzen, was?!
Dankeschön!
Nicolas
Hallo.
"Expertensystem" (Buzzword aus den 90ern)
Stimmt, das hört man inzwischen selten. Vielleicht sollte ich es mir mal wieder einprägen.
MfG, at
Hallo,
Ich entwickle eine einfache Know-how und Fehlerdatenbank für Kunden und Mitarbeiter. Es gibt verschiedene Produkte, und ich beginne exemplarisch mit einem Bestimmten, aber es soll dann übertragbar / erweiterbar sein...
Das hört sich nach einem Expertensystem an. Da könnte ich mir sehr gut eine hierarchische Darstellung vorstellen. Ein Beispiel für MYSQL findest du z.B. unter http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
Weiteres in der Suchmaschine deiner Wahl.
Grüße
Marcus
Das hört sich nach einem Expertensystem an. Da könnte ich mir sehr gut eine hierarchische Darstellung vorstellen. Ein Beispiel für MYSQL findest du z.B. unter http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
Weiteres in der Suchmaschine deiner Wahl.Grüße
Marcus
Du hast Recht mit dem Expertensystem.
Die von Dir genannte Adresse beschreibt das "Nested Sets"-Prinzip. Das habe ich schon durchexerziert, und leider ist der Pflegeaufwand zu groß. Deshalb bin ich jetzt auf der Suche nach "pflegeleichteren" Ideen.
Trotzdem dankeschön!
Hallo,
Du hast Recht mit dem Expertensystem.
Die von Dir genannte Adresse beschreibt das "Nested Sets"-Prinzip. Das habe ich schon durchexerziert, und leider ist der Pflegeaufwand zu groß. Deshalb bin ich jetzt auf der Suche nach "pflegeleichteren" Ideen.
Nun ich halte es für relativ pflegeleicht, da das Hinzufügen eines neuen Pfades leicht über eine Funktion realisierbar ist. Der Autor verweist am Ende auf http://www.sitepoint.com/article/hierarchical-data-database, dort sind die notwendigen Funktionen in PHP realisiert, weniger wirst du auch mit anderen Ansätzen kaum benötigen.
Auch die Frage nach dem aktuellen "Standort" läßt sich leicht beantworten, er ist durch den Rechts-, bzw. Linkswert eindeutig beschrieben.
Grüße
Marcus
Hallo Marcus,
Nun ich halte es für relativ pflegeleicht, da das Hinzufügen eines neuen Pfades leicht über eine Funktion realisierbar ist. Der Autor verweist am Ende auf http://www.sitepoint.com/article/hierarchical-data-database, dort sind die notwendigen Funktionen in PHP realisiert, weniger wirst du auch mit anderen Ansätzen kaum benötigen.
Das ist mir inzwischen auch wieder vor Augen gekommen. Mist! Mein Problem mit solch einer Baumstruktur ist, dass ich, um eine mögliche Frage hinzuzufügen, die für evtl. alle Fälle gilt, diese in dann fast jeden Zweig einfügen muss. Das meine ich mit aufwändig, verstehst Du? Oder sehe ich da etwas falsch?
Gruß
Nicolas
Hallo,
Das ist mir inzwischen auch wieder vor Augen gekommen. Mist! Mein Problem mit solch einer Baumstruktur ist, dass ich, um eine mögliche Frage hinzuzufügen, die für evtl. alle Fälle gilt, diese in dann fast jeden Zweig einfügen muss. Das meine ich mit aufwändig, verstehst Du? Oder sehe ich da etwas falsch?
Aber bei deinem Ansatz musst du doch auch für jede Frage einen eigenen Eintrag machen, es sei denn, du merkst dir die "Fragehistorie". Sonst verlierst du sie, sobald sich zwei Zugangswege (über den Fragebaum) an einem Punkt treffen.
Da musst du dann aus der aktuellen Situation entscheiden, wie oft es vorkommt, dass verschiedene Wege zur selben Antwort führen und der darauffolgende Frageweg identisch ist. Bei einer Fehlerdatenbank ist das wohl dann die Antwort "Wenden Sie sich bitte an den Kundenberater" ;-)
Grüße
Marcus