17.1 Foreign Keys
Foreign Keys werden in SQL im Allgemeinen nicht verwendet, um Tabellen zu
verknüpfen (JOIN), sondern um sicherzustellen, daß die Integrität der
verschiedenen einiger Spalten von Tabellen sichergestellt ist. Beispielsweise kann man
hiermit erzwingen, daß wenn ein Datensatz verändert wird, in einer anderen
Tabelle entsprechende Veränderungen automatisch vorgenommen werden. Es gibt
aber auch viele Gründe, diese möglichst wenig einzusetzen:
- Foreign Keys verkomplizieren das allgemeine Datenbankhandling. Die Einfachheit von MySQL, z.B. im
Intranet eine Datenbank zu pflegen (SHOP), und täglich in das Internet zu kopieren, wäre
dahin.
- Die Geschwindigkeit von INSERT und UPDATE Stements wäre ebenfalls
gefährdet, da die Datenbank nach einem INSERT oder UPDATE alle foreign keys
einzeln duchlaufen muß. Im Allgemeinen werden ohnehin INSERTS stets in den
richtigen Tabellen (mehrere INSERT/UPDATES in mehreren Tabellen gleichzeitig)
durchgeführt. Also keine Panik, man kann diese Konstrukte durch
Workarounds in den Griff bekommen. Abfragen und Verknüpfungen über mehrere Tabellen sind
aber stets erlaubt, damit keine Mißverständnisse aufkommen.
- Backups und Restores werden fast unmöglich gemacht. Der einfache
Vorgang, eine einzelne Tabelle bei Mangel an Datenintegrität
(Festplattenfehler) einfach zu löschen, und dann von der Backup-Platte oder
dem Tape zu restaurieren, funktioniert bei Datenbanken mit foreign keys
nicht mehr. Es muß in diesen Fällen dann immer die gesamte Datenbank
restauriert werden, und es muß eine bestimmte Reihenfolge peinlich genau
eingehalten werden. Bei großen Datenbanken, die über mehrere Millionen
Einträge verfügen, ist dann mit längeren Ausfällen zu rechnen. Beim Einsatz
im Internet muß die Datenbank jedoch den "mission critical" Anforderungen
entsprechen.
- Bei foreign keys passiert es recht häufig, daß zirkuläre (rekursive)
Bezüge entstehen, die zwar erlaubt sind, jedoch verhindern, daß man eine
Tabelle so einfach mit einem CREATE Befehl erzeugen kann. Hierfür sind oft
sehr komplexe Statements notwendig.
- Und nun einge gute Nachricht: MySQL wird in absehbarer Zeit
um foreign keys erweitert, im SQL Parser sind diese schon enthalten.