Advanced SQL - Einstiegstutorial 2 - Fazit
1. Die Abschnitte
- Vorwort
- Ein paar Hinweise zum Frontend
- Mitgliedstabellen füllen
- Angebotstabellen füllen
- Referentielle Integrität
- Fazit
2. Zusammenfassung
Kommen wir zuerst zu den Vor- und Nachteilen von Fremdschlüsseln. Denn eure Entscheidung hängt von etlichen Faktoren ab, die in so einem Fall konkrete Auswirkungen haben.
Die Nachteile von InnoDb
- Höherer Bedarf an Arbeits- und Festplattenspeicher.
- Langsamere Verarbeitung von SQL-Statements.
- Es gibt keine Volltextsuche.
- Man muss bei der Modellierung viel sorgfältiger vorgehen. Dazu gleich mehr.
- Es ist schwerer, einen alten Stand der Datenbank wieder herzustellen.
Allerdings hängt das von der Datenbank und deren Aufbau selber ab. Bei diesem pisseligen Beispiel werdet ihr in beiden Fällen kaum
Unterschiede feststellen können. Nach meinen persönlichen Erfahrungen und den Ergebnissen diverser Internetrecherchen ist der Speicherbedarf
je nach Projekt um den Faktor zwei bis fünf Mal größer als bei Tabellen vom Typ MyIsam
. Auch die Performance ist deutlich
geringer.
Die Vorteile von InnoDb
- Die Referentielle Integrität bleibt erhalten.
- Man kann mit Transaktionen arbeiten.
Die Wirkung dieser beiden Features erleichtert einem die Arbeit ganz erheblich, da man sich um bestimmte Dinge einfach nicht mehr kümmern
muss. Denn bei Tabellen vom Typ MyIsam
muss man sich selbst darum kümmern. Und das ist je nach Datenbankstruktur mit ziemlich
viel Arbeit verbunden.
3. Referenzaktionen
Konzentrieren wir uns zunächst auf das Einfache. Wenn man sich entschlossen hat, bei den wichtigen Tabellen mit Fremdschlüsseln zu arbeiten,
so sollte man bei denen immer ein ON UPDATE CASCADE
einsetzen. Denn dann kann man ruhiger schlafen, weil man sich um bestimmte
Dinge keine Sorgen mehr machen muss.
ON UPDATE
Tja, das ist eine echte Gewissensfrage und treibt Programmierer immer wieder in den Wahnsinn. Setze ich da nun da ein CASCADE
,
ein SET NULL
oder ein NO ACTION
/RESTRICT
? Leider kann man diese Frage nicht allgemein gültig
beantworten.
RESTRICT
Das sollte man immer dann setzen, wenn man in Elterntabellen etwas weghauen möchte, das aber zwingend für die Logik unserer
Applikation benötigt wird. Darum ist die Vorgehensweise in der Tabelle charakter
auch nur konsequent, denn wenn da eine Relation
nicht mehr vorhanden ist, so kann das Mitglied nicht mehr spielen. Das gilt auch für den Status in der Tabelle mitglied
, den
wir später unbedingt für die Rechtevergabe benötigen.
SET NULL
... haben wir nur einmal benutzt und zwar bei der Spalte gilde
in der Tabelle mitglied
. Ist ja auch irgendwie
logisch. Wenn der große Obermotz einer Gilde keinen Bock mehr hat und die löscht, so können die übrigen Mitglieder sich eine neue suchen
und mit ihrem Charakter weiterspielen.
CASCADE
Damit arbeiten wir in allen Angebotstabellen bei den Verweisen auf die Mitglieder. Ist ja auch klar, wenn da einer nicht mehr mitspielt, so sind die damit verbunden Angebote hinfällig.