entwicklung
In vielen Multi-Tier-Applikationen heutzutage wird die Datenbank als reiner Datenbehälter verwendet. Auf die Frage "Wer sichert die Konsistenz der Daten zwischen diesen zwei Tabellen?" kommt meistens die Antwort "Dies wird im Applikationsserver sichergestellt!". Tabellen werden beispielsweise über objekt-relationale Mappings angebunden und die gesamte Logik außerhalb der Datenbank implementiert.

Aus unserer Sicht birgt diese Vorgehensweise mindestens zwei Gefahren:
  • Einerseits kann keine Applikation Datenkonsistenz und -integrität so gut sicherstellen wie eine Datenbank, die genau zu diesem Zweck entworfen wurde. Spätestens wenn man Daten über Loader oder Datenbank-Entwicklungstools einfügt oder ändert, wird auch der beste Applikationsserver umgangen.

  • Andererseits bietet eine Datenbank optimierte Datenzugriffstechniken, die Datenspeicherung, Dateninhalte und -zusammenhänge berücksichtigen -- Informationen, die außerhalb der Datenbank nicht bekannt sind. Ein - optimierter - Join kann nirgends schneller laufen als in einer Datenbank.

Eine Datenbank kann durchaus mehr als Extents verwalten. Angefangen bei der Datenkonsistenz, über Performance Optimierung, bis hin zur Einbettung von prozeduralen Objekten kann eine Datenbank mächtige Instrumente anbieten. Deswegen ist unser Ansatz, die Features der Datenbank - einschließlich integrierter Entwicklungsumgebungen - optimal auszunutzen. Konkret bedeutet dies unter anderem:
  • Diejenigen Teile Programmlogik in der Datenbank zu implementieren, die dort effizienter und sicherer laufen.

  • Normalisierte Datenstrukturen zu verwenden. Denormalisierte Tabellen sollten nur bewußt und gezielt, z.B. in den oberen Schichten eines Data Warehouse zwecks Erhöhung der Performance eingesetzt werden.

  • Constraints sind mächtige Instrumente zur Sicherung der Datenintegrität und -konsistenz, die von der Datenbank sehr effizient überprüft werden. Daher sollten Constraints, einschließlich Relationen (Foreign Keys) benutzt werden.

  • Alle Objekttypen der Datenbank auszunutzen - Indizes, Views, Procedures, Triggers etc.

  • Aktives Performance Tuning zu betreiben. Kein - komplexeres - Statement sollte in Produktion gehen, bevor sein Execution Plan analysiert und für optimal befunden wurde; Statistiken sollten für alle Tabellen, Indizes und relevanten Spalten gesammelt werden etc.

  • Parallelität immer zu nutzen, wenn sie die Datenbank anbietet und es die Ressourcen erlauben - z.B. in Selects, Create Index Statements etc.

  • . . .