Virtabs: Fremdschlüssel, LINK, FOREIGNKEY

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:

  1. 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.
  2. 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).
  3. 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).
  4. 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.

     

[Konzepte] [Virtab-Prozeduren] [LINK, FOREIGNKEY] [QUERY: Mehrfachzugriffe] [USES und Verschmelzen] [Schreibschutz, -zwang] [Daten-Teilmengen] [Synthetische Spalten] [User-SQL]