Du möchtest eine einfache Prüfung auf Eindeutigkeit. Dabei muss du beachten, dass die Definition dieser Einschränkung dort passiert, wo es gebraucht wird. D.h. der Ausgangspunkt ist das Element unterhalb dessen diese Prüfung stattfinden soll, also z.B.:
<xs:element name="Bestellung">
xs:complexType
...
</xs:complexType><xs:unique name="PersonID">
<xs:selector xpath="Person"/>
<xs:field xpath="@PersonID"/>
</xs:unique>
</xs:element>
Eigentlich möchte ich mit der Angabe von unique oder key sagen, dass die PersonID eindeutig sein soll, so dass man eindeutig sagen kann: Duffy Duck hat die PersonID 1 und nicht, dass plötzlich auch Daisy Duck die PersonID 1 hat.
Unter Bestellung soll nur eine Art Verbindung zur eigentlichen PersonID hergestellt werden -> also keyref (dachte ich jedenfalls). Dabei ist es egal, ob diese dort mehrmals auftritt. Eine Person kann ja auch mehrere Bestellungen auslösen.
Ein <xs:selector xpath=".//Person"/> in diesem Konstrukt würde dagegen bedeuteten, dass in Bestellungen jede Person, die über ihre PersonID identifiziert wird, eindeutig bestimmt sein sollte. D.h. es dürfen keine zwei Kunden mit derselben PersonID innerhalb von Bestellungen auftreten.
Achso, das ist damit gemeint. D.h. wenn ich die PersonID zwar mit key in Person angebe (oder sonstwo), diese in Bestellungen mit keyref referenziere, mache ich durch Angabe von .//Person diese eindeutig? D.h. es können nicht wie oben beschrieben 2 Personen die gleiche PersonID haben?
Das ist also die eine Sache. Damit hättest du die Eindeutigkeit von Person sichergestellt.
<xs:key name="PersonID">
<xs:selector xpath="Person"/>
<xs:field xpath="@PersonID"/>
</xs:key>
Dieser key zeigt auf das Attribut PersonID in Person, richtig?
Damit ist jetzt sichergestellt, dass jede Person einen eindeutigen Schlüssel PersonID hat?
<xs:keyref name="PersonID2" refer="PersonID">
<xs:selector xpath="Bestellungen/Bestellung/Person"/>
<xs:field xpath="@PersonID"/>
</xs:keyref>
Dieser keyref zeigt auf das Element Person in Bestellungen/Bestellung, richtig? D.h. es muss ein Element Person unter Bestellung existieren? Kann ein keyref auch auf ein Attribut zeigen oder ist mit dieser XPath-Angabe gleich beides gemeint?
Ich möchte doch nur wie in meinen Datenbanken sagen: Person hat einen eindeutigen Schlüssel PersonID, der in Bestellung als Fremdschlüssel auftaucht, um referenzieren zu können, wer die Bestellung denn überhaupt ausgelöst hat.
Gruß,
Kerstin