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

Konsistenzbedingungen

Neben Bedingungen an einzelne Werte, wie sie durch Angabe von Datentyp oder Facetten möglich sind, gibt es auch einige Möglichkeiten, Beziehungen zwischen verschiedenen Elementen oder Attributen in XML Schema auszudrücken. Die Eindeutigkeit eines Attributwertes oder Elementwertes (oder einer Kombination aus diesen) innerhalb eines Dokumentbereiches kann durch die Angabe unique verlangt werden. Im folgenden Beispiel wird festgelegt, dass ein Artikel nur einmal innerhalb eines Anästhesie-Elements auftreten darf (weil Mehrfachverwendung durch das Menge-Attribut abgebildet werden soll):

<xs:element name="Anästhesie">
<xs:complexType>
<xs:sequence>
<xs:element name="verbrauchter_Artikel"
type="verbrauchter_Artikel_T"/>
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="Artikel">
<xs:selector xpath="verbrauchter_Artikel"/>
<xs:field xpath="@Artikel_id"/>
</xs:unique>
</xs:element>

Anästhesie gibt hier den Bereich an, innerhalb dessen Eindeutigkeit verlangt wird. Ein Patient kann mehrere Anästhesien hinter sich haben. Dann ist es legal, wenn in diesen jeweils derselbe Artikel verbraucht wurde. Der selector kennzeichnet das Objekt, das eindeutig sein soll (hier verbrauchter_Artikel), und das field nennt die eindeutigen Kennzeichen (hier das Attribut Artikel_id; es könnten aber auch mehrere Attribute oder Nachkommenknoten genannt werden). Daraus ergibt sich, dass der selector normalerweise mehrere Knoten identifiziert, während mit jedem field jeweils nur höchstens ein Knoten relativ zu diesen ausgewählt wird. Die Konsistenzbedingung selbst trägt den Namen Artikel.

Bei Verwendung von unique ist es durchaus erlaubt, dass der identifizierende Wert nicht vorhanden ist. Will man die Existenz des Wertes erzwingen (was im Beispiel sinnvoll ist), muss man stattdessen key verwenden:

<xs:element name="Anästhesie">
<xs:complexType>
<xs:sequence>
<xs:element ref="verbrauchter_Artikel"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="Artikelkey">
<xs:selector xpath="verbrauchter_Artikel"/>
<xs:field xpath="@Artikel_id"/>
</xs:key>
</xs:element>

Auf einen Wert, der mit unique oder key eindeutig definiert ist, kann mittels keyref verwiesen werden, es kann also gefordert werden, dass an der gekennzeichneten Stelle nur ein Wert vorkommt, der auch als eindeutiger Wert auftritt (referenzielle Integrität). Hierzu wird der Name der Konsistenzbedingung verwendet. Folgender Ausschnitt zeigt, dass zum einen innerhalb einer Klinik die Stationsnamen eindeutig sein müssen, dass aber auch die Stationen, denen Ärzte zugeordnet sind, tatsächlich existieren müssen:

<xs:element name="Klinik">
<xs:complexType>
<xs:sequence>
...
<xs:element ref="Stationen"/>
...
</xs:sequence>
</xs:complexType>
<xs:key name="Station_pk">
<xs:selector xpath=".//Station"/>
<xs:field xpath="Name"/>
</xs:key>
<xs:keyref name="Arzt_Station_fk" refer="Station_pk">
<xs:selector xpath=".//Arzt"/>
<xs:field xpath="@Station"/>
</xs:keyref>
</xs:element>

Sowohl die Eindeutigkeitsbedingung als auch die referenzielle Integrität beschränken sich auf ein Dokument. Dokumentübergreifende Konsistenzbedingungen kann man mit XML Schema nicht modellieren.

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

<< zurückvor >>