• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Symmetrischer Verbund

Eine Verbundoperation wird in XQuery als "geschachtelte for-Schleife" spezifiziert, wobei in der bzw. den for-Klauseln die Laufvariablen gebunden, in der where-Klausel das Verbundprädikat ausgewertet und in der return-Klausel die durch die Variablen identifizierten Dokumentteile herangezogen werden, um ein Fragment des verknüpften Gesamtdokuments zu erzeugen.

Zur Illustration einer expliziten Verbundoperation wird wiederum auf das Beispiel der Zuordnung von Leitungspersonal zu der jeweiligen Station der Klinik Bezug genommen, wobei auf die Verfolgung der Referenzen per fn:id() verzichtet wird:

let $k := fn:doc("Hochwaldklinik.xml")
for $s in $k//Station,
$p in $k//Pfleger
where $s/@Leitung = $p/@ID
return
<Station>
{$s/Name}
<Leitung>
{$p//Vorname}
{$p//Nachname}
</Leitung>
</Station>

Dabei werden in der äußeren Schleife zunächst alle Stationen durchlaufen und für jede Station wird konzeptionell die Liste aller Pfleger nach Einträgen mit korrespondierender Nummer durchsucht.

Zu beachten ist an dieser Stelle, dass ohne Verwendung von ID/IDREF-Konstrukten auf Schemaebene und der Verwendung dieser Verbundanfrage die 1:N-Beziehung (dass eine Station auch tatsächlich nur von einem Pfleger geleitet wird) nicht mehr sichergestellt ist. Alternativ könnte diese Eigenschaft jedoch analog durch die Verwendung von key/keyref-Konstrukten auf Schemaebene erzwungen werden.

Da das Verbundprädikat in diesem einfachen Fall ein Test auf Gleichheit ist, kann alternativ die where-Klausel entfallen und die Überprüfung des Verbundprädikates in die Auswertung des Pfadausdrucks in die innere Schleife hineinzogen werden. Für obiges Beispiel ergibt sich dann folgende Verbundanfrage:

let $k := fn:doc("Hochwaldklinik.xml")
for $s in $k//Station,
$p in $k//Pfleger[@ID = $s/@Leitung]
return
<Station>
{$s/Name}
<Leitung>
{$p//Vorname}
{$p//Nachname}
</Leitung>
</Station>

Da in diesem Beispiel implizit die Semantik des inneren Verbunds angewendet wird, weil davon auszugehen ist, dass jede Station auch einen tatsächlich existierenden Pfleger als Leitungspersonal besitzt, kann die Reihenfolge der for-Klausel beliebig geändert und die entsprechenden Pfadausdrücke angepasst werden. Obiges Szenario kann somit symmetrisch auch wie folgt geschrieben werden:

let $k := fn:doc("Hochwaldklinik.xml")
for $p in $k//Pfleger,
$s in $k//Station[@Leitung = $p/@ID]
return
<Station>
{$s/Name}
<Leitung>
{$p//Vorname}
{$p//Nachname}
</Leitung>
</Station>

Diese Symmetrie kann jedoch nur dann Anwendung finden, wenn auf Ebene des Schemas eine Existenz der referenzierten Entitäten über Primär-/Fremdschlüsselkonzepte zugesichert ist. Falls einseitige oder beidseitige äußere Verbundoperationen berücksichtigt werden müssen, ist auf das Konzept der Schachtelung von FLWOR-Ausdrücken zurückzugreifen. Äußere Verbundoperationen liefern auch dann einen Ergebniseintrag, wenn jeweils ein bzw. beide Verbundpartner keinen entsprechenden Eintrag finden und somit nicht in die Ergebnismenge mit übernommen werden würden.
Äußere Verbundoperationen sind aus Sicht der Anwendung immer notwendig, wenn ein Datenbestand durch weitere – möglicherweise optional existierende – Informationen angereichert werden soll. Ein einseitig äußerer Verbund zwischen einer Personalstammdatei und einer Telefonliste liefert zu jedem Personaleintrag die entsprechende Telefonnummer; entgegen der Semantik des inneren Verbunds wird ein Eintrag auch dann in das Ergebnis übernommen, wenn einer Person keine Telefonnummer zugewiesen ist.

Als weitere Bemerkung sei angebracht, dass die im relationalen Verbund übliche Projektion der "doppelten Spalten" bei einem natürlichen Verbund im Kontext von XQuery konstruktiv gelöst wird, in dem das Ergebnis durch eine nahezu beliebig freie Struktur des Ergebnisausdrucks formuliert werden kann und somit die Eliminierung gleicher Werte der return-Klausel obliegt. Des Weiteren sei an dieser Stelle angemerkt, dass die optimale Reihenfolge der for-Klauseln und das "Hineinziehen" von Verbundprädikaten aus dem FLWOR-Ausdruck in die Pfadausdrücke Gegenstand der Optimierung eines XQuery-Prozessors ist. Dem Benutzer obliegt es, in deskriptiver Weise das Endergebnis zu spezifizieren.

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>