Fremdschlüssel in den Virtabs
Mit Fremdschlüsselverbindungen (Foreignkeys) werden einzelne
Tabellen zu einem zusammenhängen Beziehungsnetzwerk
verknüpft. (Auf umfangreiche Literatur dazu sei hier pauschal
hingewiesen :-)
Während für die Virtab-View ein Fremdschlüssel einfach eine
WHERE-Bedingung in der Form “mastertable.primarykey =
detailtable.foreignkey” generiert, wird die gesamte Logik der
Lokalisierung in den Virtab-Prozeduren von den Attributen der
Fremdschlüssel beeinflusst.
Normalerweise kann es immer mehrere Detaildatensätze für
einen Masterdatensatz geben, weil mehrere
Detail-Records denselben Wert in “detail.foreignkey” haben
können. Daher ist die normale Form der LINK-Anweisung “LINK ... 1:N ... “.
Der 1:1 Schlüsselverweis
Eine Sonderform der Fremdschlüsselverbindung stellt die 1:1 Verbindung dar.
LINK mastertable 1:1 detailtable BY foreignkey ;
Die Semantik ist die der 1:n-Verbindung mit der
Zusatzbedingung, dass es für jeden Eintrag in der
Mastertabelle nur genau einen Eintrag in der Detailtabelle
geben darf. Der Fremdschlüssel in der Detailtabelle muss also
auch eindeutig sein. Die Anzahl von Detail- und
Master-Datensätzen ist daher exakt gleich sein.
Es ergeben sich folgende Funktionserweiterungen:
-
beim Einfügen in eine Virtab, in der Master- und Detailtabelle vorkommen, besteht ein Fehler, wenn vor dem Einfügen nur ein Eintrag in der Master-, aber noch nicht in der Detailtabelle existiert. Dies wird nicht geprüft, da die Fehlerbedingung nach dem Einfügen beseitigt ist.
-
Das Anlegen von mehreren Detaileinträgen pro Mastereintrag wird nicht durch die INSERT-Prozedur abgefangen, da sich dies auf einfache Weise mittels Datenbank-Constraints verhindern lässt: Für den Foreignkey muss ein UNIQUE-Index angelegt werden (bei einer 1:n-Beziehung ist der FK-Index gerade nicht UNIQUE).
-
Die DELETE-Prozedur löscht den Eintrag in der Detailtabelle nur, wenn sich auch der Eintrag in der Mastertabelle löschen lässt (das Löschen eines Mastereintrags bei nicht löschbarem Detaileintrag wird schon durch die normale Abhängigkeitsanalyse beim Löschen verhindert).
-
Da bei einer 1:1-Verbindung Einträge in der Master- und der Detailtabelle nur gleichzeitig neu angelegt oder gleichzeitig gelöscht werden dürfen, ist es nicht erlaubt, nur eine der beiden Tabellen NOCHANGE zu setzen.
Detailtabellen, die 1:1 mit einer Mastertabelle verbunden
sind, sind immer lokalisierbar, wenn der Master lokalisierbar
ist, denn der detailtable.foreignkey ist so eindeutig wie ein
primarykey. Zur Lokalisation solcher Detailtabellen verwendet
ER2SQL also den gefundenen Primärschlüsselwert der
Master-Tabelle, wenn keine Schlüsselspalten in der Virtab für
detailtable angegeben sind.
Der 1:0/1 Schlüsselverweis.
Der 1:0/1 Schlüsselverweis ist eine Variante des 1:1
Verweises. Jeder Detaildatensatz zeigt auf einem anderen
Masterdatensatz, es darf allerdings Masterdatensätze ohne
Detaildatensätze geben. Es kann also mehr Master- als
Detaildatensätze geben.
In den Virtabs bedeutet das, dass die Einschränkungen 3 und 4 entfallen. Die Lokalisierbarkiet über den Master bleibt aber erhalten.
Auswahl von 1:n-Verbindungen mittels FOREIGNKEY
Während eine Virtab abgearbeitet wird, werden Zeilen in
Mastertabellen über die Fremdschlüssel der Detailtabellen
ausgewählt. ER2SQL versucht dabei, die angegebenen Tabellen
einer Virtab anhand ihrer 1:n-Verbindungen miteinander zu
verknüpfen. In manchen Fällen ist es aber möglich, dass unter
den Tabellen einer Virtab mehrere Fremdschlüssel auf eine
bestimmte Tabelle verweisen. Dann muss mittels der
FOREIGNKEY-Anweisung angegeben werden, welche dieser
Fremdschlüssel in der Virtab ausgewertet werden sollen.
Dies ist der Regelfall, wenn mit Mehrfach-Queries gearbeitet wird. Im dortigen Beispiel wird mit den Deklarationen
TABLE employee QUERY q_employee, q_main
FOREIGNKEY customer.salesperson_id ...
COLUMN emp_last_name = employee.last_name ...
angegeben, dass der Eintrag der Virtab-Spalte emp_last_name mit einem Eintrag in customer verknüpft werden soll, und nicht etwa mit dem Eintrag des Chefs (per employee.manager_id).
Aus Sicherheitsgründen muss die FOREIGNKEY-Angabe immer dann
gemacht werden, wenn mehr als eine Schlüsselverknüpfung
zwischen zwei Tabellen in einer Virtab möglich ist, d.h. auch
dann, wenn alle vorhandenen Referenzen in der Virtab benutzt
werden sollen. Wird eine mögliche Referenz in einer
FOREIGNKEY-Anweisung nicht erwähnt, so verhält sich die
Virtab so, als bestünde die Schlüsselverknüpfung nicht.
Mit NOFOREIGNKEY wird definiert, dass keiner der möglichen Detailschlüssel verwendet werden soll.
|