1 Warum Datenbanken Früher alles in Dateien -> Problem große Wechselwirkung zwischen Programmen (Code) und Daten. Änderungen der Datenstruktur verursachten Änderungen des Codes und umgekehrt. Datenbanksystem steht zwischen Programm und Daten. Programm kann nur über Datenbanksystem auf Daten lesend und schreibend zugreifen. Datenbanksystem besteht aus DB und DBMS. 2 Datenmodelle Datenmodellierung: Entwurf eines Datenbankschemas zur Verwaltung der Daten. Datenmodell: Damit werden alle in der DB abgebildeten Sachverhalte beschrieben. Konzeptionelle Datenmodelle Stellen problemnahe Modellierungskonzepte für die ersten Schritte des Datenbankentwurfs zur Verfügung und dienen zur Kommunikation zwischen Datenbankentwicklern und Endbenutzern. Physische Modelle Stellen maschinennahe Konzepte zur Verfügung und dienen zur Beschreibung der Organisation von Daten in Dateien, sowie zur Beschreibung von Zugriffsstrukturen, die ein rasches Einfügen, Suchen, Löschen und Ändern von Daten ermöglichen. Logische Datenmodelle Dienen der Überbrückung der Kluft zwischen den konzeptionellen und physischen Modellen, sie werden auch Implementierungsmodelle genannt. Schema: Eine konkrete Beschreibung der Daten eines Unternehmen mit den Mitteln eines bestimmten Datenmodells 2.1 Hierarchisches Modell Daten gemäß Zugriffspfad angeordnet. Vorteil: Sehr speichereffizient und schnell Nachteil: Für neue Abfrage (mit neuem Zugriffspfad) muss Struktur geändert werden -> unflexibel 2.2 Netzwerk Modell Datenelemente durch Pointer miteinander verbunden. Kopfelement verweist auf Detailelement usw. das letzte Detailelement verweist wieder auf Kopfelement (verkettete Liste). 2.3 Entity Relationship Modell Welt besteht aus Objekten und Beziehungen zwischen den Objekten. Objekte, Beziehungen, Attribute, Werte. 2.4 Relationales Modell ● Ergebnisse der mathematischen Theorie der Relationen in die Datenbankproblematik übertragen. ● Tabellarisches Konzept, in dem die Daten und Beziehungen verwaltet werden Eine Entität ist ein abgegrenzter Begriff der Realwelt, der modelliert werden soll. Es wird auf „schärfere“ Begriffe wie „Objekt“ oder „Objektart“ bewusst verzichtet, da auch abstrakte Begriffe modelliert werden müssen Ein Attribut ist eine einer Entität direkt zuordenbare Eigenschaft (Feld, Spalte). Tupel: Datensatz Domäne: Datentyp Entität moduliert durch Relation: Tabelle 2.5 Objektrelationale Datenbanken Objektrelationale Datenbanken vereinigen Eigenschaften von Relationalen Datenbanken mit Elementen der Objektorientierten Programmierung. Vererbung: Tabellen können aus anderen Tabellen abgeleitet werden und erben deren Attribute. Kapselung: „Gespeicherte Prozeduren“ sind untrennbar mit Datensätzen verbunden. 2.6 Objektorientierte Datenbanken Erweiterung objektorientierter Programmiersprachen 2.7 ISO Modell (3 Schichten) 2.7.1 Externe Schicht Struktur, die der Applikationsprogrammierer "sieht"; (Objekt~)Relationales Modell: Sichten, Gespeicherte Prozeduren(aber schlampiger weise auch: Tabellen & Beziehungen) 2.7.2 Konzeptionelle Schicht Struktur, die der Datenbankprogrammierer sieht bzw. entwirft: (Objekt~)Relationales Modell: Tabellen & Beziehungen. Beschreibt die logische Struktur der Daten einer Datenbank im konzeptionellen Schema. In diesem Schema werden die Daten und ihre Beziehungen zueinander mit den Mitteln der Datenmodellierung beschrieben. Weiters enthält das konzeptionelle Schema Integritätsbedingungen, Sicherheitsregeln und die Definition von Triggern. 2.7.3 Interne Schicht Dateiformat, für das sich DB-Systemprogrammierer entschieden haben: ISAM, VSAM, XML,...) Ist der physischen Speicherung am nächsten, entspricht ihr aber nicht ganz. Beschrieben wird die interne Ebene durch das interne Schema der Daten. Es enthält nicht nur Art und Aufbau der gespeicherten Datenstrukturen, sondern auch Informationen über Indizes. Diese Ebene stellt somit als Schnittstelle zur eigentlichen Datenbank die Abbildung von logischem in physikalischen Adressraum unter Zuhilfenahme von Betriebssystemfunktionen zur Verfügung. 3 Schlüssel ● Schlüsselkandidat: Als Schlüsselkandidaten werden alle Attribute bezeichnet, die die Eigenschaft der eindeutigen Tupelidentifizierung besitzen. ● Primärschlüssel: Ein beliebiger schlüsselkandidat (+ not null) Sekundärschlüssel: Habe zusammengesetzten Primärschlüssel, wenn Teil davon Fremdschlüssel - ist dieser sek. Schlüssel Fremdschlüssel: Ist eigentlich kein Schlüssel (in anderer Tabelle Schlüsselkandidat) ● ● 4 Beziehungen Eine Beziehung zwischen zwei Tabellen A und B bedeutet, dass zu einem Datensatz einer Tabelle A bestimmte Datensätze der Tabelle B gehören. In der Tabelle B wird dazu in einem Datensatz ein Verweis auf einen Datensatz in der Tabelle A gespeichert (Fremdschlüssel). Tabelle A nennen wir in diesem Zusammenhang die Kopf- oder Mastertabelle, Tabelle B ist in diesem Sinn eine Detailtabelle. Beziehungen werden implementiert, indem man in der Detailtabelle die Spalte(n) eines Schlüsselkandidaten einer anderen Tabelle aufnimmt (Fremdschlüssel). 4.1 Arten von Beziehungen Definition 1:n Beziehung: Jedem Datensatz in einer Kopftabelle (1-Tabelle) entsprechen 0 oder mehr Datensätze in der Detailtabelle (N-Tabelle). 1:n-Beziehungen werden dargestellt, indem in der n-Tabelle ein Schlüssel der Kopftabelle mit allen Feldern als sog. Fremdschlüssel aufgenommen wird. Definition 1:1 Beziehung: Jedem Datensatz in einer Kopftabelle entsprechen 0 oder ein Datensätze in der Detailtabelle. Definition: m:n Beziehung Jedem Datensatz in einer Tabelle A entsprechen 0 oder mehr Datensätze in einer Tabelle B und umgekehrt (d.h. jedem Datensatz in der Tabelle B entsprechen 0 oder mehr Datensätze in der Tabelle A) In einer Relationalen Datenbank erfordert die Darstellung einer m:n Beziehung eine Hilfstabelle, die eine Verbindung zwischen den beiden Tabellen herstellt. Die m:n Beziehung wird somit in 2 Beziehungen 1:m und 1:n aufgelöst. Die “neue” Tabelle bekommt automatisch die Schlüssel aus den beiden anderen Tabelle als Fremdschlüssel „vererbt“. Diese Fremdschlüssel können selbst Schlüssel für die neue Tabelle sein. Es ist aber auch möglich, dass die Kombination der Fremdschlüssel selbst zu schwach ist, um den Schlüssel zu bilden. Wichtig: Auch 1:1 hat Richtung (Kopf und Detailtabelle) 5 Subkategorien Die Kardinalität bestimmt, wie viele Datensätze in einer Detailtabelle zu jedem Kopfdatensatz vorhanden sein müssen, damit einerseits die definierte Integrität der Datenbank gewährt ist, andererseits die Übereinstimmung des Modells mit der Realwelt. Manchmal 1:n zu schwach, brauch genau 1:4 z.b. Auch 1:1 kann zu schwach sein, brauch genau 1:1 und nicht auch 1:0. Muss selbst ausprogrammiert werden. Subkategorien: Eine Kopftabelle steht zu mehreren Detailtabellen in 1:1 Beziehung. Allerdings gibt es zu jedem Kopfdatensatz in höchstens 1 Detailtabelle einen Detaildatensatz. Dabei unterscheiden wir: Vollständige Subkategorie: Kopftabelle hat in genau 1 Detailtabelle einen Detaildatensatz. Unvollständige Subkategorie: Kopftabelle hat in höchstens 1 Detailtabelle einen Detaildatensatz. Beispiel: KFZ Tabelle, Detailtabellen: LKW, Baumaschine -> Kann nur in einer einen Eintrag haben. Unvollständig wär z.b. wenn kein Eintrag bedeutet PKW. 6 Referenzielle Integrität Regelsystem in der Datenbank, welches die Gültigkeit von Beziehungen garantiert und Datensatzanomalien verhindert. Sie gewährleistet, dass... ● ...in ein Fremdschlüsselfeld einer Detailtabelle kein Wert eingegeben werden kann, der nicht im zugehörigen Schlüsselkandidaten der Mastertabelle vorkommt (weder durch Einfügen noch durch Ändern eines Datensatzes). ● ...aus einer Kopftabelle kein Wert des entsprechenden Schlüsselkandidaten „verschwinden“ kann (weder durch Löschen noch durch Ändern), wenn übereinstimmende Tupel in einer Detailtabelle vorhanden sind . Liegt also vor wenn alle Detailtabellen gültigen FK haben oder Null. 2. Punkt kann gelöst werden mit Kaskaden (Weitergaben) durch: ● Löschweitergabe: Wird ein Tupel aus einer Kopftabelle gelöscht, werden alle übereinstimmende Tupel der Detailtabelle gelöscht. ● Aktualisierungsweitergabe: Wird der Schlüsselwert einer Kopftabelle geändert, werden alle übereinstimmende Werte der Detailtabellen mit dem geänderten Wert aktualisiert. Gibt es keine deklarative referenzielle Integrität, kann das alles mit Triggern durchgesetzt werden. 7 Matchregeln Bei der Verknüpfung zweier Tabellen kann das DBMS grundsätzlich folgendermaßen vorgehen, sofern der Fremdschlüssel zusammengesetzt ist. Match Simple Enthält eine der Fremdschlüsselspalten NULL, wird die RI gar nicht überprüft: die Zeile wird aufgenommen Match Partial Alle Non-NULL-Inhalte in Fremdschlüsselspalten haben eine Entsprechung bei einem Schlüsselkandidaten in der referenzierten Tabelle (etwas problematisch) Match Full Alle Fremdschlüsselspalten haben eine Entsprechung bei einem Schlüsselkandidaten in der referenzierten Tabelle oder sind NULL. Match-Regeln steuern also, ob und wie das Datenbanksystem Manipulationen an Detaildatensätzen als Bruch der RI interporetiert oder nicht. 8 Integritätsarten ● Domänenintegrität ● Entitätenintegrität ● Prozuderale Integrität ● Referenzielle Integrität 9 Anomalien Unnormalisierte Relationen führen zu Problemen: ● Redundanz ● Update-Anomalien Redundanz steht in direktem Zusammenhang mit den Update-Anomalien: Änderungsaufwand Änderung eines Eintrages muss an mehreren Datensätzen durchgeführt werden Inkonsistente Attributwerte verschiedene Werte sind für den 'selben' Eintrag möglich Löschen mit Informationsverlust Das Löschen einer Bestellung kann dann zu einem (unerwünschten) Informationsverlust führen, wenn danach das bestellte Teil nicht mehr in einem Tupel der Relation existiert. Es gibt dann zu diesem Teil keine Teilebeschreibung mehr. Unvollständiges Einfügen Wenn der Primärschlüssel eine Attributkombination ist, müssen für jedes einzufügende Tupel alle Attribute des Schlüssels "reale" Werte (keine Nullwerte!) sein. In der geänderten Relation kann man keine Datensätze einfügen, zu der nicht mindestens eine Bestellung vorliegt. (Wie kann man Teile bestellen, die nicht in der Relation existieren?) 10 Normalformen Zweck: ● Verhinderung von “Anomalien” ● Gewährleistung jeder Erweiterbarkeit ● Performance verbessern ● Eliminierung von sog. Funktionalen Abhängigkeiten bedeutet auch die Eliminierung von Redundanzen. 10.1 1. Normalform Eine Relation befindet sich in der 1. Normalform, wenn alle Felder atomare (nicht sinnvoll weiter aufteilbare) Werte enthalten und keine Wiederholungsgruppen (z.b. Telefonnummer öfters) vorkommen. 10.2 2. Normalform Eine Relation ist in der 2. Normalform, wenn sie in der 1NF ist und jedes Nicht-Schlüssel-Attribut vom Gesamtschlüssel voll funktional abhängig ist (also nicht von Teilen des Schlüssels). Die Zweite Normalform kann also nur verletzt werden, wenn der Schlüssel aus mehreren Feldern besteht! funktional abhängig: ein Attribut (Feld) B ist von einem anderen Attribut A funktional abhängig, wenn zu jedem Wert von A genau ein Wert von B gehört. (funktional abhängig wie bei einer Funktion i.d. Mathematik) Beispiel: Attribut PLZ & Attribut Ort Der Ort ist von der Postleitzahl funktional abhängig - man kann den Ort der PLZ 1090 angeben: Wien Die Postleitzahl ist vom Ort nicht funktional abhängig - Wien hat viele Postleitzahlen, man kann nicht "die Postleitzahl" von Wien angeben 10.3 3. Normalform Eine Relation ist in der 3. Normalform, wenn sie in der 2NF ist und keine Nicht-SchlüsselAttribute voneinander funktional abhängig sind. 10.4 Boyce Codd Normalform Eine Relation befindet sich in Boyce Codd Normalform (BCNF), wenn sie in der 3NF ist und jede Determinante Schlüsselkandidat ist. Verhindert das beim Einfügen eines künstlichen Schlüssels die NF verletzt wäre. 11 Transaktion Eine Transaktion ist eine Folge von (Datenbank)operationen, die als eine logische Einheit ausgeführt werden. Transaktionen fassen mehrere Operationen zu einer Arbeitseinheit zusammen Sie werden "ganz oder gar nicht" ausgeführt und werden vom Programmierer festgelegt. Paradebeispiel: Geldtransaktion 11.1 Eigenschaften Atomic (Unteilbar) Eine Transaktion wird ganz oder gar nicht ausgeführt, sie ist "unteilbar" Consistent (Konsistent) Wenn Daten am Anfang der Transaktion konsistent (widerspruchsfrei) sind, muss das DBMS sicherstellen, dass sie es auch am Ende sind. Isolated (Isolierbar) Parallel laufende Transaktionen dürfen nicht auf dieselben Ressourcen greifen können. Anm.: Das entspräche der ISO-Isolationsstufe "Serialisable", aus Performance-Gründen muss man tw. andere Isolationsstufen zulassen (siehe Isolationsstufen). Durable (Dauerhaft) Wenn ein DBMS ein Commit fehlerfrei ausgeführt hat, muss sich der Programmierer darauf verlassen können, dass die Daten verfügbar sind, egal, was mit dem System passiert (Crash, Blue Screen, Kernel Panic, Stromausfall,...). 11.2 Codierung ● begin transaction ● commit 11.3 Rollback Das Herstellen des Zustandes vor Beginn der Transaktion wird als „Rollback“ („Zurückrollen“) bezeichnet. Kann man auch manuell veranlassen (rollback). 11.4 Implementierung Das Transaktionsprotokoll ist eine fortlaufende Aufzeichnung aller Befehle, die zu Änderungen an den Datenbeständen führen: ● mit welcher Transaktion wurde die jeweilige Änderung durchgeführt ● Beginn und Ende der Transaktion ● Änderungen an den Daten selbst Mit Hilfe des Transaktionsprotokolls kann das DBMS Transaktionen wiederherstellen, fertig stellen oder zurück rollen. Das Transaktionsprotokoll ist ein sog. „Write-Ahead-Log“, d.h. der Eintrag der Information über eine Änderung wird noch vor der Durchführung der Änderung selbst vorgenommen. Beim Abarbeiten nachher werden sie im Log „abgehakt“. Wenn ein Fehler passiert (Stromausfall, Absturz der DB-Software, Absturz des OS o.ä.) wird das DBMS irgendwann wieder gestartet und analysiert als 1. das Transaktionsprotokoll. 3 Möglichkeiten: ● Eine Transaktion ist von Begin Tran bis Commit Tran im Protokoll eingetragen und alle Befehle sind abgehakt: gar nichts ist zu tun ("inaktiver Teil" des Logs) ● Es befinden sich ein Begin Tran, einige abgehakte Befehle und einige nicht abgehakte Befehle, aber kein Commit tran im Log: der Fehler trat also auf, während die Transaktion noch ins Log eingetragen wurde: das DBMS rollt die Transaktion zurück ("Rollback") ● Es befinden sich ein Begin Tran, einige abgehakte Befehle, einige nicht abgehakte Befehle und ein nicht abgehaktes Commit Tran im Log: der Fehler trat auf, nachdem die Transaktion eingetragen wurde aber noch während der Abarbeitung vor Fertigstellung: Die Transaktion wird fertiggestellt ("vorgerollt", "Roll Forward") 11.5 Verschachtelte Transaktionen Commit: Wirkt nur auf innerste. Rollback: Wirkt bis zur äußersten. 11.6 Explizit – Implizit 12 ● Im expliziten Transaktionsmodus ist jedes Statement, das ohne besondere Maßnahmen (BEGIN TRAN & COMMIT) durchgeführt wird, seine eigene Transaktion. ● Im Gegensatz dazu kann das DBMS nach jedem COMMIT sofort eine neue Transaktion beginnen: „impliziter Transaktionsmodus“ Parallelität Wenn mehrere Transaktionen parallel laufen, die auf die selben Ressourcen (Tabellen[teile]) zugreifen, kann es im Fehlerfall Probleme geben. Die Concurreny Control - Einheit eines DBMS ermöglicht mehreren Benutzern, eine DB gemeinsam zur selben Zeit zu benutzen, ohne ihre Konsistenz zu gefährden. Das traditionell verwendete Korrektheitskriterium ist dabei die „Serialisierbarkeit“ (besagt, dass das Ergebnis von parallel ausgeführten Transaktionen dem Ergebnis der hintereinander ausgeführten Transaktionen entspricht. Um die Serialisierbarkeit von Transaktionen zu gewährleisten, verwenden DBMSe ein Sperrverfahren. Benützt man aber „niedrigere“ Isolationsstufen, können bestimmte Parallelitätsfehler auftreten: Dirty Read: Wird im vorigen Beispiel die Transaktion A zurückgerollt, nachdem Transaktion B bereits den Kontostand von Konto A ausgelesen hat, kommt es zu inkonsistenten Daten. Anm.: Beim "Zurückrollen" werden nicht die Befehle "verkehrt herum" abgearbeitet, sondern es wird einfach der Zustand wiederhergestellt, der vor Beginn der Befehlsausführung bestanden hatte. Non Repeatable Read: Eine Transaktion liest Daten 2x, wobei die Daten zwischen dem 1. und 2. Mal von einer anderen Transaktion verändert (und committed) wurden -> Die Transaktion liest 2x unterschiedliche Daten, obwohl derselbe Datensatz gelesen wird. Phantom Read: Eine Transaktion wiederholt eine Suchabfrage, wobei beim 2. Mal eine andere Anzahl an Datensätzen zurückgegeben wird als beim ersten Mal. Datensätze können bei der 2. Abfrage "aufgetaucht" und/oder verschwunden" sein (sog. "Phantom Records") weil eine parallel laufende Einfüge- oder Löschabfrage die Ergebnismenge zwischendurch verändert hat. Achten Sie bei der Auswahl eines Datenbanksystems, dass es außer "Serializable" wenigstens "Read Committed" oder "Repeatable Read" unterstützt. Befehl: SET TRANSACTION ISOLATION LEVEL <LEVEL> Im allgemeinen liefert "Read Committed" einen guten Kompromiss zwischen Parallelisierbarkeit (Perfomance) und Stabilität. In Einzelfällen braucht der Programmierer eine höhere Isolationsstufe. 13 Sperren Die unterschiedlichen Isolationsstufen werden implementiert durch unterschiedliches Sperrverhalten ("Locking") der DB. 14 ● Read uncommitted: Sperren werden – soweit möglich – gar nicht beachtet ● Read committed: Es wird mit dem Lesen gewartet, bis die andere Transaktion committed hat, d.h. deren Sperren wieder aufgehoben sind. ● Repeatable Read: Es wird mit dem Lesen gewartet, bis die andere Transaktion committed hat, dann wird selbst gesperrt (auch nur zum Lesen!), bis die eigene Transaktion fertig ist, d.h. auch gelesene Ressourcen werden gesperrt. ● Serializable: Keinerlei gleichzeitige Zugriffe zweier Transaktionen auf dieselben Resourcen (Datenseiten, Datensätze o.ä.) werden zugelassen: Gelesene Ressourcen werden genauso wie geänderte gesperrt, dabei werden Einfügungen in die betroffenen Tabellen ebenfalls verhindert. Locking Durch Sperren können sogenannte "Deadlocksituationen auftreten. Beispiel: Dining Philosophers 5 Philosophen (Informatiker) sitzen vor einem runden Tisch mit 5 Tellern Spagetti. Zwischen den Tellern jeweils 1 Gabel. Jeder Informatiker bekommt folgende Arbeitsvorschrift ("Algorithmus") für den Fall, dass er hungrig wird: Warte bis die Gabel zu Deiner Rechten frei wird Nimm die Gabel zu Deiner Rechten Warte, bis die Gabel zu Deiner Linken frei wird Nimm die Gabel zu Deiner Linken Iss, bis Du satt bist Lege beide Gabeln zurück Das funktioniert solange, bis einmal alle Gabeln auf dem Tisch liegen und alle Informatiker gleichzeitig hungrig werden: Jeder nimmt die Gabel zu seiner Rechten und wartet... Einzige Lösung, damit nicht alle Informatiker verhungern: einen Informatiker erschießen Gute DBMS können Deadlock-Situationen erkennen, und brechen tatsächlich einen beteiligten Prozess unter Erzeugung einer Fehlermeldung ab ("Deadlock-Victim") 15 Praxis Normalisieren (Üben), Modellieren (Üben), Abfragen (SQL – Teil3)