Intelligente Suche in Baumstruktur
Daniel Petratsch
- datenbank
Hallo!
Ich stehe momentan vor einem kleineren Problem, zu dem mir nach langem Grübeln noch nicht wirklich eine sinnvolle Lösung eingefallen ist (verwendet werden MySQL & PHP):
Ich habe eine Baumstruktur die in der Datenbank abgebildet wird. Dies ist an und für sich kein Problem, wobei ich mir aber noch nicht ganz sicher bin ob ich entweder auf Parent-IDs oder auf das Nested Set zurückgreife. Ich denke aber dass das Nested Set hier die bessere Wahl ist.
Die Datenbank beinhaltet nun eine fürs erste fixierte Struktur von Ebenen, die zur geografischen Lokalisierung dienen:
Land > Bundesland > Bezirk > Postleizahl
Nun ist es folgendermaßen, dass Bereiche "gematched" werden müssen. Man bekommt eine Ordnermäßige Struktur zum auf und zuklappen, in der man per Checkbox bestimmte Knoten selektieren kann, wobei aber natürlich auch nach Belieben gemischt werden kann. Diese selektierten Knoten werden dann in der Datenbank gespeichert und anschließend mit einer anderen Struktur "gematched".
Die Schwierigkeit für mich besteht nun, die Strukturen korrekt zu vergleichen. Es muss die Query erkennen können, dass z.B. die gespeicherte Postleitzahl eine Teilmenge der zu vergleichenden Struktur ist. Man kann sich das am besten so vorstellen: Firma A sucht Personen im Bundesland X, Person B sagt aber, ich will nur in den Bezirken Y und Z arbeiten, wobei diese Bezirke ja auch von einem anderen Bundesland stammen können. Die Mehrfachauswahl ist dabei auch zu berücksichtigen.
Die Query selbst kann zudem auch nicht eigenständig laufen, da sie Bestandteil einer weiteren komplexen Query ist und ins gesamte Result Set
einfließen muss (Sortierungen, Gruppierungen etc.)
Ist diese Problemstellung überhaupt mit der Datenbank alleine lösbar oder sollte (könnte man überhaupt?) einen Teil über PHP lösen? Der Weg über temporäre Tabellen wäre evtl. eine Möglichkeit, dieser ist mir aber aufgrund der Performance sehr unsympathisch, da es vorallem bei massenweisen Vergleichen wahrscheinlich arge Geschwindigkeitsprobleme geben wird.
Danke für eure Hilfe,
Daniel
Ein paar Ansätze.
Die Mehrfachauswahl kriegst du ja z.B. mit DISTINCT weg. Da ists dann egal ob eine PLZ aus einem Bezirk oder aus der direkten Auswahl der PLZs stammt.
Ich würd das vom einfacheren (und langsamen) Weg her aufziehen. Erst mal so machen dass es überhaupt funktioniert und du es nachvollziehen kannst.
Dann kannst du es ja langsam tunen.
Du könntest das kleinste Kriterium bestimmen, in deinem Fall die Bezirke. Dann brauchst du nicht tausende PLZs einzeln durchlaufen.
Wo hast du die Strukturen? Die werden bei wilden Auswahlen kaum alle in einem ellenlangen WHERE stehen?
Vielleicht willst du das ja doch etwas vereinfachen und erst mal nur mit Bezirken arbeiten? Denn für dein Beispiel der Jobsuche, gibt man da wirklich einzelne PLZ an, die man haben will? Vielleicht den Beginn einer PLZ, aber dann würd ich da auch nur eine Möglichkeit zulassen, z.B. 68***.
Hallo Encoder,
Ein paar Ansätze.
Die Mehrfachauswahl kriegst du ja z.B. mit DISTINCT weg. Da ists dann egal ob eine PLZ aus einem Bezirk oder aus der direkten Auswahl der PLZs stammt.
Mit Mehrfachauswahl meine ich, dass beliebige Knoten aus der Struktur selektiert werden sollen. Da gibt es von Beginn an schon keine doppelte Auswahl.
Ich würd das vom einfacheren (und langsamen) Weg her aufziehen. Erst mal so machen dass es überhaupt funktioniert und du es nachvollziehen kannst.
Dann kannst du es ja langsam tunen.Du könntest das kleinste Kriterium bestimmen, in deinem Fall die Bezirke. Dann brauchst du nicht tausende PLZs einzeln durchlaufen.
Die kleinsten Kriterien als Auswahl zu nehmen ist prinzipiell schon richtig. Ich würde aber der Menge an Datensätzen wegen gerne nur die wirklich ausgewählten Knoten speichern. Die Datenbank selbst müsste sich dann durch die Query im Baum selbst zurechtfinden.
Wo hast du die Strukturen? Die werden bei wilden Auswahlen kaum alle in einem ellenlangen WHERE stehen?
Vielleicht willst du das ja doch etwas vereinfachen und erst mal nur mit Bezirken arbeiten? Denn für dein Beispiel der Jobsuche, gibt man da wirklich einzelne PLZ an, die man haben will? Vielleicht den Beginn einer PLZ, aber dann würd ich da auch nur eine Möglichkeit zulassen, z.B. 68***.
Die grundlegende Struktur selbst steht natürlich in der Datenbank und dient ja auch nur als "Vorlage". Der Vergleich selbst findet zwischen zwei individuellen Strukturen statt, die auf die "Vorlage" referenzieren. Postleitzahlen deswegen, weil man auch Bereiche angeben können soll, z.B. 10000 - 15000.
LG,
Daniel