W jaki sposób można zamodelować relacje pomiędzy tabelami bazy danych używając XML i XML Schema?
W jaki sposób można zamodelować relacje pomiędzy tabelami bazy danych używając XML i XML Schema?
Do zamodelowania asocjacji pomiędzy dwoma tabelami można użyć typów xsd:ID oraz xsd:IDREF.
Załóżmy, że mamy dwie tabele opisujące odpowiednio państwa i miasta. Można je przedstawić w XML następująco:
<?xml version="1.0" encoding="UTF-8"?> <baza-danych xsi:noNamespaceSchemaLocation="baza.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <panstwa> <panstwo id="PL">Polska</panstwo> <panstwo id="DE">Niemcy</panstwo> <panstwo id="FR">Francja</panstwo> </panstwa> <miasta> <miasto panstwo="PL">Warszawa</miasto> <miasto panstwo="PL">Poznań</miasto> <miasto panstwo="DE">Berlin</miasto> <miasto panstwo="DE">Monachium</miasto> <miasto panstwo="FR">Paryż</miasto> </miasta> </baza-danych>
W tabeli państw atrybut id pełni rolę klucza głównego, zaś w tabeli miast atrybut panstwo przechowuje klucz obcy (musi odnosić się do jakiejś wartości id państwa).
Schemat dla powyższego dokumentu XML może wyglądać następująco:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="baza-danych" type="baza-danych-typ" /> <xsd:complexType name="baza-danych-typ"> <xsd:sequence> <xsd:element name="panstwa" type="panstwa-typ" /> <xsd:element name="miasta" type="miasta-typ" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="panstwa-typ"> <xsd:sequence> <xsd:element name="panstwo" type="panstwo-typ" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="panstwo-typ"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="id" type="xsd:ID" use="required" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:complexType name="miasta-typ"> <xsd:sequence> <xsd:element name="miasto" type="miasto-typ" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="miasto-typ"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="panstwo" type="xsd:IDREF" use="required" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:schema>