Selbstverweise in SQL
Rouven
- datenbank
Hallo,
folgende Situation:
Tabelle 1:
id | wort
Tabelle 2:
id1 | id2
Abbilden soll das folgendes:
Zu wort gehört ein weiteres Wort (seine sog. Stammform). Ich könnte jetzt eine Abfrage schreiben, die über 2 JOINS zu einem Wort seine Stammform sucht. Nun habe ich aber von diesem Wort ggf. wieder eine Stammform usw.
Frage: Gibt es ein Sprachkonstrukt in (My-)SQL, mit dessen Hilfe man solche Verweise in beliebiger Tiefe auslesen kann (so dass ich hinterher eine Liste der Wörter rausbekomme, ausgehend von einem bestimmten) oder muss ich tatsächlich eine Schleife laufen lassen, die mir immer die ID des nächsten Wortes liefert und den Vorgang erneut anstossen.
Danke!
MfG
Rouven
Hello,
Hallo,
folgende Situation:
Tabelle 1:
id | wortTabelle 2:
id1 | id2
Wieviel Stammformen hat denn jedes Wort?
Das sieht doch so aus, dass die Struktur ganz anders sein kann, oder?
T_Wort
==========
id_wort
-------
id_parent
wort
blahtext
Das ändert zwar nichts an der rekursiven Auflösung, die bei Datenbanken natürlich Performance kostet, aber es müsste die Sache doch auch treffen.
Und da wirst Du nicht um eine Schleife herumkommen.
Man kann allerdings die Tabelle auch mehrfach "öffnen" mit Alias und dann gleich mehrere Stufen auf einmal abarbeiten. Ob das MySQL-intern dann aber ein Vorteil ist, habe ich noch nicht untersucht.
Gut wäre es natürlich, wenn man die Zugehörigkeit der einzelnen Elemente einer Linie zu einer Urform wüsste und die eintragen könnte
id_urform id_wort
id_urform id_parent id_wort
id_urform id_parent id_wort
id_urform id_parent id_wort
id_urform id_parent id_wort
Die untereinanderstehenden Werte sind jeweils gleich. Ich hoffe, es wird deutlich, wie es gemeint ist.
Dann könnte man ggf, die Untermenge komplett über id_urform abfragen und den Rest im Speicher aushandeln.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallöchen,
also das mit der geänderten Tabellenstruktur (Variante 1) klappt auf gar keinen Fall. Ein Wort kann durchaus mehrere Stammformen zugeordnet bekommen (als triviales Beispiel: Die Stammform von Sieben ist sowohl 7 als auch Sieb). Insofern muss ich bei der Ausgliederung bleiben. Die Sache mit dem mehrfachen ALIAS bringt mich insofern nicht weiter, als das ich dann ja in der Abfrage schon eine bestimmte Anzahl von Ebenen vorgeben müsste die ich abfragen will - Das führt dann entweder zu mehreren solcher Abfragen oder dazu, dass es nur diese Anzahl an Ebenen in der Wortzuordnung geben kann.
Schließlich die Sache mit der urform. Das ist eine ganz nette Idee, vielleicht werde ich da mal etwas drauf rumdenken ob man in der Richtung was entwickeln kann - Es würde ja zumindest in einer Abfrage eine Kandidatenliste erstellen die man danach manuell auswerten könnte.
Na ja, danke jedenfalls für den Denkanstoss, mal sehen was ich draus mache...
MfG
Rouven
Hello,
Das das mehrere Möglichkeiten gibt, habe ich befürchtet.
Schließlich die Sache mit der urform. Das ist eine ganz nette Idee, vielleicht werde ich da mal etwas drauf rumdenken ob man in der Richtung was entwickeln kann - Es würde ja zumindest in einer Abfrage eine Kandidatenliste erstellen die man danach manuell auswerten könnte.
Habe das gleiche Problem bei einem CMS, bei dem Seiten sowohl von Kategorien geerbert werden können als auch von Eigentümern oder von Orten oder von Themen ...
Liebe Grüße aus http://www.braunschweig.de
Tom
yo,
zum einen sehe ich noch nicht den sinn, warum es zwei tabellen sind. man könnte das ruhig in einer tabelle zusammenfassen, solange es sich nicht um eine n:m beziehung handelt. da brauchst du auch nicht mehr 2 joins, sondern nur noch einen selfjoin.
zum andere handelt es sich um rekursive tabellen und die sind nicht unkritisch. sie werden zwar häufig verwendet, aber man sollte sich der problematik bewußt sein.
dein problem klinkt ein wenig nach der aufgabe, finde zu einem bestimmten mitarbeiter alle seine direkten und indirekten chefe raus.
das geht mit unterabfragen, da du auf ergebnisse zugreifen musst, die erst zur laufzeit bestimmt werden können. wenn ich mich nicht täusche, dann mag mysql keine unterabfragen, zumal diese zwar praktisch, aber nicht besonders perfomant sind.
vielleicht sollte man aus diesem grund das tabellen design überlegen und eine zweidimensionale matrix einbauen. mit diesem zwei werten für jedes wort, würde man dann auch leicht eine abfrage schreiben können, die alle linien ab einem belieben wort erfasst.
Ilja