Datenbanken Christian Silberbauer Inhaltsverzeichnis 1. Allgemeine Begriffsdefinitionen .................................................................................................... 1 1.1. Datenbanken allgemein .............................................................................................................. 1 1.2. Relationale Datenbanken ........................................................................................................... 1 1.3. Transaktion ................................................................................................................................. 2 2. Normalformen .................................................................................................................................. 3 2.1. Begriffsdefinitionen ..................................................................................................................... 3 2.2. Definitionen der Normalformen................................................................................................... 3 3. SQL ................................................................................................................................................... 5 3.1. Begriffsdefinitionen ..................................................................................................................... 5 3.2. Data Definition Language (DDL)................................................................................................. 5 3.3. Data Manipulation Language (DML)........................................................................................... 8 4. SQL für Objektrelationale Datenbanken ..................................................................................... 11 5. PHP ................................................................................................................................................. 13 5.1. Funktionen ................................................................................................................................ 13 5.2. Beispielskripte........................................................................................................................... 14 6. Regeln zum Datenbankentwurf.................................................................................................... 16 7. Concurrency und Recovery ......................................................................................................... 17 Dieses Skript orientiert sich überwiegend an der Vorlesung Datenbanken im Studiengang Wirtschaftsinformatik an der Fachhochschule Regensburg von Prof. Dr. Schicker. Alle Rechte vorbehalten. Allgemeine Begriffsdefinitionen 1. Allgemeine Begriffsdefinitionen 1.1. Datenbanken allgemein 1.1.1. Datenbank Semantisch zusammengehörige Daten, die von einem Datenbankmanagementsystem verwaltet werden. 1.1.2. Datenbankmanagementsystem (DBMS) Ein Datenbankverwaltungssystem kapselt die Verwaltung persistenter Daten von deren Nutzung durch ein Anwendungssystem. Semantisch zusammengehörige Daten werden in so genannten Datenbanken vereint. Die derzeit wirtschaftlich erfolgreichsten Datenbankmanagementsysteme sind der Reihe nach „Oracle“ (Oracle), „DB/2“ (IBM) und „SQL-Server“ (Microsoft). Weit verbreitet sind zudem „MS-Access“ (Microsoft) und „MySQL“. 1.1.3. Datenbankschnittstelle Die Datenbankschnittstelle ermöglicht dem Anwendungssystem den Zugriff die Daten der Datenbank. 1.2. Relationale Datenbanken 1.2.1. Relationale Datenbank Relationale Datenbanken sind Datenbanken, deren Daten in Relationen gespeichert sind. Beziehungen zwischen diesen Relationen werden ausschließlich durch Fremdschlüsselattribute hergestellt. 1.2.2. Überblick Formale Relationale Ausdrücke Informelle Ausdrucksweise Relation Tupel Kardinalität Attribut Grad Primärschlüssel Gebiet 1.2.3. Tabelle eine Zeile einer Tabelle Anzahl der Zeilen einer Tabelle eine Spalte einer Tabelle Anzahl der Spalten einer Tabelle eindeutiger Bezeichner Menge aller möglichen Werte Relation Eine Relation ist eine Tabelle mit folgenden Eigenschaften: - Es gibt keine doppelten Tupel Tupel sind nicht geordnet Attribute sind nicht geordnet Alle Attribute sind atomar Datenbanken -1- Christian Silberbauer Allgemeine Begriffsdefinitionen 1.2.4. Schwache Relation Eine Relation heißt „schwach“, wenn sie lediglich eine andere Relation referenziert und die Existenz ihrer Tupel von der Existenz der referenzierten Tupel der anderen Relation abhängig ist. Eine Subtyp-Relation (1-1-Beziehung) ist meistens schwach. 1.2.5. Beziehungsrelation Eine Beziehungsrelation ist eine Relation mit zwei oder mehreren Fremdschlüsseln, die zusammen einen Schlüsselkandidaten bilden. 1.2.6. Schlüsselkandidat Ein Schlüsselkandidat besteht aus einer minimalen Menge von Attributen einer Relation, die die Tupel der Relation eindeutig identifizieren. „minimale Menge“ bedeutet, dass keine Teilmenge dieser Attribute auch Schlüsselkandidat sein darf. 1.2.7. Primärschlüssel Ein Primärschlüssel ist ein ausgewählter Schlüsselkandidat einer Relation. Der Wert eines Fremdschlüssels, der auf ein Tupel dieser Relation verweist, muss einem Wert des Primärschlüssels entsprechen. 1.2.8. Alternative Schlüssel Alternative Schlüssel sind Schlüsselkandidaten, die nicht Primärschlüssel sind. 1.2.9. Fremdschlüssel Als Fremdschlüssel bezeichnet man ein oder mehrere Attribute, der oder die gemeinsam einen definierten Primärschlüssel beinhalten und somit auf das zugehörige Tupel verweisen. 1.2.10. Schlüsselattribut Ein Schlüsselattribut ist ein Attribut eines Schlüsselkandidaten. 1.2.11. Nichtschlüsselattribut Ein Nichtschlüsselattribut ist ein Attribut, das keinem Schlüsselkandidaten zugehört. 1.3. Transaktion Eine Transaktion ist eine feste Folge von Operationen. Transaktionen besitzen die ACIDEigenschaften: Atomarität (atomicity): Eine Transaktion wird entweder ganz oder gar nicht ausgeführt. Konsistenz (consistency): Nach Ausführung der Transaktion ist die Datenbank wieder in widerspruchsfreiem Zustand. Isolation (isolation): Jede Transaktion ist unabhängig von eventuell parallel laufenden Transaktionen. Dauerhaftigkeit/Persistenz (durability): Änderungen von Transaktionen gelten auf Dauer. Datenbanken -2- Christian Silberbauer Normalformen 2. Normalformen 2.1. Begriffsdefinitionen 2.1.1. Funktionale Abhängigkeit Ein Attribut Y einer Relation R heißt „funktional abhängig“ vom Attribut X derselben Relation, wenn zu jedem X-Wert höchstens ein Y-Wert möglich ist. (X -> Y) alle Attribute hängen vom Primärschlüssel und den alternativen Schlüsseln funktional ab. 2.1.2. Volle Funktionale Abhängigkeit Ein Attribut Y einer Relation R heißt „voll funktional abhängig“ vom Attribut X derselben Relation, wenn es funktional abhängig ist von X und es nicht funktional abhängig ist von beliebigen Teilattributen von X. (X => Y) es gilt: es gilt nicht: 2.1.3. Primärschlüssel -> alle anderen Attribute Primärschlüssel => alle anderen Attribute Determinante Eine Determinante ist ein Attribut, von dem ein anderes voll funktional abhängig ist. 2.1.4. Mehrfache Abhängigkeit (Grob-Definition) Ein Attribut Y einer Relation R heißt mehrfach abhängig vom Attribut X derselben Relation, wenn zu jedem X-Wert höchstens eine eng begrenzte Anzahl Y-Werte möglich sind. 2.2. Definitionen der Normalformen 2.2.1. 1. Normalform Eine Relation ist in der 1. Normalform, wenn alle ihr zugrunde liegenden Gebiete nur atomare Werte enthalten. Eine (normalisierte) Relation ist immer in der ersten Normalform 2.2.2. 2. Normalform Eine Relation ist in der 2. Normalform, wenn sie in der 1. Normalform ist und jedes NichtSchlüsselattribut vom Primärschlüssel voll funktional abhängig ist. Das heißt, die Attribute müssen vom ganzen Primärschlüssel abhängig sein Es gilt mit 2. NF: Primärschlüssel => Nichtschlüsselattribute Eine Relation in erster Normalform mit nicht zusammengesetztem Primärschlüssel ist immer in der zweiten Normalform 2.2.3. 3. Normalform (nach Boyce/Codd) Eine Relation ist in der 3. Normalform, wenn sie in der 2. Normalform ist und jede Determinante dieser Relation ein Schlüsselkandidat ist. Das heißt, ein Nichtschlüsselattribut darf von keinem anderen Nichtschlüsselattribut abhängig sein. Datenbanken -3- Christian Silberbauer Normalformen 2.2.4. 4. Normalform Eine Relation ist in der 4. Normalform, wenn sie in der 3. Normalform ist und jede mehrfache Abhängigkeit auch eine funktionale Abhängigkeit nach sich zieht. 2.2.5. 5. Normalform (Projektion-Join-Normalform; Grob-Definition) Eine Relation ist in der 5. Normalform, wenn sie in der 4. Normalform ist und sie nicht-trivial nicht mehr in mindestens zwei Relationen zerlegt werden kann. Datenbanken -4- Christian Silberbauer SQL 3. SQL 3.1. Begriffsdefinitionen SQL (Structured Query Language) ist eine Abfrage- und Manipulationssprache für relationale Datenbanken. SQL ist eine deklarative, mengenorientierte Sprache. SQL-Anweisungen werden in drei Klassen: - DDL (Data Definition Lanugage): Datenbankobjekte (Tabellen, Views etc.) angelegen und manipulieren (z.B. CREATE TABLE, CREATE VIEW) - DML (Data Manipulation Language): Daten aus Tabellen selektieren und verändern (z.B. SELECT, INSERT, UPDATE, DELETE) - DCL (Data Control Language): Steuern von Transaktionen (z.B. COMMIT, ROLLBACK) 3.2. Data Definition Language (DDL) 3.2.1. CREATE TABLE-Befehl Syntax CREATE TABLE Tabellenname ({ Spalte { Datentyp | Gebietsname } [Spaltenbedingung […]] | Tabellenbedingung } [, …] ) Spaltenbedingung := [CONSTRAINT Bedingungsname] { NOT NULL | PRIMARY KEY | UNIQUE | CHECK (Bedingung) | REFERENCES Tabellenname [(Spalte [,…])] [ ON DELETE { NO ACTION | CASCADE | SET NULL }] [ ON UPDATE { NO ACTION | CASCADE | SET NULL }] } […] Tabellenbedingung := [CONSTRAINT Bedingungsname] { PRIMARY KEY (Spalte [, …]) | UNIQUE (Spalte [, …]) | CHECK (Bedingung) | FOREIGN KEY (Spalte [,…]) REFERENCES Tabellenname [(Spalte [,…])] [ ON DELETE { NO ACTION | CASCADE | SET NULL }] [ ON UPDATE { NO ACTION | CASCADE | SET NULL }] } […] Datenbanken -5- Christian Silberbauer SQL Die wichtigsten Datentypen INTEGER, INT Ganzzahl SMALLINT Ganzzahl NUMERIC(x, y) x-stellige Dezimalzahl mit y Nachkommastellen DECIMAL(x, y) mindestens x-stellige Dezimalzahl mit y Nachkommastellen FLOAT(x) Gleitpunktzahl mit x Nachkommstellen CHARACTER(n), CHAR(n) Zeichenkette der Länge n (ungenutzte Zeichen werden mit Leerzeichen aufgefüllt!) VARCHAR(n) Variable Zeichenketten mit bis zu n Zeichen DATE Datumsfeld Anwenden der relationalen Integritätsregel Im Falle von Manipulationen referenzierter Tupel (Primärschlüsselwerte ändern oder Tupel löschen) sind bei einem Fremdschlüssel folgende Konsequenzen zur Erhaltung der relationalen Integrität möglich: Aktion zurückweisen ON DELETE NO ACTION ON UPDATE NO ACTION Aktion kaskadierend ausführen ON DELETE CASCADE ON UPDATE CASCADE Referenzen auf NULL setzen ON DELETE SET NULL ON UPDATE SET NULL Datumsfeld Variable (String) in Datum umwandeln CAST z.B. CAST(‘2000-01-01‘ AS DATE) DATE z.B. DATE ‘2000-01-01‘ Oracle TO_DATE z.B. TO_DATE(‘00-Jan-01‘,‘YY-MMM-DD‘) MySQL STR_TO_DATE z.B. STR_TO_DATE(‘1.1.2000‘,‘%d.%m.%y‘) MS-Access CDATE SQL z.B. CDATE(‘1.1.00‘) Heutiges Datum SQL, Oracle, MySQL Current_Date Oracle Sysdate MS-Access Date() CHECK Im CHECK als Spaltenbedingung darf nur auf das assoziierte Attribut selbst Bezug genommen werden. Andernfalls ist eine Tabellenbedingung notwendig. Datenbanken -6- Christian Silberbauer SQL 3.2.2. CREATE VIEW-Befehl Syntax CREATE VIEW Sichtname [(Spalte [, …] )] AS Select-Befehl [WITH CHECK OPTION] // wenn gesetzt, wird eine Änderung auf die Sicht nur dann // ausgeführt, wenn die betroffenen Tupel weiterhin Elemente // der Sicht bleiben. Mutationen auf Sichten sind nicht erlaubt, wenn der Select-Befehl… - auf mehr als eine Relation zugreift, - eine GROUP-BY-Klausel enthält, - eine DISTINCT-Angabe enthält, - die Spaltenliste nicht nur aus einzelnen Spaltennamen besteht, - mindestens einen der Operatoren UNION, INTERSECT oder EXCEPT enthält oder: - der SELECT-Befehl auf einer Sicht basiert, die eine der fünf obigen Bedingungen erfüllt 3.2.3. GRANT-Befehl Syntax GRANT { Zugriffsrecht [,…] | ALL PRIVILEGES } ON { DOMAIN Gebietsname | [TABLE] { Tabellenname | Sichtname } } TO { Benutzer [, …] | PUBLIC } [WITH GRANT OPTION] // erh. Rechte dürfen weitergegeben werden Zugriffsrecht := { | | | | | SELECT INSERT [(Spalte [, …] )] UPDATE [(Spalte [, …] )] DELETE REFERENCES [(Spalte [, …] )] USAGE // Referenzieren der angegebenen Attribute // Verwenden des angegebenen Gebiets } Datenbanken -7- Christian Silberbauer SQL 3.3. Data Manipulation Language (DML) 3.3.1. SELECT-Befehl Syntax Select-Hauptteil [ { UNION | EXCEPT | INTERSECT } [ALL] Select-Hauptteil [{ UNION | EXCEPT | INTERSECT } [ALL] …] ] [ORDER BY Ordnungsliste] // Vereinigung, Differenz, Schnitt // Sortierung Select-Hauptteil := SELECT [ALL | DISTINCT] Spaltenauswahlliste FROM Tabellenliste [WHERE Bedingung] [[GROUP BY Spaltenliste] [HAVING Bedingung]] // Projektion // Kreuzprodukt oder Join // Restriktion // Gruppierung // Restriktion nach Gruppierung Aggregatsfunktionen Durchschnitt avg() Anzahl count() Maximum max() Minimum min() Summe sum() // Besonderheit: count() gibt 0 zurück, wenn keine Sätze gefunden // wurden. Alle anderen Aggregatsfunktionen geben in einem solchen // Fall NULL zurück. Funktionen, um NULL-Werte zu ersetzen coalesce() SQL-Standard nvl() Oracle nz() Access // Ermittelt eigentlich aus einer Liste den ersten Wert ungleich NULL Operatoren in der WHERE-Klausel Boolesche Operatoren AND, OR, NOT Vergleichsoperatoren <, <=, >, >=, =, <> Intervalloperator [NOT] BETWEEN … AND … Enthaltenoperator [NOT] IN Auswahloperatoren ALL, ANY, SOME Ähnlichkeitsoperator [NOT] LIKE Existenzoperator EXISTS Eindeutigkeitsoperator UNIQUE Nulloperator IS [NOT] NULL Datenbanken // SOME und ANY sind Synonyme -8- Christian Silberbauer SQL Wildcards (unter Verwendung des Ähnlichkeitsoperators) % ersetzt beliebig viele Zeichen (* in Access) _ ersetzt genau ein Zeichen (? in Access) JOIN Inner-Join Tabelle1 [INNER] JOIN Tabelle2 ON Tabelle1.Feld = Tabelle2.Feld Outer-Join Tabelle1 {LEFT | RIGHT | FULL} [OUTER] JOIN Tabelle2 ON Tabelle1.Feld = Tabelle2.Feld Natural-Join Tabelle1 NATURAL INNER JOIN Tabelle2 Logische Abarbeitungsreihenfolge des Select-Befehls 1. 2. 3. 4. 5. 6. Relationen mittels Kreuzprodukt oder JOIN verknüpfen Restriktion mit Hilfe der WHERE-Bedingung Projektion durchführen Gruppieren gemäß der GROUP-BY-Klausel Restriktion auf Ergebnis der Gruppierung mit HAVING-Klausel Alle so erstellten Hauptteile des SELECT-Befehls mittels UNION, INTERSECT oder EXCEPT miteinander verknüpfen 7. Ergebnisrelation anhand der ORDER-BY-Klausel sortieren Beispiele SELECT SELECT SELECT SELECT count(*) FROM tab count(DISTINCT feld) FROM tab * FROM tab WHERE feld = any(1000, 2000, 3000) feld1 AS a, feld2 FROM tab ORDER BY 1 desc, a Datenbanken -9- Christian Silberbauer SQL 3.3.2. INSERT-Befehl Syntax INSERT INTO { Tabellenname | Sichtname } [(Spaltenliste)] { VALUES (Auswahlliste) | Select-Befehl } Beispiel INSERT INTO Auftragsposten (Nr, Menge, Preis) VALUES (1, 10, 9.99) 3.3.3. UPDATE-Befehl Syntax UPDATE { Tabellenname | Sichtname } SET { Spalte = { Spaltenausdruck | NULL }} [,…] [WHERE Bedingung] Beispiel UPDATE Auftragsposten SET Menge = Menge + 5 WHERE Nr = 1 3.3.4. DELETE-Befehl Syntax DELETE FROM { Tabellenname | Sichtname } [WHERE Bedingung] Beispiel DELETE FROM Auftragsposten WHERE Nr = 1 Datenbanken - 10 - Christian Silberbauer SQL für Objektrelationale Datenbanken 4. SQL für Objektrelationale Datenbanken 4.1. CREATE TYPE – Syntax CREATE TYPE Typname AS { VARRAY | VARRYING ARRAY } (Anzahl) OF Datentyp CREATE TYPE Typname AS OBJECT ( Spalte Datentyp [, …], [ { MEMBER { Prozedurname | Funktionsname } } [, …]]) CREATE TYPE Typname AS MEMBER { Prozedurdeklaration | Funktionsdeklaration }; [, …] CREATE TYPE Typname AS TABLE OF Datentyp 4.2. Funktionen für eingebettete Relationen the() Wandelt eingebettete Relation in Ausgaberelation um multiset() Fasst eingebettete Relationen zusammen CAST-Operator Typkonvertierung 4.3. Beispiele CREATE TYPE T_Name AS VARRAY(10) OF CHARACTER(30) // Array anlegen CREATE TYPE T_Adresse AS OBJECT ( Strasse CHARACTER(30), PLZ CHARACTER(5), ORT CHARACTER(30) ) // Objekt anlegen CREATE TYPE T_APos AS OBJECT ( Nr INTEGER, Anzahl INTEGER, Preis NUMERIC(10,2) ) // Objekt anlegen CREATE TYPE ET_APos AS TABLE OF TAPos // Eingebettete Tabelle anlegen… CREATE TABLE Auftrag ( Nr INTEGER PRIMARY KEY, Bearbeiter T_Name, Lieferadr T_Adresse, APos ET_APos ) NESTED TABLE APos STORE AS ET_APos_TAB // …Tabelle mit… // …Array… // …Objekt… // …und eingebetteter Tabelle anlegen CREATE VIEW VAuftrag(Nr, Lieferadr) AS // View mit Objekt erzeugen SELECT A.Nr, T_Adresse(A.Strasse, A.PLZ, A.Ort) FROM AuftragAlt A Datenbanken - 11 - Christian Silberbauer SQL für Objektrelationale Datenbanken INSERT INTO Auftrag // Satz mit Objekten einfügen ( 1, T_Name(‘Meier’, ‘Müller’), T_Adresse(’Walhallaallee 26’, 93093, ’Donaustauf ’), ET_APos(T_APos(1023, 5, 232.00), T_APos(3938, 1, 15.99)) ) INSERT INTO the(SELECT APos FROM Auftrag WHERE Nr = 1) VALUES(T_APos(8020, 2, 30.11)) // Einfügen in eingebetteter Tabelle SELECT Nr, A.Lieferadr.Ort FROM Auftrag A // Objektattribut auslesen SELECT * // Eingebettete Tabelle ausgeben FROM the(SELECT APos FROM Auftrag WHERE Nr=1) SELECT sum(P.Preis) // Aggregatsf. auf eingebettete Tab. FROM the(SELECT APos FROM Auftrag WHERE Nr=1) P SELECT A1.Nr, // Eingeb. Tabellen zusammenfassen cast(multiset( SELECT * FROM the(SELECT APos FROM Auftrag A2 WHERE A2.Nr = A1.Nr) P WHERE P.Preis > 100 ) AS ET_APos) FROM Auftrag A1 Datenbanken - 12 - Christian Silberbauer PHP 5. PHP 5.1. Funktionen 5.1.1. String-Funktionen trim(string) entfernt Leerzeichen am Anfang und am Ende strlen(string) gibt die Länge einer Zeichenkette zurück strcmp(str1, str2) strcasecmp(str1, str2) vergleicht zwei Zeichenketten vergleicht zwei Zeichenketten ohne Beachtung der Groß/Kleinschreibung strtolower(string) strtoupper(string) wandelt in Kleinbuchstaben um wandelt in Großbuchstaben um 5.1.2. Datenbank-Funktionen (Oracle) resource oci_connect (string username, string password, string db) array oci_error (resource source) resource oci_parse (resource connection, string query) oci_execute (resource stmt, int mode) bool int string oci_num_fields (resource statement) oci_field_name (resource statement, int field) array object int int // per default: numerisch und assoziativ oci_fetch_array (resource statement) oci_fetch_object (resource statement) oci_fetch_all (resource statement, array &output) // nicht bei select verwenden! oci_num_rows (resource stmt) bool bool oci_commit (resource connection) oci_rollback (resource connection) bool bool oci_free_statement (resource statement) oci_close (resource connection) Datenbanken - 13 - Christian Silberbauer PHP 5.2. Beispielskripte 5.2.1. Beispiel Datenbankzugriff <html> <head><title>Beispiel Datenbankzugriff (select und update)</title></head> <body> <?php $conn = @oci_connect($_POST['Kennung'], $_POST['Passwort'], ”rfhs8012_ora9i”) or die(”Verbindung zur Datenbank gescheitert. Abbruch”); isset($_POST['Rabatt']) or die(”Rabatt wurde nicht definiert. Abbruch”); isset($_POST['Limit']) or die(”Limit wurde nicht definiert. Abbruch”); $sql = ”SELECT * FROM Auftragsposten WHERE Gesamtpreis > $_POST[Limit]”; $stmt = oci_parse($conn, $sql); @oci_execute($stmt, OCI_DEFAULT) or die(”Fehler beim Daten auslesen. Abbruch.”); ($rec = oci_fetch_array($stmt)) or die(”Keine Aufträge betroffen. Abbruch.”); echo ”<table border=1>”; do { echo ”<tr> <td>$rec[ANR]</td><td>$rec[TEILENR]</td> </tr>”; } while ($rec = oci_fetch_array($stmt)); echo ”</table>”; $sql = ”UPDATE Auftragsposten SET Gesamtpreis = Gesamtpreis * (100 - $_POST[Rabatt]) / 100 WHERE Gesamtpreis > $_POST[Limit]”; $stmt = oci_parse($conn, $sql); @oci_execute($stmt, OCI_DEFAULT) or die(”Fehler beim Daten aktualisieren. Abbruch.”); oci_commit($conn); oci_close($conn); ?> </body> </html> Datenbanken - 14 - Christian Silberbauer PHP 5.2.2. Beispiel Deadlocks <html> <head><title>Beispiel Deadlocks (mit try-catch)</title></head> <body> <?php try { $conn = @oci_connect($_POST['Kennung'], $_POST['Passwort'], ”rfhs8012_ora9i”) if (!$conn) { $err = oci_error(); throw new Exception(”Fehler beim Connect ($err[message])”, $err['code']); } do { try { $sql = ”UPDATE Kunde SET Sperre = 0 WHERE Nr = 1”; $stmt = oci_parse($conn, $sql); @oci_execute($stmt, OCI_DEFAULT); $err = oci_error($stmt); if ($err['code']) throw new Exception (”Fehler beim Ausführen”, $err['code']); $sql = ”UPDATE Kunde SET Sperre = 0 WHERE Nr = 2”; $stmt = oci_parse($conn, $sql); @oci_execute($stmt, OCI_DEFAULT); $err = oci_error($stmt); if ($err['code']) throw new Exception (”Fehler beim Ausführen”, $err['code']); $ready = true; } catch (Exception $e) { if ($e->getCode() == 60) { // Deadlock? echo ”e->getMessage(), Zeile: $e->getLine(), Code: $e->getCode()<br>”; echo ”Deadlock! Transaktion wird abgebrochen und neu gestartet.<br><br>”; oci_rollback($conn); $ready = false; } else throw $e; } } while (!$ready); oci_commit($conn); oci_close($conn); } catch (Exception $e) { echo ”e->getMessage(), Zeile: $e->getLine(), Code: $e->getCode()<br><br>”; oci_rollback($conn); oci_close($conn); } ?> </body> </html> Datenbanken - 15 - Christian Silberbauer Regeln zum Datenbankentwurf 6. Regeln zum Datenbankentwurf 6.1. Primärschlüssel - Kein NOT NULL und kein UNIQUE beim Primärschlüssel definieren. Das ist automatisch der Fall. 6.2. Alternative Schlüssel - UNIQUE explizit setzen Bei zusammengesetztem alternativen Schlüssel jedes Attribut mit NOT NULL kennzeichnen 6.3. Pflichtfelder - NOT NULL setzen 6.4. Fremdschlüssel 6.4.1. - Generell ON UPDATE CASCADE verwenden 6.4.2. - Bei Schwachen Relationen Bei dem einzigen (!) Fremdschlüssel sind NULL-Werte nicht erlaubt Der Fremdschlüssel hat die Eigenschaft ON DELETE CASCADE 6.4.4. - Bei Beziehungsrelationen Bei Fremdschlüsseln sind NULL-Werte nicht erlaubt Beide Fremdschlüssel haben die Eigenschaft ON DELETE NO ACTION oder ON DELETE CASCADE 6.4.3. - Allgemein Bei Subtyp-Relationen Sie sind i.d.R. Schwache Relationen Der Fremdschlüssel ist beim Subtyp zu setzen 6.5. „Kringel“ setzen… - …bei Subtyp-Relation beim Subtyp …bei 1:n-Beziehungen immer beim „n“ (ist technisch bedingt) …bei 1:n-Beziehungen bei der „1“, wenn der Fremdschlüssel NULL sein kann. Dann und nur dann darf aber NOT NULL bei Fremdschlüsseln nicht gesetzt sein. Datenbanken - 16 - Christian Silberbauer Concurrency und Recovery 7. Concurrency und Recovery 7.1. Concurrency Gleichzeitiger Zugriff auf Daten einer Datenbank im Mehrbenutzerbetrieb. 7.2. Recovery Rekonstruktion einer Datenbank im Fehlerfall. 7.3. Logdatei Eine Logdatei speichert alle Datenbankänderungen zusätzlich auf einer eigenen Festplatte. Die Speicherung in dieser Datei erfolgt im Streaming-Modus (sequentiell). Durch die doppelte Datenhaltung ist das Datenbanksystem immun gegenüber Plattencrashs und gewährt dennoch hohe Performance, da durch das sequentielle Schreiben kaum Positionierzeiten auf der Platte anfallen. 7.4. Hot Spots Aus dem Datenbankpuffer werden geänderte Daten vom Datenbanksystem auf die Festplatte zurück geschrieben, wenn diese länger nicht benötigt werden. Auf manche Daten wird aber laufend lesend und schreibend zugegriffen, sodass die Änderungen auf Platte auf diese Art nicht stattfinden. Die entsprechenden Blöcke im Datenbankpuffer nennt man Hot Spots. 7.5. Checkpoints Regelmäßige Zeitpunkte, in denen der Datenbankpuffer gelehrt wird. Dadurch wird zwar der Datenbankbetrieb durch den hohen Ausgabeverkehr merklich gebremst, allerdings beseitigen sie Hot Spots und beschleunigen eine eventuelle Recovery. Das optimale regelmäßige Zeitintervall zwischen zwei Checkpoints zu finden ist Erfahrungssache. Es ist von der jeweiligen Anwendung abhängig. Zu häufige Checkpoints erhöhen den Ausgabeverkehr, zu seltene Checkpoints führen zu enormen Stoßbelastungen, da der Aufwand pro Checkpoint sehr hoch ist. 7.6. Transaktionssteuerung BEGIN TRANSACTION Startet eine Transaktion COMMIT WORK Schließt eine Transaktion ab ROLLBACK WORK Macht die bisherigen Änderungen einer offenen Transaktion rückgängig 7.7. Zwei-Phasen-Commit Bei datenbankübergreifenden Transaktionen, also bei Transaktionen, an denen mehr als eine Datenbank beteiligt ist, ist ein Protokoll namens „Zwei-Phasen-Commit“ notwendig, um primär die Konsistenz der Datenbank zu gewährleisten. Datenbanken - 17 - Christian Silberbauer Concurrency und Recovery Dabei wird eine übergreifende Transaktion zunächst in lokalen Transaktionen abgearbeitet. Anschließend erfolgt eine Meldung über die erfolgreiche oder auch nicht erfolgreiche lokale Abarbeitung an einen sog. Koordinator (Phase 1). Wenn alle lokalen Transaktionen erfolgreich abgeschlossen werden konnten, setzt der Koordinator einen globalen Commit (Phase 2). Die datenbankübergreifende Transaktion ist damit abgeschlossen. Andernfalls wird ein Rollback initiiert und alle beteiligten lokalen Transaktionen werden rückgängig gemacht. 7.8. Sperrmodi Share-Lock erlaubt weitere Share-Locks, weist ExclusivLocks aber zurück (bei lesendem Zugriff) Exklusiv-Lock weist alle weiteren Lockanforderungen zurück (bei schreibendem Zugriff) 7.9. Deadlock Eine Verklemmung, bei der zwei oder mehrere Transaktionen gegenseitig auf die Freigabe eines oder mehrerer Locks warten, heißt Deadlock. 7.10.Isolation Level 7.10.1. Level setzen SET TRANSACTION ISOLATION LEVEL Level 7.10.2. Definierte Level Beliebiges Lesen möglich Lesen nicht wiederholbar Phantom möglich ja ja ja Read Committed nein ja ja Repeatable Read nein nein ja Serializable nein nein nein Level Read Uncommitted Beliebiges Lesen: Hier sind Lesezugriffe jederzeit erlaubt Nicht wiederholbares Lesen: Innerhalb einer Transaktion kann wiederholtes Lesen andere Ergebnisse liefern. Phantom-Effekt: Beim wiederholten Lesen können plötzlich zusätzliche Zeilen auftreten (-> Phantom) Datenbanken - 18 - Christian Silberbauer