Relationale Datenbank-Strukturen DBMS-neutral repräsentieren
Datenbank-Strukturen
In diesem Beitrag sollen unter dem Begriff Datenbank-Strukturen folgende Elemente zusammengefaßt werden:
- Tabellen-Definitionen
- Spaltentypen
- Angaben darüber, ob in einer Spalte
null-Werte erlaubt sind
- Feldgrößen
- Indices
- Schlüssel
- Fremdschlüsselbeziehungen
- Definition eines Voreinstellungswertes für Spalten
- Ändern des Referenzwertes einer Fremdschlüsselbeziehung
Wir benutzten zur DBMS-neutralen Darstellung das Werkzeug XML-Schema.
SQL-Datendefinition
Als Beispiel für die Darstellung von SQL-Datenstrukturen (oder Tabellendefinitionen) sollen die beiden im Folgenden
definierten Tabellen dienen, die durch eine Fremdschlüsselbeziehung verknüpft sind:
create table A(
cola integer primary key,
colb varchar(62) DEFAULT 'text',
colc integer unique,
cold decimal not null
);
create table B(
cola integer primary key,
colb integer references a(cola) ON DELETE SET NULL ON UPDATE CASCADE
);
Tabellen-Definitionen
Tabellendefinitionen werden als Elemente mit komplexen Typen deklariert:
<xs:element minOccurs="0" name="a" type="aTable"/>
Eine Tabelle enthält eine Anzahl Zeilen:
<xs:complexType name="aTable">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="a.row" type="arowType"/>
</xs:sequence>
</xs:complexType>
Spaltentypen
Spalten werden ebenfalls als Elemente in dem Element, das eine Zeile definiert, dargestellt.
Spaltentypen werden auf die einfachen Typen abgebildet, die bereits Teil von XMLSchema sind. Spaltennamen werden ebenso wie die Typfestlegungen über Attribute
des jeweiligen Elements realisiert. Im Beispiel könnte das so aussehen:
<xs:element maxOccurs="1" minOccurs="1" name="cola" type="xs:int"/>
Angaben darüber, ob in einer Spalte null-Werte erlaubt sind
Die Festlegung, ob in einer Spalte null-Werte erlaubt sind, wird über das Attribut minOccurs
festgelegt. Ein Wert von 0 bedeutet, daß null-Werte erlaubt sind:
<xs:element maxOccurs="1" minOccurs="0" name="colc" type="xs:int"/>
Im Gegensatz dazu die Definition einer Spalte, die keine null-Werte erlaubt:
<xs:element maxOccurs="1" minOccurs="1" name="cold" type="xs:decimal"/>
Feldgrößen
Die Festlegung der Länge eines Feldes kann über die Verfeinerung eingebauter Typen realisiert werden. So würde Spalte
colb in Tabelle A durch folgende Definition repräsentiert:
<xs:element maxOccurs="1" minOccurs="0" name="colb" type="string62Type"/>
Der Typ selbst wird durch folgende Definition festgelegt:
<xs:simpleType name="string62Type">
<xs:restriction base="xs:string">
<xs:maxLength value="62"/>
</xs:restriction>
</xs:simpleType>
Indices
Indices werden durch einen Constraint beschrieben, der in unserem Beispiel für die Spalte
colb in Tabelle A wie folgt definiert wird:
<xs:unique name="acolcIndex">
<xs:selector xpath="./a/a.row"/>
<xs:field xpath="colc"/>
</xs:unique>
Schlüssel
Schlüssel werden durch einen Constraint beschrieben, der in unserem Beispiel für die Spalte
cola in Tabelle A wie folgt definiert wird:
<xs:key name="acolaKey">
<xs:selector xpath="./a/a.row"/>
<xs:field xpath="cola"/>
</xs:key>
Fremdschlüsselbeziehungen
Fremdschlüsselbeziehungen werden durch einen Constraint beschrieben, der in unserem Beispiel für die Spalte
colb in Tabelle B wie folgt definiert wird:
<xs:keyref name="b.colb" refer="acolaKey">
<xs:selector xpath="./b/b.row"/>
<xs:field xpath="colb"/>
</xs:keyref>
Definition eines Voreinstellungswertes für Spalten
Die Definition eines Voreinstellungswertes für Spalten kann nicht über Schema-Strukturelemente erfolgen.
Wir setzen daher sogenannte Annotationen ein. Für die Spalte
colb in Tabelle Awürde dies folgende Definition ergeben:
<xs:element maxOccurs="1" minOccurs="0" name="colb" type="string62Type">
<xs:annotation>
<xs:appinfo source="sQLshell:DEFAULT_VALUE">text</xs:appinfo>
</xs:annotation>
</xs:element>
Ändern des Referenzwertes einer Fremdschlüsselbeziehung
Die Definition des Verhaltens bei Modifikation des Schlüssels in einer Fremdschlüsselbeziehung (Löschen, Ändern)
kann nicht über Schema-Strukturelemente erfolgen.
Wir setzen daher so genannte Annotationen ein. Für die Spalte
colb in Tabelle B würde dies folgende Definition der Fremdschlüsselbeziehung ergeben:
<xs:keyref name="b.colb" refer="acolaKey">
<xs:selector xpath="./b/b.row"/>
<xs:field xpath="colb"/>
<xs:annotation>
<xs:appinfo source="sQLshell:FOREIGN_KEY/UPDATE_RULE">CASCADE</xs:appinfo>
</xs:annotation>
<xs:annotation>
<xs:appinfo source="sQLshell:FOREIGN_KEY/DELETE_RULE">SET_NULL</xs:appinfo>
</xs:annotation>
</xs:keyref>
 <jkey@netsys-it.de>
© 2004 NetSys.IT GbR
|