Marcus Börger Relationale Datenbanken Modellierung und SQL Relationale Datenbanken, Modellierung und SQL, richtet sich an alle, die sich in das Thema Relationale Datenbanken einarbeiten wollen. Es bietet dazu eine praktisch orientierte Einführung in die Konzepte Relationaler Datenbanken sowie einen Einstieg in die drei verbreiteten Datenbank Managementsysteme MySQL, PostgreSQL und Oracle. Titel Relationale Datenbanken Thema Modellierung und SQL Herausgeber Marcus Börger Autor Marcus Börger Email [email protected] Umschlagdesign Martine Windt, Marcus Börger Erstellt am 05.12.2001 Aktuelle Version http://www-users.rwth-aachen.de/Marcus.Boerger/db/Datenbanken.pdf Relationale Datenbanken Inhalt Inhalt 1 Einleitung............................................................................................................... 8 2 Datenbank Schemata.......................................................................................... 10 2.1 Das Physische Schema...........................................................................................................11 2.2 Das Konzeptuelle Schema .....................................................................................................12 2.2.1 Tabellen ..............................................................................................................................................................12 2.2.2 Attribute..............................................................................................................................................................12 2.2.3 Datentypen..........................................................................................................................................................13 2.2.4 Indizes ................................................................................................................................................................15 2.2.5 Relationen...........................................................................................................................................................16 2.2.6 Keys....................................................................................................................................................................22 2.2.7 Referenzielle Integrität .......................................................................................................................................24 2.3 Views .......................................................................................................................................28 2.4 Aufgaben.................................................................................................................................29 3 Modellierung ....................................................................................................... 30 3.1 Normalformen........................................................................................................................31 3.1.1 Erste Normalform...............................................................................................................................................31 3.1.2 Zweite Normalform ............................................................................................................................................32 3.1.3 Dritte Normalform..............................................................................................................................................33 3.1.4 Vierte Normalform .............................................................................................................................................35 3.1.5 Jenseits der Normalformen.................................................................................................................................36 3.1.6 Normalform oder Optimierung...........................................................................................................................36 3.2 Namensgebung .......................................................................................................................36 3.3 ER-Diagramme ......................................................................................................................37 3.4 Aufgaben.................................................................................................................................38 4 Anwendungsstrukturen ..................................................................................... 39 4.1 1-tier........................................................................................................................................39 4.2 2-tier........................................................................................................................................40 4.3 3-tier........................................................................................................................................40 5 Installation........................................................................................................... 41 5.1 MySQL ...................................................................................................................................41 5.1.1 Windows.............................................................................................................................................................41 5.2 PostgreSQL ............................................................................................................................42 5.2.1 Windows.............................................................................................................................................................42 5.2.2 Initialisierung von Postgres ................................................................................................................................44 5.2.3 Postgres als Windows Service............................................................................................................................45 5.3 Oracle......................................................................................................................................46 5.3.1 Windows.............................................................................................................................................................47 5.3.2 Linux ..................................................................................................................................................................47 5.3.3 Database Configuration Assistant.......................................................................................................................48 5.3.4 Net8 Assistant.....................................................................................................................................................49 5.3.5 DBA Studio ........................................................................................................................................................50 5.3.6 SQL*Plus............................................................................................................................................................53 6 Data Definition Language .................................................................................. 54 6.1 CREATE DATABASE..........................................................................................................54 6.2 Verbinden mit der Datenbank..............................................................................................54 6.3 Anlegen und Verbinden mit dem Beispiel...........................................................................54 6.4 CREATE TABLE ..................................................................................................................55 Marcus Börger 5 Inhalt Relationale Datenbanken 6.4.1 CREATE TABLE für MySQL ...........................................................................................................................55 6.4.2 Spaltendefinitionen.............................................................................................................................................56 6.4.3 Constraints..........................................................................................................................................................59 6.4.4 CREATE TABLE SELECT ...............................................................................................................................61 6.4.5 Anlegen der Tabellen der Datenbank Uni ..........................................................................................................62 6.5 CREATE INDEX...................................................................................................................63 6.6 CREATE VIEW ....................................................................................................................63 6.7 CREATE TRIGGER.............................................................................................................63 6.8 CREATE RULE ....................................................................................................................64 6.9 CREATE SEQUENCE..........................................................................................................64 6.10 ALTER TABLE...................................................................................................................64 6.10.1 ALTER TABLE und MySQL ..........................................................................................................................64 6.10.2 ALTER TABLE und Oracle.............................................................................................................................64 6.10.3 ALTER TABLE und PostgreSQL ....................................................................................................................64 6.11 DROP....................................................................................................................................65 6.12 TRUNCATE TABLE ..........................................................................................................65 7 Data Manipulation Language............................................................................ 66 7.1 INSERT INTO .......................................................................................................................66 7.1.1 INSERT INTO SELECT ....................................................................................................................................66 7.1.2 Eingabe der Beispieldaten ..................................................................................................................................67 7.2 SELECT .................................................................................................................................68 7.2.1 FROM.................................................................................................................................................................68 7.2.2 WHERE..............................................................................................................................................................69 7.2.3 Aliasnamen.........................................................................................................................................................69 7.2.4 Abfragen über mehrere Tabellen ........................................................................................................................69 7.2.5 Tabellen mehrmals in einer Abfrage ..................................................................................................................70 7.2.6 Abfragen mit indirekten Tabellen.......................................................................................................................70 7.2.7 Aggregation ........................................................................................................................................................71 7.2.8 GROUP BY........................................................................................................................................................71 7.2.9 HAVING ............................................................................................................................................................72 7.2.10 ORDER BY......................................................................................................................................................72 7.2.11 UNION .............................................................................................................................................................73 7.2.12 UNION ALL ....................................................................................................................................................74 7.2.13 EXCEPT...........................................................................................................................................................74 7.2.14 INTERSECT ....................................................................................................................................................74 7.2.15 Subselects .........................................................................................................................................................75 7.2.16 SELECT DISTINCT ........................................................................................................................................81 7.2.17 SELECT ohne FROM ......................................................................................................................................81 7.2.18 Top-Level Abfragen .........................................................................................................................................81 7.3 UPDATE.................................................................................................................................82 7.3.1 SELECT FOR UPDATE; UPDATE; .................................................................................................................82 7.4 REPLACE INTO...................................................................................................................83 7.5 DELETE .................................................................................................................................84 7.5.1 Top-Level Delete................................................................................................................................................84 7.5.2 Löschen doppelter Datensätze ............................................................................................................................84 7.6 Operatoren und Funktionen.................................................................................................85 7.6.1 Mathematische Operatoren.................................................................................................................................85 7.6.2 Bitweise Operatoren ...........................................................................................................................................85 7.6.3 Logische Operatoren ..........................................................................................................................................85 7.6.4 Vergleichsoperatoren..........................................................................................................................................86 7.6.5 Bedingungsoperatoren........................................................................................................................................86 7.6.6 Umgang mit NULL ............................................................................................................................................87 7.6.7 Funktionen für Zeichenketten.............................................................................................................................88 7.7 Online Analytical Processing................................................................................................88 8 Transactions ........................................................................................................ 89 6 Marcus Börger Relationale Datenbanken Inhalt 9 Rechteverwaltung ............................................................................................... 90 9.1 MySQL ...................................................................................................................................91 9.1.1 Die Datenbank mysql .........................................................................................................................................91 9.1.2 Rechte applizieren ..............................................................................................................................................94 9.1.3 Verlust des root Paßworts...................................................................................................................................94 9.1.4 phpMyAdmin .....................................................................................................................................................95 9.2 PostgreSQL ............................................................................................................................96 9.3 Oracle......................................................................................................................................96 10 Trigger ............................................................................................................... 97 10.1 PostgreSQL und PL/PGSQL..............................................................................................98 10.2 Oracle und PL/SQL.............................................................................................................99 10.3 Microsoft und VBA .............................................................................................................99 11 Zusammenfassung .......................................................................................... 100 A EBNF................................................................................................................. 101 B Lösungen ........................................................................................................... 102 C Verzeichnis der Abbildungen und Tabellen.................................................. 105 D Literaturverzeichnis ........................................................................................ 108 Marcus Börger 7 Einleitung Relationale Datenbanken 1 Einleitung Gegenstand dieses Booklets sind relationale Datenbanken. Relationale Datenbanken arbeiten mit strukturierte Daten, daß heißt sie arbeiten üblicherweise mit großen Mengen von ähnlich strukturierten Daten und können diese in Relation zu einander bringen. Neben diesem Konzept existieren noch andere Ansätze, die mit semistrukturierten Daten arbeiten, Verzeichnisdienste, Objektorientierte Datenbanken und XML1 [BeMi00], [Boe00], [NWB00]. Verzeichnisdienste2 wie DAP [HSG98], NDS oder ADS werden oft zur hierarchischen Speicherung von Zugriffsrechten verwendet. Es wäre zwar möglich diese auf relationalen Datenbanken ab zu bilden aber diese eignen sich dafür nur eingeschränkt. Ebensowenig eignen sich relationale Datenbanken zur Speicherung von XML Daten. Zwar erweitern alle großen Datenbankhersteller ihre Datenbanken immer mehr um Fähigkeiten zum Umgang mit XML Daten, jedoch ermöglichen erst native Datenbanken wie Tamino [SAG00] einen effektiven Umgang. Die Reihenfolge der Kapitel entspricht dem Bottom-Up Ansatz. Es werden also zuerst die Grundlagen erarbeitet und am Ende die Anwendungen vorgestellt. Wenn ein grundlegendes Verständnis der einzelnen Kapitel bereits vorhanden ist, so kann jedes Kapitel für sich getrennt unabhängig von der Reihenfolge betrachtet werden. Zunächst sollen im Kapitel 2 Datenbank Schemata die Struktur und die Funktionsweise von relationalen Datenbanken kurz angerissen werden. Dies ist wichtig um die weiteren Abschnitte verstehen zu können. Ein exaktes Verständnis bis ins Detail ist jedoch nicht notwendig. Dieses bleibt dem Selbststudium in der einschlägigen Literatur vorbehalten [HeSa00], [SKS97]. Nachdem grundlegende Strukturen und Begriffe eingeführt sind, erfolgt in Kapitel 3 Modellierung eine Einführung in die Modellierung relationaler Datenbanken. Hierbei handelt es sich um eine verkürzte Einführung, die anhand von Beispielen praktische Modellierungskonzepte vorstellt. Auch hierbei gilt, daß eine exakte wissenschaftliche Einführung der Fachliteratur vorbehalten bleibt. Das Kapitel 4 Anwendungsstrukturen beschäftigt sich mit den Strukturen, in denen Datenbanken eingesetzt werden. Bevor die erstellten Modelle umgesetzt werden können, muß zunächst ein geeignetes Datenbank Managementsystem installiert werden. In Kapitel 5 Installation wird die Installation für einige Systeme vorgestellt. Stark mit der Modellierung verbunden ist das Anlegen der Datenstrukturen. Bei relationalen Datenbanken erfolgt dies meist mit einem Teilsatz der Structured Query Language (SQL). Dieses wird in Kapitel 6 Data Definition Language behandelt. Den zweiten wichtigen Teil von SQL stellt das Kapitel 7 Data Manipulation Language vor. Er dient der Bearbeitung/Abfrage von Daten. Ein Teil des Kapitels ist dem Thema Funktionen und Online Analytical Processing (OLAP) gewidmet. 1 XML: eXtensible Markup Language Verzeichnisdienste stellen hierarchische Informationen bereit. Diese können erst mit den in SQL-99 definierten rekursiven Anfragen effektiv in relationalen Datenbanken realisiert werden. Beispiele: DAP: Directory Access Protocol und LDAP: Lightweight Directory Access Protocol; NDS: Novell Directory Service, Rechteverwaltung auf Novell Servern; ADS: Advanced Directory Service, von Microsoft mit Windows 2000 eingeführte Rechteverwaltung. 2 8 Marcus Börger Relationale Datenbanken Einleitung Die Data Maipulation Language bietet lediglich Atomare Befehle. Oft sind aber für Änderungen an einem Datenbestand mehrere Befehle notwendig. In Kapitel 8 Transactions wird die Lösung dazu vorgestellt. Wenn mehrere Personen mit einer Datenbank arbeiten, so ist es meist erforderlich Rechte zu vergeben mit denen man die Möglichkeiten der Datenmanipulation und des Datenzugangs für einzelne Nutzer einschränken zu können. Dieses Thema wird in Kapitel 9 Rechteverwaltung behandelt. Größere Datenbank Management Systeme bieten Methoden zur Automatisierung von Vorgängen in der Datenbank. Lesen Sie hierüber in Kapitel 10 Trigger. Am Ende einiger Kapitel befinden sich Übungen mit denen der jeweilige Stoff vertieft werden kann. Die anfänglichen Übungen bauen auf den Beispielen des Textes auf. Ihnen schließen sich komplexere Aufgaben an. Marcus Börger 9 Datenbank Schemata Relationale Datenbanken 2 Datenbank Schemata Wenn man die logische Architektur einer Datenbank betrachtet, dann besteht eine Datenbank aus drei Schemata (Ebenen) [FNA99], [HeSa00], [SKS97]. • Das Physische Schema abstrahiert von der Art und Weise, wie die Daten physikalisch abgelegt sind. Das bedeutet, daß es außerhalb des Physischen Schemas keine Rolle spielt, ob die Daten in einer Datei oder mehreren Dateien abgelegt sind, wie die Dateien organisiert sind, wie sie angesprochen werden oder ob überhaupt Dateien zum Einsatz kommen. Weiterhin abstrahiert das Physische Schema von der internen Struktur der abgelegten Daten. • Das Konzeptuelle Schema bildet die logische Struktur der Daten ab. Wird eine Datenbank geplant, so werden zunächst die Daten und ihre Zusammenhänge analysiert. Hieraus entsteht das eingesetzte Datenmodell, das frei von Redundanz ist. Im relationalen Datenmodell werden Datensätze gleichen Typs in Tabellen abgelegt. • Auf dem konzeptuellen Schema basieren schließlich Views (Sichten). Views sind unabhängig von logischen Änderungen in den unterliegenden Schemata. Views erlauben unterschiedliche Ausschnitte des Datenmodels und verschiedene Sichten darauf für unterschiedliche Anwendungen und Anwender. Sie bringen Sicherheit und Konsistenz in die Datenbank. Views für Studenten • • Kein Zugriff auf andere Studenten Nur Leseoperationen Views für Dozenten • Kein Zugriff auf persönliche Daten anderer Personen Views für Verwaltung • • Noten nur Lesen, außer Prüfungsamt Gehälter ändern Konzeptuelles Schema • • • Personen (PNr, PTyp [Student, Dozent], Name, Adresse, Login, Gehalt, Datum) Veranstaltungen (VNr, PNr, VName, VZeit, VOrt) besuchen (PNr, VNr, Note) Physisches Schema • • • Daten in physischer Form Indizes auf Datensätze Kontrollinformationen, Scripte Abbildung 2.1: Datenbank Schemata 10 Marcus Börger Relationale Datenbanken Datenbank Schemata 2.1 Das Physische Schema Wie bereits erläutert werden im physischen Schema die Daten gespeichert. Werden etwa Adreßdaten in einer Textdatei abgelegt und entspricht jeder Zeile eine Adresse, so sind dadurch bereits physisches und konzeptuelles Schema bestimmt. Die Suche nach einzelnen Adressen erfordert hier jedoch ein Durchsuchen der gesamten Liste für jede Einzelne. Noch schlimmer wird es, wenn Teile der Adreßdatei weitergegeben werden sollen, die Reihenfolge geändert oder Analysen durchgeführt werden sollen, wie etwa die Berechnung der Personen, die in einer bestimmten Stadt wohnen. Ein weiteres Problem ist auch die Übersichtlichkeit der Adressen innerhalb der Dateien, denn egal wie man seine Adressen innerhalb der Datei formatiert, es finden sich immer Adressen, die nicht in das Format passen. Eine Datenbank kann hier wesentlich mehr leisten, denn die Ausgabe kann immer neu angepaßt werden und es ist dabei nicht zwingend notwendig jedesmal die physikalische Struktur der Daten zu kennen. Ein genaues Verständnis, wie die Daten abgelegt werden, ist nicht notwendig. Jedoch speichern die meisten Datenbanken in Dateien auf Standard Dateisystemen. Bei großen Datenbanken ist es hilfreich die Organisation zu verstehen, da bereits hier eine Optimierung erfolgen kann bzw. die Eigenschaften des Dateisystems Einfluß auf Eigenschaften der Datenbank hat. Während kleinere Datenbanken üblicherweise eine einzige Datei benutzen, legen größere Datenbanken ihre Daten meist in mehreren Dateien ab. Eine erste Aufteilung ergibt sich, wenn die Datenbank für jede Tabelle eine eigene Datei anlegt und Indizes getrennt speichert. Meist benutzen die Datenbanken jedoch sogenannte Extends die unabhängig von den Strukturen im Konzeptuellen Schema sind (Informationstheoretisch wäre eine Vermischung der Schemata ein großer Nachteil). Die Einflußmöglichkeiten des Dateisystems sind weitreichend, werden jedoch meist unterschätzt und zu spät erkannt. Wichtigstes Augenmerk ist hier die Beachtung der maximalen Dateigröße des Dateisystems. Wenn die Datenbankkonfiguration größere Dateien erlaubt als das System sind Fehler vorprogrammiert. Das Wissen um die Einflußmöglichkeiten auf die Speicherorte der Daten kann Kosten und/oder Zugriffszeiten senken. Zum einen können Daten die selten benötigt werden auf langsameren und damit billigeren Medien oder Systemen gespeichert werden. Zum anderen kann man bei großen Datenbanken Informationen nach Teilinformationen getrennt ablegen. Üblicherweise können solche Datenbanken auch mit mehreren Prozessoren gleichzeitig arbeiten, wodurch sich für die Datenbank die Möglichkeit ergibt eine Aufgabe vollkommen parallel auszuführen. Besonders die Kenntnis der Art und Weise, wie eine Datenbank mit verschiedenen Datentypen umgeht, kann zu Optimierungszwecken genutzt werden. Werden im Konzeptuellen Schema beispielsweise viele mathematische Berechnungen mit einem Wert durchgeführt, so empfiehlt es sich ihn von der Datenbank im Physischen Schema als Zahl abspeichern zu lassen. Werden hingegen Textoperationen mit einem Wert ausgeführt sollte man den Wert im Textformat speichern. Ist hingegen die Datenbank ungeeignet ein bestimmtes Format zu speichern, so kann eine andere Lösung sinnvoll sein. Hat eine Datenbank zum Beispiel Probleme mit großen Datenmengen, so werden in der Datenbank einfach Referenzen auf Dateien gespeichert und in diesen Dateien werden dann die Daten abgelegt. Als Referenz kann der Dateiname benutzt werden, so daß das Dateisystem hierbei zur Datenbank wird. So bleiben bei Webanwendungen Bild- und Musikdaten meist auf dem Webserver und in der Datenbank werden nur ihre Dateinamen gespeichert. Marcus Börger 11 Datenbank Schemata Relationale Datenbanken 2.2 Das Konzeptuelle Schema Im Konzeptuellen Schema definiert der Datenbank Entwickler das Datenmodell, die wie bereits erwähnt unabhängig von den Strukturen des physischen Schemas sind. Denn alle Datenabfragen und Dateneingaben erfolgen hier im Konzeptuellen Schema. Schon während der Modellierung muß die Anwendung bekannt sein, damit man nicht an der Anwendung vorbei modelliert. Man hat im dann Extremfall zwar ein Datenmodell, daß die Daten speichert, nicht aber die Anfragen der Anwendung effektiv bearbeiten kann. Man muß also während der gesamten Modellierungsphase die Eignung des Datenmodells zur Realisierung der Aufgaben innerhalb der Anwendung prüfen. Bevor eine Datenbank modelliert werden kann, ist also ein genaues Verständnis der Strukturen einer Datenbank sowie ihren Werkzeugen und Funktionsweisen unabdingbar. 2.2.1 Tabellen Relationale Datenbanken verwenden Tabellen zum Speichern von Daten. Bei der Modellierung der Datenbank ermittelt man in welcher Form Daten vorliegen. Für die unterschiedlichen Formen legt man dann jeweils Tabellen an. Diese bilden eine Ablageschablone für die gefundenen Datenformen. Der allgemeine Datenbanktheoretische Begriff für Tabellen lautet Entity oder zu Deutsch Entität. 2.2.2 Attribute Die einzelnen Spalten einer Tabelle bezeichnet man als Attribute. Die einzelnen Zellen der Tabelle werden als Felder und die Zeilen der Tabelle als Datensätze bezeichnet. Die Felder nehmen also die einzelnen Werte auf, aus denen ein Datensatz besteht. Dabei wird der Datentyp bereits durch die Spalte bestimmt. Alle Felder einer Spalte haben also den gleichen Datentyp. In Kapitel 3.3 ER-Diagramme wird ein sehr oft benutzter Diagrammtyp vorgestellt. Zur besseren Veranschaulichung wird aber zunächst die folgende Darstellung für Tabellen benutzt: Datensatz 1 2 3 4 Tabellenname Attribut 1 Attribut 2 Attribut 3 Attribut 4 Attribut 5 Datensatz Feld Spalte Abbildung 2.2: Tabellendarstellung Die Spalte Datensatz dient der Numerierung der Datensätze und damit lediglich der Veranschaulichung. Zwar benutzen Datenbanksysteme tatsächlich zusätzliche Verwaltungsinformationen, allerdings sind diese nicht zugänglich vom verwendeten System abhängig und werden damit in der Modellierung und Veranschaulichung auch nicht benötigt. 12 Marcus Börger Relationale Datenbanken Datenbank Schemata Als Beispiel für Datenbanktabellen mit ihren Attributen dienen hier die Tabellen für Personen, Veranstaltungen und die Relationstabelle besuchen. Datensatz PNr PTyp 1 2 3 4 5 100000 100001 100002 100003 100004 Dozent Dozent Student Student Student Personen Name Adresse Ebert, K. Zucker, G. Meier, A. Kühn, H. Muster, M. Login Gehalt Datum ebert zucker 100002 100003 100004 10.000 11.000 NULL NULL NULL 13.9.1980 5.3.1982 1.10.1998 1.10.1999 1.10.1999 Abbildung 2.3: Tabelle Personen Datensatz VNr 1 2 3 4 1 2 3 4 Veranstaltungen PNr VName 100000 100000 100001 100001 Einführung Modellierung SQL-DDL SQL-DML VZeit VOrt Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 H1 H2 H3 H1 Abbildung 2.4: Tabelle Veranstaltungen besuchen Datensatz VNr 1 2 3 4 5 6 2 3 2 1 1 4 PNr 100002 100002 100004 100003 100004 100002 Abbildung 2.5: Tabelle besuchen 2.2.3 Datentypen Die einzelnen Attribute einer Tabelle können einwertig, mehrwertig oder zusammengesetzt sein. Einwertige Attribute enthalten Texte oder Zahlen oder Werte aus einer Liste. Eine genaue Auflistung dieser Datentypen findet sich weiter unten. Man kann eine weitere Tabelle mit der Liste aller möglichen Werte für ein Attribut füllen und auf diese Weise den Wertebereich für ein Attribut dynamisch verwalten. Mehrwertige Attribute stellen eine Liste einwertiger Datentypen dar. Dieses wird oft benutzt, um Flags oder benannte Eigenschaften zu speichern. Das Speichern der besuchten oder gelesenen Veranstaltungen ist ein Beispiel hierfür. Mehrwertige Attribute sind in einem Relationalen Datenmodell nicht zulässig. Kommt bei einem mehrwertigem Attribut eine Liste mit bekannter maximaler Länge zum Einsatz, so kann man das mehrwertige Attribut durch den Einsatz entsprechend vieler einwertiger Attribute gleichen Datentyps ersetzen. Ansonsten muß eine weitere Tabelle angelegt werden. Das wird in Kapitel 3.1 Normalformen deutlich. Zusammengesetzte Attribute sind im Prinzip einzelne Attribute die als ganzes betrachtet werden können. Man kann zusammengesetzte Attribute in einer weiteren Tabelle auslagern, wenn immer gleiche Paare auftreten. Anders verhält sich das Beispielsweise bei Namen. Diese können natürlich in einem einzelnen Attribut gespeichert werden, dabei geht jedoch verloren welcher Teil Anrede, Vorname oder Nachname ist. Die einzelnen Attribute von zusammengesetzten Attributen müssen im Gegensatz zu mehrwertigen Attributen nicht vom gleichen Datentyp sein. Auch können Teilinformationen als Referenz auf eine andere Tabelle realisiert werden. Nachteilig ist, daß das Zusammensetzten der Teilinformationen einen zusätzlichem Aufwand darstellt. Marcus Börger 13 Datenbank Schemata Relationale Datenbanken Relationale Datenbanken unterscheiden die folgenden einwertigen Datentypen: • Integerzahlen; ganzzahlige Werte eignen sich besonders gut als Indizes und für einfache mathematische Berechnungen. • Fließkommazahlen; Mathematische Berechnungen jeder Art. • Festkommazahlen; Fließkommazahlen mit fester Anzahl der Nachkommastellen für mathematische Berechnungen, besonders für Währungsrechnungen geeignet. Einsatz ist nicht empfehlenswert, wenn Genauigkeit und Darstellung nicht identisch sind, damit keine Eignung für Wirtschaftssysteme. • Währung; Festkommazahlen die mit einer Währungskennzeichnung versehen sind. • Zeichen ;Einzelne beliebige Zeichen, oft als Flags oder Status genutzt. • Zeichenketten; Zeichenfolgen mit fester oder variabler Länge. • Boolesche Werte; Speicherung der Zustände JA/NEIN. • Zeiten; Zeitangaben mit festgelegter Genauigkeit eignen sich in einfachen Systemen gut für Zeitberechnungen. • Datumsangaben; Datumsangeben sind wie Zeitangaben meist Systemabhängig. Kommen mehrere Systeme zum Einsatz, sind andere Lösungen zu prüfen. • Binary Large Objects (BLOB); Speicherung beliebiger Informationen. Dabei bieten die meisten RDBMS rein binäre und textorientierte Typen, die Textfunktionen erlauben. Neben diesen Standardtypen existieren in vielen Datenbanken noch spezielle andere Datentypen und oft haben die Datenbanken unterschiedliche Bezeichnungen für obige Datentypen. Bei der Modellierung sollte darauf Acht gegeben werden, daß nicht zu oft zwischen den Datentypen konvertiert werden muß, da jede Konvertierung zusätzliche Zeit beansprucht. Bei den meisten Datentypen können zusätzliche Angaben zur Genauigkeit oder Länge angegeben werden. Die SQL Datentypen werden in 6.4.2.1 SQL Datentypen beschrieben. 2.2.3.1 NULL Der Wert NULL ist eigentlich gar kein Wert, denn er repräsentiert die Aussage ‚kein Wert’ oder ‚Wert nicht bekannt’. Alle Spaltenwerte, die nicht explizit oder implizit durch Standardwerte belegt werden haben den Wert NULL. Der Wert NULL ist gänzlich von der Zahl 0, der leeren Zeichenfolge '' sowie der leeren Menge () zu unterscheiden. Alle Vergleiche mit dem NULL ergeben falsch. Für eine Überprüfung auf den Wert NULL benötigen Datenbanken also spezielle Funktionen bzw. Operatoren. SQL benutzt hierzu den Operator IS NULL (siehe 7.6.6.1 IS NULL). Folgende Aussagen veranschaulichen NULL: • NULL != 0 NULL ist ungleich der Zahl 0 • NULL != '' NULL ist ungleich einer leeren Zeichenfolge • NULL != () NULL ist ungleich der leeren Menge • (NULL != NULL) = NULL NULL ist weder gleich noch ungleich NULL • (NULL IS NULL) = true NULL wird über den Operator IS NULL erkannt Für nahezu alle Funktionen und Operatoren außer IS NULL gilt, wenn ein Parameter den Wert NULL hat, so ist das Ergebnis NULL. 14 Marcus Börger Relationale Datenbanken Datenbank Schemata 2.2.3.2 Berechnete Spalten Eine Besonderheit bilden berechnete Spalten, die von einigen wenigen Datenbanken unterstützt werden. Solche Spalten repräsentieren das Ergebnis einer Berechnung anderer Spalten des Datensatzes. Damit lassen sich einige Aufgaben vereinfachen. Angenommen in einer Tabelle werden Anzahl und Preis einer Ware gespeichert, dann könnte man den Gesamtpreis als berechnete Spalte „Anzahl*Preis“ definieren. Dieses Konzept hat den Nachteil, daß nun nicht mehr alle Spalten der Tabelle geändert werden können. Denn solche Spalten dürfen logischerweise nur gelesen werden. Eine elegantere Methode stellen Views bereit. Diese bieten zudem die Möglichkeit andere Datensätze auch aus fremden Tabellen mit in die Berechnung einzubeziehen (2.3 Views). Beispiele für berechnete Spalten: • (Anzahl * Preis + Porto) * MWSt • Vorname || ' ' || Nachname 2.2.4 Indizes Wenn Daten ohne irgendeine Sortierung geliefert werden sollen, so nimmt das DBMS immer einen sogenannten full-table-scan vor. Daß heißt es wir ein Datenzeiger auf den ersten Datensatz in der physikalischen Tabelle positioniert und der Datensatz geliefert. Danach wird der Datensatzzeiger zum nächsten Datensatz verschoben und der dortige Datensatz geliefert. Das wird solange wiederholt, bis alle Datensätze zurückgegeben worden sind. Datensatzzeiger Datensatz hört VNr PNr 1 2 3 4 5 6 2 3 2 1 1 4 100002 100002 100004 100003 100004 100002 Datensatz Abbildung 2.6: full-table-scan Indizes bilden eine Möglichkeit schnell und geordnet auf einzelne Datensätze innerhalb einer Tabelle zu zugreifen. Hierzu speichert ein Index eine bestimmte Sortierfolge der Datensätze einer Tabelle ab und ordnet dieser den Positionen innerhalb der Tabelle zu. Wenn ein Zugriff auf eine Tabelle unter einer Sortierung erfolgt, für die es keinen Index gibt, so wird dieser temporär angelegt und nach dem Zugriff verworfen3. Da die Berechnung der Reihenfolge der Datensätze für einen Index zeitaufwendig ist, sollten für solche Zugriffe alle notwendigen Indizes vorhanden sein. Das Fehlen eines Index wirkt sich besonders dann dramatisch aus, wenn er häufig benutzt wird. Dies kann der Fall sein, wenn sich der Index in einer Unterabfrage oder einer Funktion fehlt, das Fehlen sich also über eine Nebenaktion auswirkt und nicht offensichtlich ist. Wenn ein Index eindeutig ist, so wird er als unique bezeichnet. Eine besondere Form eindeutiger Indizes wird in 2.2.6 Keys vorgestellt. Dort finden sich auch Grafiken, die den Tabellenzugriff über Indizes veranschaulichen (Abbildung 2.18: Primary Key, Abbildung 2.19: Primary Key bei ungeordneter Tabelle und Abbildung 2.20: Primary Key und Index (VZeit, VOrt)). 3 Manche Datenbanken ersetzen sortierte Abfragen auch durch full-table-scans. Das Anlegen eines temporären Index hat aber den enormen Vorteil, daß der Datenbank Programmcode mit einer Funktion auskommt. Auch macht es zeitlich oft keinen Unterschied ob ein Index erstellt wird oder ein Sortierkriterium für jeden einzelnen Datensatz geprüft werden muß. Marcus Börger 15 Datenbank Schemata Relationale Datenbanken 2.2.5 Relationen Relationen stellen die Verbindung mehrerer Tabellen zueinander her. Durch sie können Daten, die sich über mehreren Tabellen verteilen, zusammengefügt werden. Relationen können durch den Einsatz von Constraints und Triggern (6.4.3 Constraints) gesichert werden. Insbesondere ist es damit möglich ein getrenntes Löschen bzw. Anlegen von Teildatensätzen zu verhindern (siehe 2.2.7 Referenzielle Integrität). 2.2.5.1 Relationstyp 1 zu 1 Eine Relation der Form 1 zu 1 entsteht, wenn es zu jedem Spaltenwert einer Tabelle genau einen Spaltenwert in einer zweiten Tabelle gibt. Relationen der Form 1 zu 1 sollten in einer relationalen Datenbank niemals vorkommen, da sie in einer Tabelle zusammengefaßt werden können. Sollte sich eine 1 zu 1 Relation durch nachträgliche Modifikation ergeben, so sollte die Relation zumindest gesichert werden, es empfiehlt sich jedoch die Ursprungstabellen zu vereinigen und durch Views abzubilden. Wenn eine neue Tabelle unter einem neuen Namen angelegt wird, so können die alten Tabellen durch Views simuliert werden. Dadurch ist es insbesondere möglich, die Restlich Anwendung ohne weitere Änderung weiter zu nutzen. Besonderen Nutzen der Zusammenfassung erhält man allerdings erst, wenn die Anwendung auf die neue Tabelle umgestellt wird. Mit diesem Hintergrund ergibt sich jedoch umgekehrt, daß eine 1 zu 1 Relation sinnvoll sein kann, wenn sie sich aus anfänglichen Anwendungsanforderungen ergibt, sich in späteren Erweiterungen aber 1 zu n Relationen ergeben. Als Beispiel sei hier die Speicherung von Personen und Adressen angegeben. Anwendungen kommen oft mit nur einer Adresse pro Person aus. Sollen die Personen/Adreßdaten jedoch etwa zu einem Contact Relation Management (CRM) Modul erweitert werden, so ist es erforderlich mehrere Adressen pro Person zu speichern (Privatadresse, Firmenadresse, Lieferadresse). Ein weiterer Grund für die Verwendung von 1 zu 1 Relationen liegt in der Optimierung. Wenn es gelingt den oft benutzen Teil der Datensätze in einer Tabelle aus Spalten fester Länge zu bilden, so erfolgt der Zugriff meist wesentlich schneller. Dies liegt daran, daß sich die Position der Datensätze innerhalb des Speicherortes aus Datensatznummer und Datensatzgröße direkt ergibt. Bei Datensätzen mit variabler Länge muß die Datenbank hingegen ständig Indizes korrigieren oder beim Zugriff die Position jedesmal neu berechnen. Die folgende Abbildung zeigt eine 1 zu 1 Beziehung zwischen einer modifizierten Version von Personen genannt Personen 2, bei der das Feld Adresse fehlt und der neuen Tabelle Adresse, die Adreßangaben auf mehrere Spalten aufteilt. Wäre die Relation über das Feld Adresse definiert hätte man nicht einmal die Tabelle Personen modifizieren müssen. PNr Personen 2 Name Login PTyp PNr 1 = Straße Gehalt Datum Adressen Straße2 PLZ Stadt Land 1 Abbildung 2.7: Relationstyp 1 zu 1 16 Marcus Börger Relationale Datenbanken Datenbank Schemata 2.2.5.1.1 Relationstyp 1 zu 0/1 Optionale Elemente werden oft in getrennten Tabellen gespeichert. Dies hat vor allem bei Optionen, die aus mehreren Feldern bestehen, den Vorteil, daß man Speicherplatz einsparen kann. Im Übrigen sind 1 zu 0/1 Relationen ein Sonderfall von 1 zu 1 Relationen, bei denen es Datensätze gibt, deren einer Teil komplett mit dem Wert NULL belegt ist. Ein Beispiel hiefür sind Studenten und Professoren. Man kann sie in einer Tabelle speichern, wie im Beispiel der Tabelle Personen, da Studenten im Gegensatz zu Professoren jedoch kein Gehalt beziehen, braucht man für sie aber weder Bankverbindungen noch Gehälter speichern. Werden Studenten und Dozenten hingegen in verschiedenen Tabellen gespeichert, so ist es sinnvoll für die gemeinsamen Informationen gleiche Strukturen zu nutzen. Durch den Einsatz entsprechender Techniken (siehe 2.3 Views) kann dann eine Tabelle simuliert werden. Dabei gehen allerdings Key Eigenschaften und gegebenenfalls auch Sortiereigenschaften verloren. PTyp Name Dozenten Adresse PNr PTyp Studenten Name Adresse Login PNr Studenten & Dozenten" PTyp Name Adresse Login PNr Login Gehalt Datum Abbildung 2.8: Relationstyp 1 zu 0/1 vs. Strukturgleichheit Ein weiteres Beispiel ergibt sich aus Abbildung 2.7: Relationstyp 1 zu 1, wenn für Personen, deren Adresse unbekannt ist, keine leeren Datensätze in der Tabelle Adressen erzeugt werden. Zunächst ändert sich an den sichtbaren Strukturen nichts, allerdings ergeben sich aus der Änderung des Relationstyps Konsequenzen bei der Datenorganisation. Werden 1 zu 1 Relationen über Constraints gesichert, so kann ein Löschen eines Datensatzes zur Löschung des entsprechenden Datensatzes genutzt werden. Bei 1 zu 0/1 Relationen geht das nur in einer Richtung. Das Löschen des nicht optionalen Datensatzes führt zum Löschen des optionalen. PNr PTyp PNr 1 = Personen 2 Name Straße Login Datum Adressen und Gehalt Straße2 PLZ Stadt Land Gehalt 0/1 Abbildung 2.9: Relationstyp 1 zu 0/1 Die Abbildung 2.9: Relationstyp 1 zu 0/1 zeigt auch, daß Datenmodellierung nicht immer offensichtlich ist. Ausgehend davon, daß Adressen nur für Dozenten gespeichert werden, wurde auch direkt das Gehalt in die Tabelle Adressen und Gehalt verschoben, da auch nur Dozenten ein Gehalt beziehen. Marcus Börger 17 Datenbank Schemata Relationale Datenbanken 2.2.5.2 Relationstyp 1 zu n Wenn es zu jedem Datensatz einer Tabelle mehrere zugehörige andere Datensätze einer anderen Tabelle geben kann, spricht man von einer 1 zu n Relation. Die 1 Seite bezeichnet man dann als Master- oder Referenztabelle und die andere als Detailtabelle. Dementsprechend werden die Werte in der Mastertabelle als Referenz- oder Key Werte bezeichnet. Die Werte der Detailtabelle werden Foreign Key Werte genannt. Beispiele hierfür sind Vorlesungen, denn jeder Professor soll mehrere Vorlesungen geben. Werden 1 zu n Relationen aus der anderen Richtung betrachtet, so werden sie zu n zu 1 Relationen. Außer der Bezeichnung und dem Betrachtungswinkel ändert sich jedoch nichts. Auch hierzu kann aus Abbildung 2.7: Relationstyp 1 zu 1 ein Beispiel erzeugt werden, indem man für Professoren sowohl Privatadresse, als auch Lehrstuhladresse angibt. In solchen Fällen empfiehlt es sich dann, die einzelnen Datensätze der n Seite der 1 zu n Relation unterscheiden zu können, am einfachsten durch einfügen einer Typ Spalte. In Abbildung 2.10: Relationstyp 1 zu n gibt es zu jedem Datensatz in Personen 2 beliebig viele Datensätze in Adresse 2. In diesem Beispiel sollte jeder Adreßtyp pro Person maximal einmal existieren, damit aus den Spalten PNr und AdrTyp ein eindeutiger Index für die Tabelle Adresse 2 gebildet werden kann. PNr Personen 2 Name Login PTyp PNr 1 = AdrTyp Gehalt Datum Adressen 2 Straße PLZ Ort Land n Abbildung 2.10: Relationstyp 1 zu n 2.2.5.2.1 Relationstyp 1 zu c, c klein Manchmal begrenzt man die maximale Anzahl möglicher Relationen zu einem Datensatz, um die Relationen innerhalb der gleichen Tabelle speichern zu können, was die Abfragen wesentlich schneller macht. Häufiges Beispiel hierzu sind Adreßdaten. Oft reicht es vollkommen aus, Privatadresse und Firmenadresse zu speichern (1 zu 2). Dies veranschaulicht Abbildung 2.11: Mehrfache Felder vs. Relation mit der Tabelle Personen 3, die zwei Adreßfelder enthält (Adresse1, Adresse2). Die oben genannten Vorteile werden allerdings durch den Nachteil erkauft, daß man sehr unflexibel wird, was spätere Erweiterungen angeht. Außerdem wird Speicherplatz verschwendet, wenn selten alle Felder benötigt werden. PNr PTyp Name Personen 3 Adresse1 Adresse2 Login Gehalt Datum Abbildung 2.11: Mehrfache Felder vs. Relation 2.2.5.2.2 Relationsauszeichnung Jede einzelne Beziehung, die aus einem Key Wert und einem Foreign Key Wert gebildet wird, kann ein Label bekommen das genau diese Beziehung beschreibt. Ein Label kann dabei entweder implizit bekannt sein oder es wird explizit abgespeichert. Damit für das Label keine neue Tabelle angelegt werden muß, kann es entweder aus der Zieltabelle hervorgehen, sofern unterschiedliche Referenztabellen möglich sind, oder es wird in der Detailtabelle abgelegt. Ein Beispiel für das getrennte Speichern eines Relationenlabels in der Detailtabelle ist das Feld AdrTyp in Abbildung 2.10: Relationstyp 1 zu n. 18 Marcus Börger Relationale Datenbanken Datenbank Schemata Abbildung 2.12: Relation umgekehrt greift noch mal die Tabelle Personen 3 aus Abbildung 2.11: Mehrfache Felder vs. Relation auf. Hier werden die beiden Adressen allerdings in einer getrennten Tabelle gespeichert. Damit ist möglich, daß eine Adresse mehreren Personen zugeordnet wird. Die Lehrstuhladresse muß daher nicht für jeden Mitarbeiter getrennt abgespeichert werden. Andererseits ist ein implizites Label vorhanden, wenn Adresse1 immer die Privatadresse und Adresse2 immer die Firmenanschrift referenziert. PNr PTyp Personen 3 Privat Firma Name 1 Gehalt Datum n = 1 ANr Login = n Adressen 3 Straße 2 PLZ Straße Stadt Land Abbildung 2.12: Relation umgekehrt 2.2.5.2.3 Relationen zu verschiedenen Tabellen Eine Tabelle kann von mehreren Tabellen referenziert werden und sie kann Relationen zu verschiedenen anderen Tabellen enthalten. Während der erste Fall unproblematisch ist, muß im zweiten Fall beachtet werden, daß eine Spalte keine Relation zu verschiedenen Tabellen realisieren kann, insbesondere kann dazu auch kein Label benutzt werden4 (siehe 2.2.6.2 Foreign Keys). Wenn für Privat/Firmenadressen getrennte Tabellen existieren, müssen auch getrennte Spalten für die verschiedenen Relationen benutzt werden. Haben die Zieltabellen die gleiche Struktur, können diese zu einer virtuellen zusammengefaßt werden (siehe 2.3 Views), dabei gehen ggf. Informationen verloren, hier die Unterscheidung zwischen Privat- und Firmenadresse. Sind diese Informationen abhängig vom Modell, wie die hier vorhandene Zuordnung von Adresse1 für Firmenadressen und Adresse2 für Privatadressen, so können sie in der virtuellen Tabelle eingeblendet werden. PNr PTyp Name 1 „Privat“ „Firma“ AdrTyp Personen 3 Adresse1 Adresse2 Gehalt Datum ANr Privatadressen Straße Straße2 PLZ Stadt Land ANr Firmenadressen Straße Straße2 PLZ Stadt Land ANr Alle Adressen Straße Straße2 Stadt Land = n 1 = Login n PLZ Abbildung 2.13: Relationen zu verschiedenen Tabellen 4 Das könnte zwar mit Triggern realisiert werden, das Ergebnis wäre jedoch kein relationales Datenmodell mehr. Marcus Börger 19 Datenbank Schemata Relationale Datenbanken 2.2.5.2.4 Rekursion Es kommt vor, daß sich Tabellen selbst referenzieren. Solchen Relationen bilden also eine Rekursion. Dabei ist das Einfügen des ersten Wertes problematisch, wenn die Relation gesichert wird. Denn eine leere Tabelle enthält noch keinen zulässigen Wert für das Referenz Feld, da keine Werte für das referenzierte Feld vorhanden sind. Der Wert NULL muß für das Referenzfeld explizit erlaubt sein. Wenn ein Datenbank Managementsystem benutzt wird, daß die Relationen am Ende der Transaktion überprüft, kann auf NULL verzichtet werden. Ein Beispiel hierzu zeigt die Abbildung 2.14: Relationstyp 1 zu n mit Rekursion, in der die modifizierte Tabelle Personen 4 das neue Feld Chef enthält. Damit kann man Mitarbeitern einen Abteilungsleiter, Professoren einen Dekan und Studenten einen Mentor zuordnen. Wird ein Datensatz eingefügt, so muß der Wert für das Referenzfeld Chef bereits als Wert für das referenzierte Feld PNR in einem bestehenden Datensatz vorhanden sein. PNr PTyp Name Personen 4 Login 1 = Gehalt Datum Chef n Abbildung 2.14: Relationstyp 1 zu n mit Rekursion 2.2.5.3 Relationstyp n zu m Eine weitere Klasse von Relationen sind die n zu m Relationen. Hierbei stehen jeweils beliebig viele Datensätze einer Tabelle mit beliebig vielen Datensätzen einer anderen Tabelle in Relation. Es wird nicht von n zu n Relationen gesprochen, da die Anzahl der in Relation zu einander stehenden Datensätzen in beiden Tabellen nicht identisch sein müssen. Bei den verschiedenen Modellen für Adressen trat das Problem auf, daß eine Person mehrere Adressen haben kann, aber eine Adresse auch für mehrere Personen gleich ist. Die bisherigen Lösungen konnten diesem Umstand nur Ansatzweise gerecht werden. Den günstigsten Kompromiß stellt Abbildung 2.12: Relation umgekehrt dar. Hier wird möglichst wenig Speicher genutzt, es gibt jedoch maximal zwei Adressen je Person. Ein weiteres Beispiel für n zu m Relationen stellt die Relation „Studenten besuchen Vorlesungen“ dar. Diese Relation ist dadurch gekennzeichnet, daß sowohl eine Vorlesung von mehreren Studenten besucht wird, als auch ein Student mehrere Vorlesungen besucht. Diese Relationen sind nicht direkt in einer relationalen Datenbank darstellbar. Es sind hierzu zwei 1 zu n Relationen und eine weitere Tabelle notwendig. Die zwischengeschaltete Tabelle muß nicht Zwingenderweise auf die beiden Foreign Keys beschränkt sein. Da jeder Datensatz einer solchen Tabelle exakt einer Relation entspricht, kann man diese Relation in weiteren Spalten auszeichnen. Da n zu m Relation über drei Tabellen realisiert werden, ist der Zugriff darauf langsamer als der Zugriff auf zwei Tabellen, wie er bei Relationen der Form 1 zu n gegeben ist. Personen Name PNr 1 = besuchen PNr VNr n m Veranstaltungen VNr VName = 1 "Studenten besuchen Veranstaltungen" Name PNr VNr VName Abbildung 2.15: Relationstyp n zu m 20 Marcus Börger Relationale Datenbanken Datenbank Schemata Das bisher verwendete Beispiel geht davon aus, daß eine Veranstaltung nur von einem Dozenten gelesen wird, es sieht also nicht den Fall vor, daß sich zwei Dozenten im Wechsel eine Veranstaltung teilen. Um das in der Datenbank zu speichern, wird in der Tabelle Veranstaltungen das Feld PNr entfernt. Denn die Lese Beziehung soll ja ersetzt werden. Es gibt hier nun zwei Möglichkeiten. Entweder wird aus der Tabelle besuchen in Abbildung 2.15: Relationstyp n zu m eine Tabelle "lesen und besuchen", indem man die einzelnen Beziehungen mit dem Wert liest oder besucht auszeichnet. Oder man zerlegt die Tabelle in eine Tabelle besuchen und eine Tabelle lesen wie es Abbildung 2.16: Doppelte n zu m Relation zeigt. In diesem Fall kommt man gänzlich ohne direktes Speichern der Information liest/besucht aus, denn diese Information ergibt sich implizit aus der Tabelle. Da man aber zwei Tabellen benutzt, sind natürlich auch alle Hilfsstrukturen wie Indizes und Keys doppelt vorhanden. Daher führt dieses Vorgehen selten zu Speicherersparnissen. Aber es kann einen anderen Gewinn bringen. Zum einen muß kein weiteres Feld ausgewertet werden, um die Art der Beziehung zu kennen. Zum anderen kann man die Zweiteilung nutzen, um den Zugriff auf eine der beiden Tabellen zu Beschleunigen, wenn eine der beiden Tabellen wenige Einträge enthält aber häufig benötigt wird. Größere RDBMS bieten oft Möglichkeiten Einfluß auf die Zugriffsgeschwindigkeit zu nehmen, meist auf Kosten von Speicherplatz. Personenen Name PNr 1 besuchen PNr VNr = lesen PNr VNr n n 1 n n = = Veranstaltungen VNr VName = 1 1 "Studenten besuchen Veranstaltungen" Name PNr VNr VName "Dozenten lesen Veranstaltungen" Name PNr VNr VName Abbildung 2.16: Doppelte n zu m Relation Eine weitere Alternative ist es, die Tabelle Personen in Studenten und Dozenten aufzuteilen. Hierbei geht im Beispiel dann allerdings die Möglichkeit verloren, daß ein Dozent auch eine Veranstaltung besuchen kann, es sei denn man legt für ihn zwei Datensätze an. Es entstehen auch bei dieser Lösung wieder zwei n zu m Relationen, da es nicht erlaubt ist eine Relation zu zwei verschiedenen Tabellen herzustellen. Insbesondere kann hierzu auch kein Label benutzt werden. Studenten Name PNr 1 besuchen PNr VNr = n n Veranstaltungen VNr VName = 1 "Studenten besuchen Veranstaltungen" Name PNr VNr VName 1 lesen VNr PNr = n n Dozenten PNr Name = 1 "Dozenten lesen Veranstaltungen" VName VNr PNr Name Abbildung 2.17: Parallele n zu m Relationen Marcus Börger 21 Datenbank Schemata Relationale Datenbanken 2.2.6 Keys Wie bereits in 2.2.4 Indizes erwähnt, sind eindeutige Indizes in der Lage Datensätze zu identifizieren, daher nennt man sie auch Datensatzschlüssel oder kurz Schlüssel, im Englischen also Keys. Keys spielen in Relationalen Datenbanken eine wichtige Rolle, da über sie die Relationen definiert werden. 2.2.6.1 Primary Keys In relationalen Datenbanken ist jeder Datensatz eindeutig gekennzeichnet. Diese eindeutige Kennzeichnung wird durch den Primary Key realisiert. Man kann ihn entweder als Teil einer Tabelle definieren oder von der Datenbank generieren lassen. Letzteres passiert genaugenommen immer dann, wenn kein Primary Key explizit definiert wird. In fast allen Datenbanken legt der Primary Key zusätzlich fest, daß seine Werte nicht NULL sein dürfen. Ohne diese Festlegung darf NULL als Wert des Primary Keys dann exakt einmal in der Tabelle vorhanden sein. Wird der Primary Key bei der Modellierung hingegen explizit definiert, so kann er über einem oder mehreren Attributen definiert sein. Ein weiterer Index ist für diese Attributkombination nicht mehr notwendig, da der Primary Key immer auch ein Index ist. Es empfiehlt sich den Primary Key möglichst kurz zu definieren, um den Zugriff auf ihn zu beschleunigen. Da alle Tabellenzugriffe über den Primary Key abgewickelt werden, beschleunigt man so alle Zugriffe auf die zugehörige Tabelle. Es gibt verschiedene Möglichkeiten Primary Keys zu erzeugen: 22 • Attribute einer Tabelle sind häufig bereits eindeutig (siehe auch 2.2.6.4 Anerkannte Standards). Wenn die einzelnen Werte jetzt noch wenig Platz zur Speicherung benötigen so eignen sie sich besonders. • Jedem Datensatz wird eine eindeutige Zahl zugewiesen. Hierzu gibt es von vielen Datenbanken Unterstützung. Einige Datenbanken bieten sogenannte Autoinkrement Werte an, die bei jedem neuen Datensatz um den Wert 1 erhöht werden. Nachteilig ist dabei, daß es einen weiteren eindeutigen Schlüssel geben muß, um den Datensatz nach dem ersten einfügen in der Tabelle finden zu können. Andere Datenbanken bieten sogenannte Sequences, die bei jedem Zugriff eindeutige Werte liefern können. Wird in der gesamten Anwendung nur eine Sequence genutzt, so hat das den Nachteil, daß es das System verlangsamen kann, bei Systemen, die seltener neue Datensätze anlegen, lassen sich so Systemweit eindeutige Primary Keys generieren. Eine besondere Stellung nimmt hier PostgreSQL ein, da hier Autoinkrement Werte durch Sequences realisiert werden, die automatisch angelegt werden. • Bei den Verknüpfungstabellen von n zu m Relationen werden beide Foreign Keys zu einem Primary Key zusammengefaßt (siehe auch 2.2.5.3 Relationstyp n zu m und 2.2.6.2 Foreign Keys). • Oft finden bei der Erzeugung von Datensätzen Algorithmen Verwendung, die bereits eindeutige Werte generieren, die als Primary Key genutzt werden können. • Manche Betriebssysteme/APIs bieten Funktionen, die eindeutige Werte generieren. Diese sind oft weltweit eindeutig, meist jedoch relativ lang. • Die Verbindung von Foreign Keys und einem weiteren Typfeld wird ebenfalls häufig als Primary Key genutzt. In Abbildung 2.10: Relationstyp 1 zu n könnten die Spalten PNr und AdrTyp den Primary Key bilden. Marcus Börger Relationale Datenbanken Datenbank Schemata Intern dient der Primary Key wie bereits erwähnt dem Auffinden der Datensätze. Dabei werden im Primary Key die Positionen der einzelnen Datensätze innerhalb der Tabelle gespeichert. Wenn die Länge der Datensätze variabel ist, so wird auch die Länge der einzelnen Datensätze gespeichert. Dadurch ist es möglich eine Tabelle linear in einer Datei abzulegen und außerdem können Lücken innerhalb der Datendatei aufgefunden und ggf. mit neuen Datensätzen aufgefüllt werden. Bei Datensätzen mit konstanter Länge ist das Speichern der Länge der einzelnen Datensätze natürlich nicht erforderlich. Im folgenden werden Systeme betrachtet, die den Primary Key in einer eigenen Datenstruktur Speichern. Die folgende Abbildung 2.18: Primary Key zeigt den Primary Key, dessen Spalte Position auf die jeweiligen Datensätze in der Tabelle Veranstaltungen zeigt. Die Spalte Datensatz dient hier nur der Übersicht und repräsentiert die Reihenfolge in der die Datensätze eingefügt wurden, sie ist in einem realen DBMS nicht erforderlich. Allerdings verwenden Reale DBMS oft zusätzliche Felder in den Datensätzen und den Primary Key Listen, die für interne Tabellenreorganisationen benutzt werden. Im Beispiel sind die Längen der Datensätze nicht angegeben, da sie hier nicht von Interesse sind: Primary Key Datensatz Position Länge 1 2 3 4 1 2 3 4 VNr ? ? ? ? 1 2 3 4 Veranstaltungen PNr VName VZeit 100000 100000 100001 100001 Einführung Modellierung SQL-DDL SQL-DML Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 VOrt H1 H2 H3 H1 Abbildung 2.18: Primary Key Die Abbildung 2.18: Primary Key läßt noch nicht ganz den Sinn der Datensatzidentifikation über den Primary Key erkennen, da die Datensätze innerhalb der Tabelle Veranstaltungen nach den Werten VNR, also den Primary Key Werten sortiert sind. In der nächsten Abbildung wurden die Datensätze in einer anderen Reihenfolge eingegeben. Daher stimmt die Reihenfolge in der Tabelle nicht mehr mit der Reihenfolge überein, die sich aus den Primary Key Werten ergibt: Primary Key Datensatz Position Länge 1 2 3 4 1 3 4 2 VNr ? ? ? ? 1 4 2 3 Veranstaltungen PNr VName VZeit 100000 100001 100000 100001 Einführung SQL-DML Modellierung SQL-DDL Mo, 10:00 Di, 10:00 Di, 12:00 Mo, 10:00 VOrt H1 H1 H2 H3 Abbildung 2.19: Primary Key bei ungeordneter Tabelle Als nächstes folgt die Einbeziehung eines Index. Dieser enthält nun nur noch Verweise auf die Position im Primary Key. Wird etwa der Datensatz Nummer drei im Index VZeit, VOrt benötigt, so wird zunächst die Position im Primary Key gelesen. Nach Lesen der Position aus dem Primary Key kann dann der Datensatz innerhalb der Tabelle gelesen werden. Index D.S. Pos. 1 2 3 4 1 3 4 2 Primary Key Pos. L. 1 3 4 2 ? ? ? ? VNr 1 4 2 3 Veranstaltungen PNr VName VZeit 100000 100001 100000 100001 Einführung SQL-DML Modellierung SQL-DDL Mo, 10:00 Di, 10:00 Di, 12:00 Mo, 10:00 VOrt H1 H1 H2 H3 Abbildung 2.20: Primary Key und Index (VZeit, VOrt) Indizes und Keys können in einer Tabelle gespeichert werden, denn sie benutzen Datenstrukturen fester Länge. Die Position einzelner Index/Keywerte läßt sich also mittels der Multiplikation Datensatznummer * Datensatzlänge berechnen. Daher benötigen DBMS keine weitere Organisationsform. Der Zugriff auf einen Datensatz über einen Index bewirkt intern also den Zugriff auf drei Tabellen. Marcus Börger 23 Datenbank Schemata Relationale Datenbanken 2.2.6.2 Foreign Keys Eine sehr wichtige Rolle im Zusammenhang mit Relationen spielen Foreign Keys. Sie legen fest, auf welchen Key in welcher Tabelle sich die Werte einer Spalte beziehen. Man sagt hierzu auch, daß ein Foreign Key einen Key einer anderen Tabelle referenziert (siehe 2.2.7 Referenzielle Integrität). Berücksichtigt die Datenbank das Konzept Foreign Key vollständig, so können als Werte für Spalten, die als Foreign Key definiert sind, nur solche benutzt werden, die in der referenzierten Tabelle vorhanden sind oder aber der Wert NULL. In einigen Datenbanken beziehen sich Foreign Keys immer auf den Primary Key der referenzierten Tabelle. Immer jedoch bezieht sich ein Foreign Key aber auf exakt eine Tabelle. Daher werden in Abbildung 2.17: Parallele n zu m Relationen auch die beiden Tabellen lesen bzw. besuchen benötigt. Unterstützt die Datenbank auch Constraints, so ist es möglich dafür zu sorgen, daß Relationen zwischen Datensätzen, die über Foreign Key Beziehungen bestehen gesichert werden. Sicherung bedeutet hierbei, daß die Datenbank die Konsistenz der Daten bezüglich dieser Relation gewährleistet. Hierzu kann beim Erzeugen der zugehörigen Tabellen bereits festlegt werden, wie sich die Datenbank verhalten soll, wenn durch eine Aktion die Konsistenz verletzt wird. Es gibt dabei unter anderen die beiden Möglichkeiten kaskadierendes Löschen und Abbrechen. Wird für einen Foreign Key kaskadierendes Löschen eingestellt, so werden vor dem Löschen eines Key Wertes alle Datensätze gelöscht, die diesen Wert als Foreign Key benutzen. 2.2.6.3 Alternate Keys Jeder weitere eindeutige Index wird auch als Alternate Key bezeichnet. Einige Datenbank Management Systeme erlauben es Relationen über Alternate Keys zu definieren. Das macht einige Aufgaben zwar einfacher oder besser verständlich, notwendig ist das jedoch nicht. Denn bei jedem Zugriff über den Primary Key stehen alle Felder beider beteiligten Tabellen zur Verfügung, insbesondere auch die Alternate Key Felder. 2.2.6.4 Anerkannte Standards Der Modellierung einer Datenbank sollte immer eine gründliche Analyse der zu speichernden Daten vorausgehen. Wenn hierbei Standards auftauchen, so ist es immer empfehlenswert diese möglichst ohne Änderung zu verwenden. Innerhalb einer Adreßdatenbank wird so zum Beispiel auch das Land zu jeder Adresse gespeichert. Hierzu gibt es die Norm ISO 3166 [ISO3166], die Ländercodes und Ländernamen international eindeutig festlegt. Die vorgenannte Norm ist im Internet als Textdatei verfügbar und läßt sich mittels einfacher Konvertierungen in eine Datenbank einlesen. Danach reicht es zu jeder Adresse den Ländercode zu speichern. Als Ergebnis erhält man weltweit eindeutige und gültige Ländernamen. 2.2.7 Referenzielle Integrität Bei der referenziellen Integrität geht es um die implizite Kontrolle und Steuerung von Referenzen durch das Datenbank Management System. Sind alle Foreign Key Werte einer Tabelle dereferenzierbar, daß bedeutet es existieren die referenzierten Werte in der referenzierten Tabelle, so gilt die Relation, die durch den Foreign Key bestimmt ist, als integer. Gilt das für alle Relationen einer Datenbank, so ist die referenzielle Integrität der Datenbank gewährleistet, andernfalls ist sie verletzt. Es sei hier nochmals auf Constraints hingewiesen, die eine Methode zur automatischen Überwachung und Gewährleistung der referenziellen Integrität bereitstellen. Sie übernehmen die im folgenden beschriebenen naheliegenden Konzepte. 24 Marcus Börger Relationale Datenbanken Datenbank Schemata Um die einzelnen Vorgehensweisen zu verdeutlichen, wird das in der Abbildung 2.21: Einfaches Datenmodell der Universität dargestellte Datenmodell zusammen mit den Ausgangsdaten, wie sie in der Abbildung 2.22: Ausgangssituation dargestellt werden, benutzt: Personen Name PNr besuchen PNr VNr 1 = n n 1 n = VNr = PNr Veranstaltungen VName VZeit VOrt 1 Abbildung 2.21: Einfaches Datenmodell der Universität Personen Name PNr Ebert K. Zucker G. Meier A. Kühn H. Muster M. 100000 100001 100002 100003 100004 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 VNr 1 2 3 4 PNr 100000 100000 100001 100001 Veranstaltungen VName VZeit Einführung Modellierung SQL-DDL SQL-DML Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 VOrt H1 H2 H3 H1 Abbildung 2.22: Ausgangssituation 2.2.7.1 Restrict Das Löschen oder Ändern von referenzierten Datensätzen wird mit dem Verhalten RESTRICT verhindert. Existiert ein Datensatz dessen Foreign Key den zu löschenden oder zu ändernde Datensatz referenziert, wird die Aktion abgebrochen. In Abbildung 2.22: Ausgangssituation können nur Datensätze in der Tabelle besuchen gelöscht oder geändert werden, da alle anderen Datensätze referenziert werden. Somit ist es nicht möglich den Datensatz des Dozenten Ebert K. zu löschen, da die beiden Veranstaltungen mit den VNr Werten 1 und 2 den gleichen Wert für PNr besitzen. 2.2.7.2 Cascade CASCADE wirkt sich für Lösch- bzw. Änderungsoperationen sehr unterschiedlich aus. 2.2.7.2.1 Cascade bei Änderungen Das Ändern eines Key Wertes hat hingegen das Ändern aller Foreign Key Werte zur Folge, die diesen Wert referenzieren. Notwendige Änderungen zum Erhalt der Relationen werden in anderen Tabellen automatisch vorgenommen. Damit haben Änderungen innerhalb der Datenbank also keinerlei Auswirkung auf die in den Relationen gespeicherten Zusammenhänge der Datensätze. Wenn die Relation zwischen PNr in Veranstaltungen und PNr in Personen auch für Änderungen auf CASCADE gestellt wird, dann bewirkt das Ändern der PNR 100000 zu 1 in der Tabelle Personen automatisch das Ändern der diese referenzierenden PNr Werte in der Tabelle Veranstaltungen. Das Ergebnis ist in Abbildung 2.23: Relationen und Ändern mit CASCADE zu sehen. In der Tabelle Veranstaltungen darf die PNr hingegen nicht auf einen Wert gesetzt werden, der in der Tabelle Personen nicht existiert, ausgenommen NULL. Personen Name PNr Ebert K. Zucker G. Meier A. Kühn H. Muster M. 1 100001 100002 100003 100004 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 VNr PNr 1 2 3 4 1 1 100001 100001 Veranstaltungen VName VZeit Einführung Modellierung SQL-DDL SQL-DML Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 VOrt H1 H2 H3 H1 Abbildung 2.23: Relationen und Ändern mit CASCADE Marcus Börger 25 Datenbank Schemata Relationale Datenbanken 2.2.7.2.2 Cascade bei Löschen Mittels Cascade werden Datensätze, deren Foreign Key Werte nicht mehr dereferenzierbar sind, gelöscht. Das ist mit der Garbage Collection moderner Programmiersprachen wie Java und C# vergleichbar. Datenbank Management Systeme führen dabei die notwendige Löschoperationen automatisch aus, wenn Datensätze gelöscht werden. Das bedeutet, daß durch eine Löschoperation im Extremfall die gesamte Datenbank geleert werden kann. Die Abbildung 2.24: Löschen mit CASCADE veranschaulicht das Ergebnis der Löschoperation für die Person mit der PNr 100000, also das Löschen des Datensatzes für den Dozenten Ebert K. Wenn kein Dozent die Veranstaltung übernimmt und keine weiteren Daten gespeichert werden macht es Sinn, die dann nicht mehr benötigten Daten auch gleich zu löschen. Sind in den betroffenen Datensätzen hingegen Daten gespeichert, die noch benötigt werden, hier wären etwa Noten denkbar, dann ist dieser Ansatz nicht benutzbar. Wenn andererseits die Personalhierarchie gespeichert wird, also Student/Dozent Beziehungen und Dozent/Dozent Beziehungen mit einem Institutsleiter. So hätte das Löschen des Institutsleiters das leeren der Datenbank zur Folge. Personen Name PNr besuchen PNr VNr Veranstaltungen VName VZeit VNr PNr Zucker G. Meier A. Kühn H. Muster M. 100001 100002 100003 100004 100002 100002 3 4 3 4 100001 100001 SQL-DDL SQL-DML Mo, 10:00 Di, 10:00 VOrt H3 H1 Ebert K. 100000 100002 100004 100003 100004 2 2 1 1 1 2 100000 100000 Einführung Modellierung Mo, 10:00 Di, 12:00 H1 H2 Abbildung 2.24: Löschen mit CASCADE 2.2.7.3 Set NULL Ändern oder Löschen eines Key Wertes bewirkt, daß zugehörige Foreign Key Werte auf den Wert NULL gesetzt werden. Damit gehen zwar alle Informationen über die in den Relationen gespeicherten Informationen verloren aber die Datensätze bleiben unverändert erhalten. Dieses Verhalten kann mit Triggern nachgebildet werden, falls der Default Wert NULL ist, kann auch das Verhalten SET DEFAULT benutzt werden. Werden die Relationen über SET NULL gesichert und der Datensatz des Dozenten Ebert K. gelöscht, so ist lediglich für seine Veranstaltungen kein Dozent mehr bekannt. Die Information darüber, welche Studenten diese Veranstaltungen besuchen, bleiben erhalten. Wenn alle übrigen Foreign Key Werte, wie in diesem Beispiel gültige Referenzen darstellen, oder anders ausgedrückt nur die gerade betroffenen den Wert NULL erhalten, so kann dies benutzt werden, um sehr schnell alle betroffenen Datensätze einem andern Dozenten zu zuordnen. Allerdings müßte man dann auch gleichzeitige Zugriffe auf die Datenbank verbieten, um zu verhindern, daß gleichzeitig weitere NULL Werte eingetragen werden. Eleganter ist es also die Neuen Beziehungen vor dem Löschen einzutragen. Personen Name PNr Zucker G. Meier A. Kühn H. Muster M. 100001 100002 100003 100004 Ebert K. 100000 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 VNr PNr 1 2 3 4 NULL NULL 100001 100001 Veranstaltungen VName VZeit Einführung Modellierung SQL-DDL SQL-DML Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 VOrt H1 H2 H3 H1 Abbildung 2.25: Relationen und Set NULL 26 Marcus Börger Relationale Datenbanken Datenbank Schemata 2.2.7.4 Set Default Durch Ändern oder Löschen eines Key Wertes werden zugehörige Foreign Key Werte auf den Default Wert gesetzt. Bei hierarchischen Daten kann man hierdurch Datensätze sehr einfach nach Änderungen dem höchsten Element der Hierarchie zuordnen. Eine Gefahr besteht hier im Verlust des Default Wertes. Wenn in der Ursprungstabelle der Default Wert nicht mehr vorhanden ist, so kann keine Operation mehr ausgeführt werden, da das Anwenden der Set Default Regel zu einer Verletzung der referenziellen Integrität führen würde. Das Ergebnis ist ein Verhalten das RESTRICT nachempfindet. Auch dieses Verhalten kann mit Triggern simuliert werden. Wenn der Default Wert NULL ist, kann auch SET NULL eingesetzt werden. Wird im Beispiel der Datensatz des Dozenten Ebert K. gelöscht und die Referenz zwischen Veranstaltungen und Personen über Set Default 100001 in Veranstaltungen gesi- chert, so übernimmt der Dozent Zucker G. automatisch alle Veranstaltungen, bei denen der Dozent gelöscht oder sein PNr geändert wird. Wenn der Wert 100000 Default für PNr in der Tabelle Veranstaltungen ist, so kann der Datensatz des Dozenten Ebert K. nicht mehr gelöscht werden. Denn diese Operation hätte zur Folge, daß den Datensätzen der ersten beiden Veranstaltungen die PNr 100000 zugewiesen würde und somit eine ungültige Referenz entstünde. Personen Name PNr Zucker G. Meier A. Kühn H. Muster M. 100001 100002 100003 100004 Ebert K. 100000 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 VNr PNr 1 2 3 4 100001 100001 100001 100001 Veranstaltungen VName VZeit Einführung Modellierung SQL-DDL SQL-DML Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 VOrt H1 H2 H3 H1 Abbildung 2.26: Relationen und Set DEFAULT 2.2.7.5 Löschen bei Änderung Denkbar ist auch das automatische Löschen von Datensätzen deren Relationsursprung sich geändert hat. Diese verhalten wird aber zur Zeit von keinem Datenbank Management System unterstützt und kann nur durch den Einsatz von Triggern realisiert werden. Das folgende Beispiel zeigt, daß hierbei das Ändern eines Veranstaltungsnamen noch nicht das Löschen der zugehörigen Datensätze zur Folge hätte, auch wenn sich das genauso mit Triggern realisieren ließe. Die Aktion würde ebenfalls nicht ausgeführt, wenn der gesamte Datensatz neu geschrieben wird, sich der Primary Key, also der Ursprung der Relation, nicht ändert. Vielmehr würde ausschließlich das Verändern des Ursprungs zur Aktion führen. Hier würde zum Beispiel das Ändern der Veranstaltungsnummer 4 in 5, zum Löschen des entsprechenden Datensatzes in der Tabelle besuchen führen. Im beschriebenen Szenario ist es sinnvoll die Besucherdatensätze zu löschen, wenn sich eine Vorlesung grundlegend ändert. Allerdings ist bei derartigen Änderungen immer die Frage ob sich der Datensatz ändert oder ein Datensatz gelöscht und ein neuer Datensatz erstellt wird, der einen anderen Wert für den Primary Key erhält. Personen Name PNr Ebert K. Zucker G. Meier A. Kühn H. Muster M. 100000 100001 100002 100003 100004 besuchen PNr VNr 100002 100002 100004 100003 100004 2 3 2 1 1 100002 4 VNr PNr 1 2 3 5 100000 100000 100001 100001 Veranstaltungen VName VZeit Einführung Modellierung SQL SQL-DML Mo, 10:00 Di, 12:00 Mo, 10:00 Di, 10:00 VOrt H1 H2 H3 H1 Abbildung 2.27: Relationen und Löschen bei Änderung Marcus Börger 27 Datenbank Schemata Relationale Datenbanken 2.3 Views Eine View kann die folgenden Aufgaben leisten: • Filtern von Information: Eine View kann Teile eines Datensatzes ausblenden. Im Beispiel sollen Studenten keine Angaben zu anderen Studenten erhalten. Weiterhin sollen Studenten und Dozenten nur ihre eigenen Daten sehen können. Hierzu kann eine View erstellt werden, die für Studenten und Dozenten die Felder Adresse, Login, Gehalt und Datum (Einschreibung bzw. Einstellung) ausblendet: PNr PTyp Name Personen Adresse Login Gehalt Datum Nur eigener Datensatz "Personen aus Sicht von Studenten & Dozenten" PNr PTyp Name Adresse Login Abbildung 2.28: View als Filter • Verknüpfen von Informationen: Die vorhandenen Informationen können über Relationen verknüpft werden. Dabei können neue Informationsansichten entstehen. Beispielsweise werden Personen und Vorlesungen über PNr verknüpft, um anzuzeigen, welcher Dozent welche Vorlesung liest: Veranstaltungen PNr VName VZeit VNr Personen PNr Name VOrt = VNr PNr "Was, Wann, Wo, Wer?" VName VZeit VOrt Name Abbildung 2.29: View über Join • Erzeugen von zusätzlichen Informationen: Wenn die Liste aller Vorlesungen durchsucht bzw. angezeigt wird, kann die Datenbank dabei die Datensätze zählen und das Ergebnis als View liefern. Eine View könnte etwa zählen, wie viele Vorlesungen ein Dozent hält. • Sicherheit (Access Control): Anwendergruppen können eingeschränkten Zugriff auf die Datenbank haben. Hier ist nicht nur Ausblenden von Informationen gemeint, sondern Zugriffssteuerung. So dürfen im Beispiel Studenten nur lesen und Gehälter dürfen nur von der Verwaltung geändert werden. • Zurückschreiben: Generierte Daten, die nicht in der Datenbank gespeichert werden, können nicht zurückgeschrieben werden, wie etwa die Anzahl der Vorlesungen aus obigem Beispiel. Problematisch ist das Zurückschreiben über Views auch, wenn diese Informationen ausblenden. Es muß dann ein Verfahren zur Berechnung der gefilterten Daten existieren. Views die über Relationen definiert werden, die nicht im Konzeptuellen Schema definierbar sind, werden virtual Views genannt. Werden Views gespeichert, so nennt man sie materialized Views. Diese Views müssen bei Änderungen in einer der verwendeten Tabellen aktualisiert werden. 28 Marcus Börger Relationale Datenbanken Datenbank Schemata 2.4 Aufgaben Soweit nicht anders angegeben beziehen sich die folgenden Aufgaben auf das Datenmodell aus Abbildung 2.21: Einfaches Datenmodell der Universität. 2.1 Teilen Sie den Namen für Personen in seine Bestandteile auf und modifizieren Sie die Tabelle aus Abbildung 2.3: Tabelle Personen entsprechend. Ist es dabei möglich bestimmte Namensteile durch Listen zu Beschränken? Diskutieren Sie Ihr Ergebnis. 2.2 In Aufgabe 2.1 wurde der Name in seine Bestandteile aufgeteilt, wobei der Titel bzw. die Anrede einen Teil ausmachen sollte. Leider verwenden die verschiedenen Benutzer in solchen Situationen unterschiedliche Anreden. Lösen Sie dieses Problem durch die Verwendung einer Tabelle in der alle erlaubten Anreden gespeichert sind. 2.3 Veranstaltungen haben im allgemeinen eine Anfangszeit und eine Zeitliche Dauer. Das läßt sich durch Anfangszeit und Dauer oder Anfangs/Endzeit darstellen. Ergänzen Sie die Tabelle und erklären Sie die Unterschiede (Welche Berechnungen lassen sich mit welcher Darstellung besser durchführen). 2.4 Zu jeder Veranstaltung gehören neben den Zeiten auch ein Anfangsdatum und ein Enddatum. Ergänzen Sie diese Angaben. 2.5 Häufig ist es so, daß Veranstaltungen zu verschiedenen Zeiten an unterschiedlichen Orten stattfinden. So könnte eine Veranstaltung an drei Wochentagen zu verschiedenen Zeiten in jeweils anderen Räumen gehalten werden. Ergänzen Sie das Modell erstens indem Sie eine maximale Anzahl von 3 Terminen zulassen und zweitens indem Sie beliebig viele Termine zulassen. Erklären Sie Vor- und Nachteile beider Lösungen. 2.6 Ergänzen Sie das Modell um die folgenden Beziehungen. Ein Student hat einen Dozenten als Tutor. Alle Dozenten sind entweder einem Lehrstuhl zugeordnet oder Sie sind Lehrstuhlinhaber. Jeder Lehrstuhl gehört einem Fachbereich an und über allen Fachbereichen steht der Dekan. Das Speichern der Lehrstühle ist hier noch nicht notwendig, die Struktur zu erkennen reicht aus (siehe Abbildung 2.14: Relationstyp 1 zu n mit Rekursion). 2.7 Ausgehend von Aufgabe 2.6 sei angenommen, daß Ebert K. Dekan und Zucker G. Fachbereichsleiter 1 seien und alle Studenten den Dozenten Zucker G. als Tutor haben. Zeichnen Sie die Abhängigkeiten, indem Sie die Relationen in den gefüllten Tabellen eintragen. Zeigen Sie weiterhin, daß bei entsprechender Definition der Relationen (siehe 2.2.7 Referenzielle Integrität) durch Löschen des Datensatzes des Dekans die Tabellen Personen, Veranstaltungen und besuchen geleert werden. 2.8 Legen Sie Bedingungen fest, mit denen es möglich ist, die Anzahl der Datensätze in einer Tabelle zu beschränken. Versuchen Sie mittels der von Ihnen gefundenen Techniken eine Warteschlange mit festgelegter Länge zu realisieren. Übertragen Sie dabei möglichst viele Teilaufgaben der Warteschlangensteuerung auf das Datenbank Management System. Marcus Börger 29 Modellierung Relationale Datenbanken 3 Modellierung Warum sollte man seine Daten überhaupt modellieren, wenn man seine Daten auch einfach auf Karteikarten oder in einer Textdatei speichern kann? Sicher kann man Daten auf Karteikarten oder in Textdateien speichern aber man kann sie dann immer nur genau aus dem Blickwinkel betrachten unter dem sie angelegt wurden, und eine Sortierung ist immer nur nach der Ablagesortierung sinnvoll. Zudem ist eine solche Speicherung bei größeren Datenmengen nicht mehr sinnvoll handhabbar. Das Kapitel 2.1 Das Physische Schema zeigte, daß Adreßlisten durchaus in reinen Textdateien abgelegt werden können. Hier nun die Textdatei zu Abbildung 2.3: Tabelle Personen, Abbildung 2.4: Tabelle Veranstaltungen und Abbildung 2.5: Tabelle besuchen: Ebert, K. 10.000 DM 13.9.1980 liest Einführung, Modellierung Zucker, G. 11.000 DM 5.3.1982 liest SQL-DDL, SQL-DML Meier, A. 1.10.1998 bescuht Modellierung, SQL-DDL, SQL-DML Kühn, H. 1.10.1999 besucht Einführung Muster, M. 1.10.1999 besucht Einführung, Modellierung Abbildung 3.1: Die UNI in einer Textdatei Das Beispiel macht sehr deutlich, daß Änderungen kompliziert sind. Auch das Filtern oder Umsortieren ist offensichtlich aufwendig. So ist es an Universitäten beispielsweise nicht erlaubt Noten und Namen öffentlich aus zu hängen. Daher würde ein Lehrstuhl nach einer Prüfung einfach eine Kopie der womöglich nach Namen sortierten Datei erstellen, in der nur die Namen und Nummern der Studenten enthalten sind. In dieser Liste müßten nun die Noten für jeden Studenten an das Ende seiner Zeile angehängt werden. Das Prüfungsamt würde die vollständige Liste erhalten und für den Aushang würde man einfach die Spalte mit den Namen entfernen. Das Ergebnis wäre, das nun jeder Student die komplette Liste durchsucht, bis er seine Nummer gefunden hat5. Einfacher wäre die Noten direkt nach der Korrektur in die Datenbank einzugeben und anschließend eine nach Nummern sortierte Liste aus zu hängen. Andererseits haben solche Textdateien durchaus ihren Wert, denn ja nach Bedarf kann eine entsprechend aufbereitete Datenpräsentation, auch in Form solcher Textdateien, sehr sinnvoll sein. Aufgabe der Datenbankmodellierung ist es daher ein Modell zu finden, daß alle geforderten Ansichten erzeugen kann. Das Wichtigste bei der Modellierung einer Datenbank ist also die Analyse der zu speichernden Daten und der zu ermittelnden Daten, sowie der daraus resultierenden Strukturen. Grundsätzlich sollte eine Datenbank keine redundanten Daten enthalten, insbesondere keine die sie berechnen kann. Aber keine Regel ohne Ausnahme; wenn das Berechnen von Daten sehr aufwendig ist, kann es sehr wohl angebracht sein, redundante Daten zu speichern. Da Daten oft mit verschiedenen Strukturen gespeichert werden können, ist es wichtig sich schon vor der Modellierung Gedanken über die spätere Anwendung zu machen. Hierbei sollte man spätere Erweiterungen nicht außen vor lassen, da ein nachträgliches Ändern der Datenstrukturen meist nicht möglich ist oder mit großen Änderungen in den bestehenden Anwendungen verbunden ist. Oft entspricht der Aufwand solcher Änderungen dem Aufwand einer kompletten Neuerstellung der Anwendung. Es ist also insbesondere zeitgünstiger und damit kostensparender sich bei der Modellierung der Datenbank Zeit zu lassen und das Modell theoretisch zu testen. 5 Hier soll keiner sagen, daß es das nicht geben würde. Der Lehrstuhl II für Informatik der RWTH-Aachen hat genau das bei einer Klausur gemacht, an der etwa 200 Studenten teilgenommen haben. Man stelle sich das Chaos vor. 30 Marcus Börger Relationale Datenbanken Modellierung 3.1 Normalformen Theoretiker haben nicht nur die Konzepte der relationalen Datenbanken erstellt, sie haben auch gleich Regeln zu deren Modellierung geliefert. Diese Regeln berücksichtigen die relationalen Konzepte und so hilft ihre Anwendung Datenbanken zu modellieren, die effizient in einem relationalen Datenbank Management System eingesetzt werden können. Und gerade bei den ersten Modellen sind sie sehr hilfreich und man erreicht mit ihnen saubere Konzepte. Diese Regeln werden hier zunächst als Anwendung auf die bisherigen Daten erklärt. 3.1.1 Erste Normalform Die erste Normalform verlangt, daß für alle gleichartigen Daten eine eigene Tabelle angelegt wird und daß jede Tabelle einen Primary Key erhält: • Durchsehen und ordnen der Daten. Wenn sich hierbei eine Struktur erkennen läßt, wird eine Tabellenstruktur gesucht, die das gefundene Modell nachbilden kann. • Eine geeignete Spalte wird als Primary Key gewählt oder es wird eine neue Spalte angelegt, die dann Primary Key wird (siehe 2.2.6.1 Primary Keys). • Spalten mit gleichartigem Inhalt werden eliminiert. Diese Regel unterbindet also 1 zu n Beziehungen innerhalb einer Spalte. Für die Relation „Studenten besuchen Veranstaltungen“ bedeutet diese Regel, daß es für jeden Studenten genau so viele Zeilen geben wird, wie er Vorlesungen besucht. PNr Name Gehalt Datum liest/besucht Vname ========-------------------------------------------------============ 100000 Ebert, K. 10.000 DM 13.9.1980 liest Einführung 100000 Ebert, K. 10.000 DM 13.9.1980 liest Modellierung 100001 Zucker, G. 11.000 DM 5.3.1982 liest SQL-DDL 100001 Zucker, G. 11.000 DM 5.3.1982 liest SQL-DML 100002 Meier, A. 1.10.1998 besucht Modellierung 100002 Meier, A. 1.10.1998 besucht SQL-DDL 100002 Meier, A. 1.10.1998 besucht SQL-DML 100003 Kühn, H. 1.10.1999 besucht Einführung 100004 Muster, M. 1.10.1999 besucht Einführung 100004 Muster, M. 1.10.1999 besucht Modellierung Abbildung 3.2: Erste Normalform Wie Abbildung 3.2: Erste Normalform zeigt, schaffen diese Regeln offensichtlich Redundanzen innerhalb der Tabellen. Auch sind die hierbei entstehenden Tabellen noch unabhängig von einander, daß heißt es existieren noch keine Relationen. Die Spalte PNr übernimmt hier die Funktion des Primary Key. Sie wurde den gegebenen Informationen zugefügt, da sich aus den Ausgangsdaten keine Spalte mit den Primary Key Eigenschaften ergibt. Einzig die Spalte Name wäre in Frage gekommen, doch kann es durchaus vorkommen, daß zwei Personen den gleichen Namen besitzen. Das Format der Spalte PNr wurde hierbei gewählt, damit alle Personen eine 6 stellige Nummer als PNr erhalten. Wird als Datentyp für PNr Integerzahl gewählt, ist der Platzbedarf recht gering und der Wertebereich sollte zumindest für die nächste Zeit ausreichen. Nach einer Millionen Dozenten und Studenten müßte man sich jedoch Gedanken für ein Neudesign der Studien/Personalausweise machen (welchen Grund sollte es sonst für diese Selbstbeschränkung geben). Die dritte Regel zerstört die Primary Key Eignung der Spalte PNr jedoch direkt. Die Tabelle bleibt aber zunächst so bestehen, denn das Problem wird durch die folgenden Normalformen gelöst. Als Primary Key kann zunächst (PNr, Vname) benutzt werden. Marcus Börger 31 Modellierung Relationale Datenbanken 3.1.2 Zweite Normalform Redundanzen wie sie durch die Anwendung der Regeln der ersten Normalform entstehen, werden durch Anwendung der Regeln der zweiten Normalform beseitigt. • Sich wiederholende Spaltenwerte werden in eigenen Tabellen gespeichert. Die entstehenden Tabellen werden durch Primary Keys und Foreign Keys miteinander verknüpft, denn es entstehen Relationen vom Typ 1 zu n (siehe 2.2.5 Relationen und 2.2.6 Keys). Anders formuliert darf es keine Spalten geben, die bereits von Teilen des Primary Keys abhängig sind. In Abbildung 3.2: Erste Normalform bilden die Spalten (Name, Gehalt, Datum, liest/besucht) eine Gruppe von Spalten die nur von PNr abhängig sind. Aus dieser Gruppe und PNr wird eine neue Tabelle erstellt. Übrig bleiben die Spalten PNr und Vname und man erkennt leicht, daß der Primary Key dieser Tabelle ausschließlich aus PNr gebildet wird. PNr Name Gehalt Datum lies/besucht ========-----------------------------------------------------100000 Ebert, K. 10.000 DM 13.9.1980 liest 100001 Zucker, G. 11.000 DM 5.3.1982 liest 100002 Meier, A. 1.10.1998 besucht 100003 Kühn, H. 1.10.1999 besucht 100004 Muster, M. 1.10.1999 besucht Abbildung 3.3: Zweite Normalform, Personen PNr Vname ========================= 100000 Einführung 100000 Modellierung 100001 SQL-DDL 100001 SQL-DML 100002 Modellierung 100002 SQL-DDL 100002 SQL-DML 100003 Einführung 100004 Einführung 100004 Modellierung Abbildung 3.4: Zweite Normalform, Veranstaltungen In der dargestellten Tabelle werden Vor- und Nachname in einer Spalte gespeichert, besser wäre den Namen in Anrede, Titel, Vorname, Zusatz und Nachname zu trennen. Damit könnte man dann richtig sortierte Listen erstellen (Entfällt hier der Einfach halber). Das Feld Gehalt enthält hier immer die gleiche Währungskennzeichnung, daher eignet sich das Format Währung besser. Dabei ist jedoch zu prüfen, ob sich die Genauigkeit eignet. Kommen unterschiedliche Währungen vor, so werden diese in eine neue Tabelle verlagert, die weitere Angaben, wie Umrechnungskurse enthält und die Werte in der Spalte Gehalt werden alle in der gleichen Währung abgelegt, denn andernfalls wären sie nicht direkt vergleichbar. Das Datum findet immer am Ort der Universität statt, damit braucht man sich sicherlich keine weiteren Gedanken über den Datentyp zu machen und benutzt Datum. Die Spalte liest/besucht enthält entweder den Wert liest oder den Wert besucht. Daher könnte man auch einfach 0 als liest und 1 als besucht vereinbaren, wodurch man auf Integerzahlen, Zeichen oder Boolesche Werte ausweichen könnte, die alle wesentlich weniger Platz beanspruchen. Im Falle des Datentyps Zeichen könnte man auch gleich L und B vereinbaren, was sich Kollegen sicherlich besser merken können. 32 Marcus Börger Relationale Datenbanken Modellierung 3.1.3 Dritte Normalform Bevor die Dritte Regel angewandt werden kann, muß das Datenmodell in zweiter Normalform vorliegen. Mit der einzigen Regel der dritten Normalform werden dann weitere Redundanzen eliminiert: • Spalten, die nicht Teil des Primary Key sind und voneinander abhängig sind, werden in einer eigenen Tabelle gespeichert. Um dies zu veranschaulichen soll die Tabelle Personen um den Lehrstuhl erweitert werden, wobei jeder Lehrstuhl eine Nummer und einen Namen hat. Zudem soll jede Person einem Lehrstuhl zugeordnet werden. Die folgende Abbildung zeigt ein Beispiel: PNr Name Gehalt Datum liest/besucht LNr LName ========-------------------------------------------------------------100000 Ebert, K. 10.000 13.9.1980 liest 1 DB Theorie 100001 Zucker, G. 11.000 5.3.1982 liest 2 DB Praxis/SQL 100002 Meier, A. 1.10.1998 besucht 1 DB Theorie 100003 Kühn, H. 1.10.1999 besucht 1 DB Theorie 100004 Muster, M. 1.10.1999 besucht 2 DB Praxis/SQL Abbildung 3.5: Personen und Lehrstühle Man sieht hierbei sehr leicht, daß zwischen der Lehrstuhlnummer LNr und dem Lehrstuhlnamen Lname eine 1 zu 1 Beziehung besteht. Die beiden Spalten sind also direkt voneinander abhängig und nicht ausschließlich vom Primary Key. Damit die abhängigen Spalten in einer eigene Tabelle gespeichert werden können, muß entweder eine geeignete Spalte ausgewählt werden, die in der ursprünglichen Tabelle als Foreign Key und in der neuen Tabelle als Primary Key fungiert, oder es muß eine neue Spalte kreiert werden. Eine solche neue Spalte würde in der Ursprungstabelle alle auszulagernden Spalten ersetzen. In obigem Beispiel eignet sich LNr sehr gut als Primary Key für die neue Tabelle mit den abhängigen Spalten LNr und LName: PNr Name Gehalt Datum liest/besucht LNr ========-----------------------------------------------100000 Ebert, K. 10.000 13.9.1980 liest 1 100001 Zucker, G. 11.000 5.3.1982 liest 2 100002 Meier, A. 1.10.1998 besucht 1 100003 Kühn, H. 1.10.1999 besucht 1 100004 Muster, M. 1.10.1999 besucht 2 Abbildung 3.6: Dritte Normalform, Personen und LNr LNr LName ======---------------------1 DB Theorie 2 DB Praxis/SQL Abbildung 3.7: Dritte Normalform, Lehrstühle Ein nicht offensichtlicher Vorteil Namen über Indizes in einer anderen Tabelle anzusprechen ist, daß Änderungen an den Namen nur einmal ausgeführt werden müssen. Da die Änderungen nur in der zweiten Tabelle ausgeführt werden, sind die Datensätze von den Änderungen nicht betroffen. Nachteilig ist jedoch der erhöhte Zeitbedarf bei Abfragen, die den Namen enthalten, da diese den Zugriff auf zwei Tabellen erfordern. Marcus Börger 33 Modellierung Relationale Datenbanken Die dritte Normalform kann man auch für sich wiederholende lange Namen anwenden, indem man sie über Nummern oder ähnliches identifiziert. Es wird also genau der oben beschriebene Fall erzeugt und dann die Regel der dritten Normalform angewandt. Um Platz zu sparen wird diese Methode auch dann angewandt, wenn die Texte vermutlich nur einmal in der Tabelle vorkommen. Damit betrifft die dritte Normalform hier vor allem den Vorlesungsnamen, denn er wiederholt sich ständig und ist relativ lang. Wird statt des Vorlesungsnamen in der zweiten Tabelle eine Referenz auf eine dritte Tabelle gespeichert, die alle Vorlesungsnamen auflistet, so gelangt man zum folgenden Modell: PNr Name Gehalt Datum liest/besucht ========--------------------------------------------------100000 Ebert, K. 10.000 13.9.1980 liest 100001 Zucker, G. 11.000 5.3.1982 liest 100002 Meier, A. 1.10.1998 besucht 100003 Kühn, H. 1.10.1999 besucht 100004 Muster, M. 1.10.1999 besucht Abbildung 3.8: Dritte Normalform, Personen PNr VNr ============= 100000 1 100000 2 100001 3 100001 4 100002 2 100002 3 100002 4 100003 1 100004 1 100004 2 Abbildung 3.9: Dritte Normalform, lesen/besuchen VNr Vname =====-----------------------1 Einführung 2 Modellierung 3 SQL-DDL 4 SQL-DML Abbildung 3.10: Dritte Normalform, Veranstaltungen Die Spalte VNr dient hier als Primary Key für die Tabelle Vorlesungen. Die Tabelle Lesen/Besuchen enthält VNr als Foreign Key. Ihr Primary Key wird aus PNr und VNr gebildet (siehe 2.2.6.1 Primary Keys). Für die Spalte VNr wird erneut Integerzahl als Datentyp festgelegt. Da schon der Name einer Veranstaltung eindeutig ist, hätte der Name bereits als Key dienen können, in diesem Fall hätte man die Tabellen nicht trennen müssen, jedoch kann der Name einer Veranstaltung relativ lang werden und damit ist die Spalte nicht mehr als Key geeignet. Die hier beschriebene Überlegung ist auch gleich Beispiel einer ständig gemachten Fehleinschätzung, warum sollten denn nicht zwei Dozenten, etwa von verschiedenen Studienrichtungen, eine Vorlesung mit gleichem Namen geben? 34 Marcus Börger Relationale Datenbanken Modellierung 3.1.4 Vierte Normalform Genau wie die dritte Normalform beseitigt auch die einzige Regel der vierten Normalform weitere Redundanzen. Vor der Anwendung muß das Datenmodell in dritter Normalform vorliegen: • Mehrwertige Abhängigkeiten werden durch Aufteilen der abhängigen Spalten in mehrere Tabellen beseitigt. Bei zusammengesetzten Primary Keys können mehrwertige Abhängigkeiten entstehen. Wenn mindestens drei Spalten von einander abhängig sind, kann man die Abhängigkeiten dadurch auflösen, daß zwei Spalten eine neue Tabelle bilden und zwischen den so entstandenen zwei Tabellen eine neue 1 zu n Beziehung geschaltet wird. Dieses Vorgehen entspricht dem Vorgehen bei der Dritten Normalform mit dem Unterschied, daß hier auf jeden fall in der Auslagerungstabelle ein neuer Primary Key erzeugt wird, da die beiden ausgelagerten Spalten nicht direkt voneinander abhängig sind. Denn wären die beiden ausgelagerten Spalten direkt voneinander abhängig, dann wäre das Datenmodell nicht in erster Normalform, da der Primary Key aus abhängigen Spalten gebildet wäre. Als Beispiel soll hier eine andere Darstellung der Informationen benutzt werden. Dabei soll eine Tabelle die Informationen Besucher, Dozent und Vorlesung (BNr, DNr, Vname) enthalten. Ausgehend von den bisherigen Daten entsteht somit eine Tabelle deren Primary Key aus den drei Spalten gebildet wird. Die Abbildung unten veranschaulicht das: BNr DNr Vname ================================ 100002 100000 Modellierung 100002 100001 SQL-DDL 100002 100001 SQL-DML 100003 100000 Einführung 100004 100000 Einführung 100004 100000 Modellierung Abbildung 3.11: Besucher, Dozent und Vorlesung Im Beispiel werden jetzt die Spalten DNr und Vname in einer neuen Tabelle ausgelagert. Diese Auswahl wird getroffen, da so die kleinste ausgelagerte Tabelle entsteht: BNr VNr ============= 100002 2 100002 3 100002 4 100003 1 100004 1 100004 2 Abbildung 3.12: Vierte Normalform, Besucher und Vorlesung VNr DNr Vname =====-----------------------1 100000 Einführung 2 100000 Modellierung 3 100001 SQL-DDL 4 100001 SQL-DML Abbildung 3.13: Vierte Normalform, Dozent und Vorlesung Marcus Börger 35 Modellierung Relationale Datenbanken 3.1.5 Jenseits der Normalformen Es existieren neben den vorgenannten Normalformen noch andere Modelle, die jedoch komplex und relativ unwichtig sind. Aus der Praxis gibt es aber noch eine weitere häufig genutzte Methode. Enthält eine Spalte viele NULL Werte und wenigen Werte, die viel Platz belegen oder sind alle übrigen Spalten Datentypen fester Länge, so kann es sinnvoll sein diese Spalten in eine neue Tabelle zu verlangen (siehe 2.2.5.1 Relationstyp 1 zu 1 und 2.2.5.1.1 Relationstyp 1 zu 0/1). 3.1.6 Normalform oder Optimierung Die zuvor beschriebenen Normalformen bilden ein Schema F System das mit Sicherheit nicht immer Ergebnisse liefert, die der Weisheit letzter Schluß sind. Daher sollte man immer Das Ergebnis der Normalisierung erneut analysieren. Bei dieser erneuten Analyse sollte vor allem der spätere Einsatz mit einbezogen werden. Dabei wird das Datenmodell für alle bekannten Datenabfragen auf seine Tauglichkeit hin überprüft. Auffällig ist im Beispiel das Feld liest/besucht. Sollen Dozenten auch Vorlesungen besuchen können, da sie neben ihrer Arbeit ein weiteres Studium angefangen haben (auch solche eher merkwürdigen Fälle müssen in einem Datenmodell immer berücksichtigt werden), muß das Feld liest/besucht in die Tabelle lesen/besuchen verlagert werden. Eine weitere Möglichkeit ist, den Vortragenden in der Tabelle Veranstaltungen zu notieren und aus der Tabelle Lesen/Besuchen eine Tabelle besuchen ohne liest Relationen zu machen. Damit ergibt sich das Modell aus 2.2.2 Attribute. Dieses Modell hat den Vorteil, daß es zumindest für die liest Relationen ohne zusätzliche Tabelle auskommt und damit schneller ist als das Normalformmodell. Nachteilig ist jedoch, daß immer nur ein Dozent einer Veranstaltung zugeordnet werden kann. 3.2 Namensgebung Für Namensgebung in Computersystemen gibt es verschiedene Ansätze. Bei Datenbanken hat sich als günstig erwiesen Tabellen nach den dort gespeicherten Daten zu benennen. Man benutzt bei Tabellen meist den Plural, da dort ja auch mehrere Datensätze des benannten Typs gespeichert werden. Das ist kein Zwang hat aber den Vorteil bei Beschreibungen der Datenbank keine unsinnigen Texte entstehen, wie etwa „wähle aus Person diejenigen aus, die...“. Entsprechend werden für die Spalten Namen im Singular benutzt. Für Foreign Keys gibt es zwei Ansichten zur Namensvergabe. Erstens können alle Spalten, die sich auf einen Key beziehen, den gleichen Namen erhalten, wie der Key selbst. Das hat den Vorteil, daß sofort ersichtlich ist, worauf sich ein Foreign Key bezieht. Nachteilig ist, daß in Abfragen immer vollständige Namen verwendet werden müssen. Zweitens kann man den Namen der Foreign Keys um den Namen der referenzierten Tabelle ergänzen. Da die Namenslänge begrenzt ist, werden häufig Kürzel verwendet, vor allem bei Zusammengesetzten Namen. In der Tabelle Personen hätte man die Spalte PTyp auch PersonenTyp oder PersonTyp nennen können. Es ist nicht wichtig, Namen möglichst kurz zu wählen, sie sollten aber nicht unnötig lang werden, da sich ansonsten sehr lange Abfragen ergeben könnten. Wesentlich wichtiger ist, die Regeln der Datenbank zu berücksichtigen. Diese beschränken häufig den benutzbaren Zeichensatz. Auch legen sie die maximale Länge für Namen fest. Im übrigen sollte man wissen ob die Datenbank Klein/Großschreibung unterscheidet. Da Klein/Großschreibung oft nicht unterschieden wird sollte man also darauf achten, immer gleich zu schreiben, um eine Datenbank Unabhängigkeit zu erreichen. Auch wenn die meisten Datenbank Management Systeme mit Sonderzeichen umgehen können, sollten die Namen ausschließlich aus den 26 Buchstaben des Standardalphabetes den 10 Ziffern und dem Underscore gebildet werden. 36 Marcus Börger Relationale Datenbanken Modellierung 3.3 ER-Diagramme Die bisher verwendeten Abbildungen verwenden Tabellen, so wie man sie kennt. Das hat den enormen Vorteil, daß man sich Begriffe besser vorstellen kann. Zur Modellierung ist diese Vorgehensweise aber unbrauchbar. Das sicherlich bekannteste und verbreitete Konzept zur Datenbankmodellierung ist das Konzept der ER Diagramme. Dabei steht ER für EntityRelationship. Es geht also um Tabellen-Beziehungen Diagramme. Die wichtigsten Elemente solcher Diagramme sind Ellipsen, die Attribute darstellen, Rechtecke für Tabellen und Routen für Relationen. Die Zugehörigkeiten werden durch einfache Linien ausgedrückt. Bei 1 zu x Relationen werden die 1 Seiten durch eine Pfeilspitze auf die Tabelle markiert, 1 zu 1 Relationen haben also zwei Pfeilspitzen und n zu m Relationen keine. Auch in diesen Diagrammen werden die Namen der Primary Key Attribute unterstrichen. Die Abbildung unten ist das ER Diagramm zu Abbildung 2.21: Einfaches Datenmodell der Universität. Man erkennt im Diagramm sehr leicht, daß die Tabelle besuchen, die zur Realisierung der n zu m Relation besuchen benutzt wurde, hier nicht als Tabelle sondern lediglich als Relation auftaucht: VOrt VZeit VNr VOrt Vname Personen VZeit VNr besuchen Vname Veranstaltungen lesen Abbildung 3.14: Einfaches ER Diagramm der Universität Marcus Börger 37 Modellierung Relationale Datenbanken 3.4 Aufgaben 3.1 Erstellen ausgehend vom bisherigen Datenmodell (Abbildung 2.21: Einfaches Datenmodell der Universität) ein erweitertes, das Lehrstühle verwalten kann. In der Datenbank soll also gespeichert werden, welcher Dozent der Lehrstuhlinhaber ist und wo sich der Lehrstuhl befindet. Dabei soll es möglich sein, daß ein Lehrstuhl auf mehrere Gebäude aufgeteilt ist. Sehen Sie in dem neuen Datenmodell auch die Möglichkeit vor zu den Veranstaltungen beliebig viele Termin/Ortkombinationen speichern zu können (siehe Aufgabe 2.5). Weiterhin soll die Hierarchie der Dozenten und Studenten wie in Aufgabe 2.6 gespeichert werden und allen Personen, Lehrstühlen und Veranstaltungsräumen Adressen zugewiesen werden könne. Benutzen Sie dabei zunächst verschiedene Tabellen für die einzelnen Adressangaben (Personen, Lehrstühle, Veranstaltungen). 3.2 Modifizieren Sie ihr in Aufgabe 3.1 erstelltes Datenmodell dahingehend, daß alle Adressen in einer Tabelle gespeichert werden. Erklären Sie die Vor/Nachteile beider Lösungen. 3.3 Views eignen sich dazu die gemeinsamen Teile von ähnlichen Tabellen zu einer virtuellen zusammen zu fassen. Sie eignen sich jedoch nicht als Ziel von Referenzen. Es ließen sich damit zwar die verschiedenen einzelnen Tabellen aus Aufgabe 3.1 zu einer zusammen fassen aber weitere Tabellen könnten diese View nicht als Referenzziel nutzen. Eine andere Lösung besteht darin, mit Tabellen und Vererbung zu arbeiten. Dabei kann die Vatertabelle bereits alle Gemeinsamkeiten enthalten und als Referenzziel benutzt werden. Ändern Sie das Modell aus Aufgabe 3.2 dahingehend, sofern noch Änderungen erforderlich sind. Erklären Sie auch hier wieder Vor- und Nachteile der beiden Lösungswege. 3.4 Ordnen Sie jeder Vorlesung eine Fach- und Studienrichtung zu. Ferner sollen für jede Fachrichtung Lehrpläne aufgestellt werden. Dabei soll es jedem Studenten möglich sein sich in verschiedene Studienrichtungen zu spezialisieren. Daher muß aus der Datenbank ersichtlich werden, welche Fachkombinationen möglich sind und welche Vorlesungen in welchen Fachrichtungen zwingend sind. Neben den reinen Pflicht und Wahlvorlesungen muß es also noch Mindestanzahlen für Semesterwochenstunden6 geben. 3.5 Nehmen Sie in ihr Datenmodell nun noch die Noten, die ein Student in Prüfungen abgelegt hat auf. Dabei sollen die Informationen aus Aufgabe 3.4 derart erweitert werden, daß aus der Datenbank ersichtlich ist, welche Prüfungen ein Student ablegen muß. Gehen Sie davon aus, daß prinzipiell jede Vorlesung sowohl schriftlich, als auch mündlich geprüft werden kann. 3.6 Erstellen Sie ein Datenmodell, mit der Sie Ihre CD-Sammlung verwalten können. Das Modell muß also Interpreten, Titel und CDs speichern können. Zu jeder CD sollen Kaufdatum und Kaufpreis gespeichert werden. 3.7 Entwickeln Sie ein Datenmodell für eine Bücherei. Es werden also Informationen über Autoren, Titel und Bücher inklusive ISBN, Verlag und Erscheinungsdatum sowie deren Standort benötigt. Weiterhin sollen alle Ausleiher inklusive ihrer Adressen und Telefonnummern gespeichert werden. Damit soll es möglich sein zu jedem Buch entweder den Standort zu ermitteln oder den Ausleiher zu benachrichtigen. Bedenken Sie daß es maximale Ausleihzeiten gibt und das Ausleihen von Büchern nicht kostenfrei ist. 6 Semesterwochenstunden bezeichnet die Anzahl von Stunden die eine Vorlesung je Woche über die Dauer von einem Semester gehalten wird. Es wird hierbei vom Normalfall ausgegangen, daß jedes Semester ½ Jahr dauert. 38 Marcus Börger Relationale Datenbanken Anwendungsstrukturen 4 Anwendungsstrukturen Der Begriff Datenbank ist ein übergeordneter Begriff, dessen Landläufige Bedeutung lediglich das Bereithalten von Daten meint. Eine Datenbank im Sinne von Datenlieferant und Speicherort ist hingegen ein sogenanntes Database Management System (DBMS). Im Falle relationaler Datenbanken spricht man von Relational Database Management System (RDBMS). Drei sehr bekannte Systeme hierfür sind MySQL [FNA99], PostgreSQL [Mom00] und Oracle [CHRS00]. Sie vertreten jedes für sich eine Kategorie von Datenbanken. MySQL ist ein Beispiel für ein einfaches RDBMS. Es kennt weder Constraints noch externe Funktionen oder Trigger. Es wird aber gerade darum oft eingesetzt, da viele Datenbank Anwendungen ohne diese Mechanismen auskommen und MySQL dadurch wesentlich schneller sein kann. Da MySQL standardmäßig zudem auf Transaktionen verzichtet ist es nochmals schneller7. Besonders im Internet Umfeld ist die Verbindung von Linux, Apache, MySQL und PHP (LAMP) sehr weit verbreitet, da alle vier Komponenten weit verbreitet, frei verfügbar und sehr ausgereift sind. PostgreSQL sei hier als ein Vertreter von RDBMS genannt, die eben erwähnte Schwächen nicht aufweisen. Das Fehlen von Triggern und Constraints ist eine Schwäche, da diese ein sehr mächtiges Werkzeug für Sicherheit und Konsistenz bereitstellen. Mit Constraints ist es möglich Gültigkeitsregeln auf zu stellen und die Integrität der Datenbank zu gewährleisten. Mit Triggern schließlich können einige Automatismen im Datenumgang an die Datenbank übertragen werden. Damit lassen sich sowohl komplexe Integritätsregeln aufstellen, als auch zusätzliche Daten berechnen. Als letzter Vertreter sei hier Oracle erwähnt. Anbieter dieser Größenordnung liefern neben dem reinen RDBMS weitere speziell darauf zugeschnittene Zusatzprodukte aus, welche sämtliche Stärken ausnutzen können. Vor allem ist es aus Gründen wie Anschaffungspreis, Support, Weiterentwicklung usw. häufig interessant viele Komponenten von einem Anbieter zu beziehen. RDMBS stellen in heutigen Anwendungen nur noch einen Teil der Systemstruktur dar. Auf den RDBMS sitzen meist noch Anwendungsserver und die Clients. Generell unterteilt man die Systeme in 1-tier8, 2-tier und 3-tier Systeme (siehe auch [dtec97]). 4.1 1-tier Wenn das System lediglich aus einem RDBMS besteht, so spricht man von einem 1-tier System. Solche Systeme unterstützen maximal externe Terminals in der Ausführung sogenannter Datensichtgeräte. Alle Aufgaben des Systems erfolgen auf einer einzigen Maschine, dem sogenannten Mainframe. Mainframe Daten Terminals Abbildung 4.1: Mainframe 7 8 MySQL kennt seit Version 3.23.34 Transaktionen mit den Tabellentypen BDB und InnoDB. Mit n-tier ist hier n-Schichtenmodell gemeint (tier [engl.]: Schicht, Lage). Marcus Börger 39 Anwendungsstrukturen Relationale Datenbanken 4.2 2-tier Als Computer immer billiger wurden und die Anwendungen immer größer, wurde irgendwann der Punkt erreicht, an dem es billiger wurde, einen Teil der Aufgaben in die Terminals zu verlagern. In solchen als Client-Server bezeichneten Systemen, werden üblicherweise Teile der Applikationslogik auf den intelligenten Terminals oder Clients ausgeführt. Oft sind das vorverarbeitende Aufgaben oder Kontrollen der Eingaben. 4.3 3-tier Das Hauptaugenmerk bei 3-tier Systemen liegt darin die Anwendungslogik getrennt von der Datenhaltung auf einem Server oder einer Serverfarm zu realisieren, während die Präsentation vom Client ausgeführt wird. Die meisten Internet Informationsdienste sind als 3-tier Systeme realisiert. Hierbei wird ein RDBMS als Datenlieferant eingesetzt, der jedoch keine oder nur sehr einfache Berechnungen ausführt. Diese Berechnungen werden dann auf dem Applikationsserver ausgeführt. Dies hat zwei große Vorteile. Erstens minimiert man den Verwaltungsaufwand und zweitens braucht man keinen Zugriff auf die unverarbeiteten Daten zu gewähren. Damit erreicht man zum einen höhere Sicherheitsanforderungen und zum anderen ist es nicht erforderlich Algorithmen bekannt zu geben. Aber das Ganze hat noch weitere positive Effekte. Man kann sehr einfach Systemtunabhängigkeit erreichen, indem man nur einfache Dienste beim Client einsetzt. So werden immer häufiger Webbrowser als Anwendung beim Client genutzt. In Internet Szenarien kommen häufig noch weitere Computer oder Spezialisierte Geräte zum Einsatz, die zusätzliche Aufgaben wahrnehmen. Da diese Aufgaben aber meist mit Nebeneffekten oder der Kontrolle des Systems und nicht direkt damit zu tun haben bleibt es beim 3-tier Modell (Auch wenn mehr aktive Schichten/Komponenten zum Einsatz kommen spricht man noch vom 3-tier Modell). Die folgende Grafik veranschaulicht das zur Zeit am weitesten verbreitete Modell derartiger Intranet Anwendungen. Das eigentliche 3-tier Modell wird dabei aus Dantenbankserver, Applikationsserver und den Browsern im Internet gebildet. Die Daten werden für den Internet Transport vom Webserver aufbereitet, das hat keinen direkten Einfluß auf die eigentliche Anwendung. Die bereits genannten drei Server stehen meist als Serverfarm bei einem Internet Service Provider (ISP), der die Zugriffe mittels einer Firewall kontrolliert und im Falle mehrerer Webserver mittels eines Proxy auf diese verteilt. Der Betreiber der Anwendung kann über ein virtual private network (VPN) direkt auf die Server zugreifen. Zusätzlich zum Internet Zugang wird meist als Notlösung ein ISDN Zugang installiert. DB-Server AppServer WebServer Firewall Proxy Internet Daten Templates dHTML VPN ISDN Abbildung 4.2: Internet 3-tier Modell 40 Marcus Börger Relationale Datenbanken Installation 5 Installation Spätestens nachdem ein erstes Datenmodell kreiert wurde, sollten einige Überlegungen über das zu verwendende DBMS angestellt werden. Erst mit der Implementierung der Datenbank können reale Tests und weitere Analysen durchgeführt werden. Besonders das Zeitverhalten ist zu komplex, um es im Vorfeld theoretisch exakt bestimmen zu können. 5.1 MySQL MySQL wird unter der GNU General Public License vertrieben. Das bedeutet, daß der Einsatz kostenlos ist. Der weitere Vertrieb von MySQL wird in der GPL Lizenz geregelt, die jeder Distribution beiliegen muß. MySQL kann von der Internetseite www.mysql.com geladen werden. Ab Version 3.23.34 existieren 2 Versionen von MySQL. Die Standardausführung unterstützt ausschließlich solche Tabellentypen, die keine Transactions unterstützen, im einzelnen sind das MyISAM, ISAM, Heap und Merge. Die zweite Version, MySQL-max, unterstützt hingegen Transactions mit den neuen Tabellentypen BDB, innoDB und Gemini. Leider existiert zur Zeit noch keine Gemini Unterstützung für Windows Systeme. 5.1.1 Windows Bei der Installation unter Windows wird nach dem Zielverzeichnis gefragt, wenn dies nicht das Standard Verzeichnis c:\mysql ist, so muß das Zielverzeichnis im weiteren Verlauf der Installation manuell angepaßt werden. Im weiteren wird von einer Installation in das Verzeichnis c:\Programme\mysql ausgegangen. Ansonsten sollten bei der Installation alle Abfragen mit der Standardeinstellung quittiert werden. Sofern ein anderes Installationsverzeichnis gewählt wurde muß zunächst die Datei my-example.cnf als my.ini in das Windows Verzeichnis oder nach c:\my.cnf kopiert werden. Dort muß der Eintrag #basedir = d:/mysql/ auskommentiert werden indem das # Zeichen gelöscht wird. Dann muß noch das korrekte Zielverzeichnis angegeben werden. Wurde MySQL etwa in das Verzeichnis = C:\Programme\MySQL installiert, so wir die Zeile geändert zu basedir c:/programme/mysql/. Nun kann MySQL gestartet werden. Am besten installiert man MySQL als Service und startet ihn auch gleich. Hierbei ist zu überlegen, ob MySQL oder MySQL-max benutzt werden soll. Letzteres unterstützt auch die Tabellen Formate, die Transactions unterstützen. Danach sollte man ein Paßwort für den User root vergeben. Dazu wechselt man in das Verzeichnis bin unter mysql und startet dort mysql.exe. Dann wechselt man in die mysql Datenbank und ändert das Paßwort. Die Änderungen werden allerdings erst nach einem Neuladen der Tabellen wirksam. Hierzu dient der Aufruf von mysqladmin.exe mit Parameter reload. Zu beachten ist auch, daß die Paßwörter nicht im Klartext geschrieben werden und statt dessen die Funktion password genutzt werden sollte. Alle weitern Aufrufe von mysql müssen jetzt mit dem Parameter –p erfolgen. C:\Programme\mysql\bin\> mysql-max-nt.exe –-install C:\Programme\mysql\bin\> net start mysql C:\Programme\mysql\bin\> mysql.exe mysql> use mysql; mysql> update user set password=password('mysql'); mysql> exit C:\Programme\mysql\bin\> mysqladmin.exe reload C:\Programme\mysql\bin\> ? Abbildung 5.1: MySQL Installation unter Windows Marcus Börger 41 Installation Relationale Datenbanken 5.2 PostgreSQL PostgreSQL oder kurz Postgres ist eine Open Source Entwicklung mit Ursprung an der University of California at Berkeley. Open Source bedeutet, daß keinerlei Beschränkungen in Bezug auf die Nutzung von Postgres existieren. Neben der freien Version von Postgres, die unter der Internet Adresse http://www.postgresql.org verfügbar ist, existiert noch eine kommerzielle Version der Firma Great Bridge (http://www.greatbridge.com). 5.2.1 Windows Um PostgreSQL auf einem Windows Rechner zu installieren, muß zunächst cygwin mit Cygwin32 IPC installiert werden. Cygwin kann von der Webseite http://www.cygwin.com bzw. http://sources.redhat.com/cygwin/ geladen werden, es enthält in der aktuellen Version bereits PostgreSQL. Es wird zunächst der Cygwin Installer (setup.exe) benötigt, dazu einfach das Installer Icon rechts anklicken. Es empfiehlt sich Cygwin zunächst komplett als Paket zu laden und dann zu installieren. Das hat den enormen Vorteil, daß man Cygwin jederzeit neu installieren kann, ohne noch mal die ca. 60MB von der Website zu laden. Es muß zunächst ein Ziel (Local Package Directory) zum Speichern der einzelnen Installations Pakete angegeben werden. Danach wird die Verbindungsart festgelegt und eine Download Site ausgewählt. Sollten Probleme mit dem Zugriff über das Internet erfolgen, kann man die Internet Explorer Einstellungen übernehmen (Use IE5 Settings). Abbildung 5.2: Cygwin Download Sobald die Verbindung zur Download Site erfolgreich war, können die benötigten Pakete ausgewählt werden. Die Option Prev lädt die jeweils letzte Version, die Option Curr hingegen die Aktuelle und mit Exp bzw. Full/Part können die Pakete einzeln ausgewählt werden, wobei durch einen Klick auf das Symbol die gewünschte Aktion eingestellt wird. Wenn bereits Pakete geladen wurden, so findet sich deren Versionsnummer in der Spalte Current. Ein Häkchen in der Spalte Src? kann benutzt werden, um auch die Sourcen zu laden. Für ein brauchbares Minimalsystem empfehlen sich: ash, bash, binutils, cygwin, cygrunsrv, gawk, fileutils, findutils, less, man, sh-utils, login, postgres, sed, termcap, textutils und w32api. 42 Abbildung 5.3: Cygwin Download, Paketauswahl Marcus Börger Relationale Datenbanken Installation Nachdem die Paketauswahl erfolgt ist, kann der Download durch Klicken auf den Next Button gestartet werden. Nach einem erfolgreichem Download erscheint der Hinweis Download Complete und der Installer wird zunächst beendet. Durch einen erneuten Start des Installers kann Cygwin nun installiert werden. Im Gegensatz zum oben beschriebenen Download wird dazu die Installationsmethode Install from local Directory benutzt. Dabei muß zunächst das Local Package Directory angegeben werden. Wird der Installer aus dem Verzeichnis gestartet, indem der Download erfolgte, so ist das Verzeichnis bereits vorgewählt. Im nächsten Schritt wird das Zielverzeichnis der Installation (Select install root directory) festgelegt. Zusätzlich kann der Zeilenumbruch für Textdateien festgelegt werden, wobei Windows/DOS Carrige Return (ASCII 13) und Linefeed (ASCII 10) benutzt, während Unix nur Linefeed verwendet. Weiterhin kann festgelegt werden, ob die Installation für alle Benutzer oder nur für den Benutzer, der die Installation ausführt, zugänglich sein soll. Es folgt erneut die Paketauswahl, wobei hier nur die Pakete zur Auswahl stehen, die zuvor mit der Download from Internet Funktion geladen wurden. Nach erfolgter Auswahl sieht man den Fortschritt der Installation. Als letztes kann für eine Windowsinstallation typisch noch entschieden werden, ob man ein Icon auf der Oberfläche bzw. ein Eintrag im Startmenü erstellen möchte. Abbildung 5.4: Cygwin Installation Leider fehlt der Cygwin Distribution derzeit noch das erwähnte Cygwin32 IPC Paket. Dieses ist auf der Webseite http://www.neuro.gatech.edu/users/cwilson/cygutils/V1.1/cygipc/ verfügbar. Es muß die aktuelle Version geladen werden und in das Root Verzeichnis der Cygwin Installation kopiert werden. Die folgende Abbildung zeigt die Installation mit dem tar zxvf Aufruf für die Paketdatei cygipc-1.09-2.tar.gz und den Start des ipc-daemon. administrator@BAUMBART ~ $ cd / administrator@BAUMBART / $ tar zxvf cygipc-1.09-2.tar.gz administrator@BAUMBART / $ ipc-daemon & [1] 308 Abbildung 5.5: Cygwin32 IPC Installation Marcus Börger 43 Installation Relationale Datenbanken 5.2.2 Initialisierung von Postgres Bevor Postgres benutzt werden kann muß nun noch das Datenbankmanagementsystem initialisiert werden. Dazu wird die notwendige Verzeichnisstruktur sowie eine Datenbankvorlage erzeugt. Die Datenbankvorlage enthält alle Informationen, die für den Betrieb einer Datenbank notwendig sind. Das folgende Beispiel benutzt /usr/local/pgsql als Datenverzeichnis, da der Aufruf unter Cygwin erfolgte, wurde zunächst der ipc-daemon gestartet, bevor der initdb Aufruf ausgeführt werden konnte. Das dritte Kommando pg_ctl schließlich startet Postgres. Wenn der Start erfolgreich ist erhält man eine Bestätigung vom postmaster. Die beiden folgenden Befehle schließlich beenden Postgres bzw. den IPC-daemon (bitte auf die korrekte Prozeß-ID, hier 308, achten). administrator@BAUMBART / $ ipc-daemon & [1] 308 administrator@BAUMBART / $ initdb -D /usr/local/pgsql This database system will be initialized with username “administrator". This user will own all data files and must also own the server process. Creating directory /usr/local/pgsql Creating directory /usr/local/pgsql/base Creating directory /usr/local/pgsql/global Creating directory /usr/local/pgsql/pg_xlog Creating template1 database in /usr/local/pgsql/base/1 Done first run Creating global relations in /usr/local/pgsql/global Initializing pg_shadow. Enabling unlimited row width for system tables. Creating system views. Loading pg_description. Setting lastsysoid. Vacuuming database. Copying template1 to template0. Success. You can now start the database server using: /usr/bin/postmaster -D /usr/local/pgsql or /usr/bin/pg_ctl -D /usr/local/pgsql -l logfile start administrator@BAUMBART ~ $ pg_ctl -D /usr/local/pgsql start postmaster successfully started administrator@BAUMBART ~ $ pg_ctl stop waiting for postmaster to shut down.....done postmaster successfully shut down administrator@BAUMBART ~ $ kill 308 administrator@BAUMBART ~ $ [1]+ Terminated ipc-daemon Abbildung 5.6: Postgres Initialisierung 44 Marcus Börger Relationale Datenbanken Installation 5.2.3 Postgres als Windows Service Mit Cygwin kann Postgres unter Windows auch als Service eingerichtet werden. Dazu wird das Cygwin Paket cygrunsrv benutzt. Zunächst wird der ipc-daemon aus dem Cygwin32 IPC Paket als Service eingerichtet. Danach wird postgres als Service angelegt, wobei festgelegt wird, daß postgres von ipc-daemon abhängig ist. Wichtig ist, daß nicht die Datei postgres.exe als Service eingerichtet wird, sondern der Link postmaster benutzt wird. Nur über diesen Link kann Postgres als Server gestartet werden. Die Funktionsfähigkeit des Service kann mit dem SQL Interpreter psql nachgewiesen werden. Dazu wird eine Verbindung zur Datenbank template1 erstellt und die Versionsnummer von Postgres mit der Abfrage ‚select version();’ gelesen. Der Interpreter kann danach mit dem Kommando \q beendet werden. administrator@BAUMBART ~ $ cygrunsrv --install ipc-daemon –o -p /usr/local/bin/ipc-daemon.exe administrator@BAUMBART ~ $ cygrunsrv --install postgres –o -y ipc-daemon -p /bin/postmaster -a "-D /usr/local/pgsql" administrator@BAUMBART ~ $ cygrunsrv --start postgres administrator@BAUMBART ~ $ psql template1 Welcome to psql, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit template1=# select version(); version -------------------------------------------------------------PostgreSQL 7.1.2 on i686-pc-cygwin, compiled by GCC 2.95.3-5 (1 row) template1=# \q administrator@BAUMBART ~ $ Abbildung 5.7: Postgres als Windows Service einrichten Da die beiden Installationsaufrufe von cygrunsrv mit dem Parameter –o ausgeführt wurden, werden beide Services beim Beenden von Windows automatisch beendet. Sollen die Services deinstalliert werden, so müssen sie zunächst mit cygrunsrv –stop ipc-daemon bzw. cygrunsrv –stop postgres beendet und dann mit cygrunsrv –remove ipc-daemon bzw. cygrunsrv –remove postgres entfernt werden, wobei jeweils der Aufruf für PostgreSQL zuerst erfolgen muß. Marcus Börger 45 Installation Relationale Datenbanken 5.3 Oracle Das Oracle Datenbank Management System ist auf der Internetseite www.oracle.com verfügbar. Es kann für den privaten Gebrauch und für Geschäftsinterne Entwicklungsaufgaben kostenlos genutzt werden. Einzelheiten hierzu bitte den jeweiligen Lizenzbestimmungen von Oracle entnehmen. Die folgenden Abschnitte beschreiben die Installation der Version 8.1.7 [HLU98], [CHRS00]. Eine Oracle Datenbank besteht immer aus dem Datenbank Managementsystem, der Kommunikationsschicht (Net8) und den Datenbankdiensten. Leider trennt Oracle die Begriffe Datenbank, Managementsystem und Dienst nicht eindeutig. Wenn man die korrekten Begriffe nutzt, so unterstützt ein Oracle Datenbank Management System mehrere Datenbankdienste. Neben den lokalen Datenbankdiensten kann ein Oracle System entfernte Datenbankdienste ansprechen. Innerhalb eines Datenbankdienstes existieren mehrere Tablespaces. Diese können mit den Datenbanken einer MySQL Installation verglichen werden. Die folgende Graphik veranschaulicht die Struktur eines Oracle Systems. Die darin unterstrichenen Elemente werden in den folgenden Abschnitten angelegt: Datenbankdienst (baumbart.boerger.de) Tabellen Schemaobjekte Tablespaces Objekte Personen Views System Benutzer Veranstaltungen Tabellen Uni Tablespaces besuchen Indizes Temporär Rolle Net8 Kommunikationsschicht SQL*Plus> _ Clients Weitere Computer Abbildung 5.8: Oracle System Struktur 46 Marcus Börger Relationale Datenbanken Installation 5.3.1 Windows Zur Oracle Installation unter Windows starten wir der Oracle Universal Installer benutzt (setup.exe). Es erscheint ein Splashscreen mit dem Logo und kurz darauf die Willkommenmeldung. Durch drücken des Button ‚Weiter’ gelangt man zur eigentlichen Installation. Zunächst werden Quell und Zielverzeichnis benötigt, wobei das Quellverzeichnis bereits korrekt ausgewählt sein sollte. Bei der Wahl des Zielverzeichnisses ist darauf zu achten, daß man durchaus mehrere Gigabyte an Platz benötigt, als Minimum kann man zunächst von einem Gigabyte ausgehen. Nachdem beide Angaben erfolgt sind und erneut ‚Weiter’ geklickt wurde, wird die Produktliste geladen. Hier wird durch Wahl der Option ‚Oracle8i Enterprise Edition’ die Installation des Datenbank Management Systems eingeleitet. Um die Installation den Erfordernissen anzupassen muß dann die Option ‚Benutzerdefiniert’ gewählt werden. Aus der Liste der verfügbaren Produktkomponenten können jetzt die Einzelkomponenten gewählt werden9. Nach der Auswahl, erfolgt die Möglichkeit für alle Komponenten getrennt den Speicherort zu wählen. Nach Klicken auf ‚Weiter’ gelangt man zu einer weiteren Auswahl. Es kann nach der Installation des Datenbank Management Systems die automatische Installation eines Datenbankdienstes gestartet werden. Wenn dies später erfolgen soll, so kann die Installation der Datenbank auch später durch den Aufruf des Oracle Database Configuration Assistent erfolgen. Das getrennt Vorgehen erscheint ratsamer, da zunächst die erfolgreiche Installation des Management Systems abgewartet werden kann. Nach Auswahl der Option ‚Nein’ für Datenbank nicht (später) installieren erfolgt eine Übersicht der ausgewählten Komponenten. Wenn hier ‚Installieren’ gewählt wird startet die Installation. Diese kann auch auf schnellen Systemen länger als eine halbe Stunde dauern. Nach der Installation des Management Systems wird automatisch der Net8 Konfigurationsassistent gestartet. Mit diesem kann nun ein zwingend erforderlicher Listener erstellt und konfiguriert werden. Im Normalfall reicht es aus hier die Checkbox ‚Typische Konfiguration’ zu nutzen. Auch hierbei können notwendige Änderungen später vorgenommen werden. Sollte sich der Universal Installer danach nicht mehr bedienen lassen, kann man ihn einfach beenden. Je nach Windows Version ist hierzu der Task Manager notwendig (Task jre). Bis hierher wurde das reine Datenbank Management System erstellt. Es gibt jetzt bereits die Möglichkeit mit einer anderen Oracle Datenbank zu kommunizieren, es wurde jedoch noch keine Datenbankinstanz erstellt. Es gibt auch noch keinerlei Datenbanktemplates oder Datenbankräume wie bei anderen Systemen. Das weitere Vorgehen ist unter 5.3.3 Database Configuration Assistant beschrieben. 5.3.2 Linux 9 Hier können Beispielsweise neben den zwingend erforderlichen Java 1.1 Komponenten auch die Java Komponenten in der Version 1.2 selektiert werden. Marcus Börger 47 Installation Relationale Datenbanken 5.3.3 Database Configuration Assistant Mit dem Database Configuration Assistant kann ein Datenbankdienst erstellt, konfiguriert oder geändert werden (Oracle benutzt in diesem Werkzeug den Begriff Datenbank). Wenn ein neuer Dienst angelegt werden soll, so empfiehlt es sich bei reinen Testinstallationen die Option Benutzerdefiniert, da man dadurch den Notwendigen Platz auf ein erträgliches Niveau drücken kann. Wenn Speicherplatz auch oberhalb von weiteren Gigabytes keine Rolle spielt, kann man sich die Mühe sparen und nutzt die Standard Option. Bei der Standardinstallation wird zunächst unterschieden, ob die Datenbank von einer bestehenden Vorlage oder komplett neu erstellt werden soll. Da hier normalerweise keine Vorlagen vorhanden ist, wird ‚Neue Datenbank erstellen’ aktiviert. Anschließend kann der Typ der Datenbank ausgewählt werden. Im allgemeinen empfiehlt sich hier der Typ ‚Mehrzweck’. Danach erfolgt die Abfrage der Anzahl der gleichzeitig angemeldeten Benutzer. Hierbei ist zu bedenken, daß jedes Dienstprogramm eine eigene Anmeldung benötigt. Die Standardeinstellung 15 ist also nicht übertrieben. Der nächste Schritt erlaubt die Festlegung der benötigten Komponenten. Eine genaue Beschreibung der einzelnen Komponenten kann der Online verfügbaren Hilfe entnommen werden. Für die hier dargestellten Beispiele reicht es vollkommen die Komponente SQL*Plus-Hilfe zu wählen. Abschließend wird nach einem Globalen Datenbanknamen und einem Oracle Systembezeichner, kurz SID, gefragt. Der globale Datenbankname besteht aus dem lokal eindeutigen Datenbanknamen und einem Domänennamen, die durch einen Punkt getrennt werden. Dabei darf der Datenbankname aus maximal 8 alphanumerischen Zeichen bestehen und muß mit einem Buchstaben beginnen. Der SID darf ebenfalls aus maximalen 8 alphanumerischen Zeichen bestehen und muß auch mit einem Buchstaben beginnen. Es empfiehlt sich den gleichen Namen für Datenbanknamen und SID zu benutzen. Falls auf einem Rechner mehrere Datenbankdienste installiert werden sollen, muß dieser auf dem jeweiligen System eindeutig sein. Der Domänenname sollte der Netzwerkdomäne entsprechen. Wenn keine Netzwerkdomäne festgelegt ist, so kann man einfach den Namen des Rechners benutzen. Die benutzerdefinierte Installation entspricht bis einschließlich der Auswahl der Anzahl der gleichzeitig angemeldeten Benutzer identisch der oben beschriebenen Standardinstallation. Es folgt die Festlegung des Datenbank Modus. Für kleiner Tests empfiehlt sich hierbei die Auswahl ‚Dedizierter Server-Modus’. Nachfolgend wird auch hier ein globaler Datenbankname und ein SID erfragt. Zusätzlich können noch ein Dateiname für die Initialisierung, der zu verwendende Zeichensatz und der Kompatibilitätstyp festgelegt werden. In der Initialisierungsdatei werden Steuerinformationen des zu erstellenden Datenbankdienstes gespeichert. Die zusätzlichen Parameter können im allgemeinen den Defaultwert behalten. Auf der nachfolgenden Seite können einige Parameter der Initialisierungsdatei geändert werden. Es ist dabei günstig alle Dateien, die zu einer Datenbank gehören in einem Verzeichnis zu speichern. Bei größeren Datenbanken sollte hingegen die eigentlichen Datendateien der Datenbank auf mehrere Festplatten verteilt werden. Diese Verteilung und die Größe bzw. das Verhalten bei notwendigen Größenänderungen kann auf der nächsten Seite für System, Werkzeuge, Benutzer, Rollback, Index und den Temporären Tablespace getrennt eingestellt werden. Dabei stellt ein Tablespace einen Bereich zur Speicherung von Tabellen etc. dar. Dies kann man mit dem Anlegen einer Datenbank bei anderen Systemen vergleichen. MySQL hat im Vergleich nur einen Dienst und jede Datenbank ist mit einem Tablespace vergleichbar. Der Tablespace System hat etwa die gleichen Aufgaben der Datenbank mysql unter MySQL. Die Tabelle 5.1: Oracle, Tablespace Parameter zeigt ein Beispiel für einen Datenbankdienst, dessen Größe zum Austesten der Beispiele und zum Anlegen einfacher eigener Datenbanken vollkommen ausreichend ist. Neben den in der Tabelle angegebenen Parametern kann hier für jeden einzelnen Tablespace ein Dateiname festgelegt werden. 48 Marcus Börger Relationale Datenbanken Tablespace Größe System Werkzeuge Benutzer Rollback Index Temporär 32 12 16 128 32 32 Installation Autom. Min. Nächste Wachstum Ausgangs- Nächste Min Erweitern Extent Wert Ja 64 512 50 64 64 1 Ja 32 320 0 32 32 1 Ja 128 1024 0 128 128 1 Ja 512 4096 -/512 512 4 Ja 128 1024 0 128 128 1 Ja 64 1024 -/64 64 -/- Max Unbegrenzt -/4096 -/4096 4096 -/- Ja Nein Ja Nein Nein (Ja) Tabelle 5.1: Oracle, Tablespace Parameter Auf den nächsten Seiten werden die Dateien und Größen der Redo-Log-Dateien, Angaben zu Checkpoints und SGA-Parameterinformationen bestimmt. Bei Testsystemen reicht für die Größe des gemeinsamen Pools die Angabe von 33554432 Byte (32 MByte) und als Blockgröße empfehlen sich 4096 Byte, da dieser Wert im allgemeinen der Clustergröße auf den Festplatten entspricht. Wenn Java benötigt wird muß der Pool mindestens 52428800 Byte (50 MByte) groß sein. Anschließend können noch Verzeichnisse für Traceinformationen festgelegt werden. Danach kann die eigentliche Installation gestartet werden. Wenn die oben genannten Größen übernommen werden, muß man für die Installation etwa eine halbe Stunde veranschlagen. Wenn eine Oracle Datenbank nicht mehr für Testzwecke sondern für eine Tatsächliche Anwendung installiert werden soll, so empfiehlt es sich dringend mit den einzelnen Komponenten und den mit ihnen verbundenen Parametern eingehend zu beschäftigen. Erst ein Verständnis der Parameter führt zu einer Datenbank die einerseits schnell genug reagiert und andererseits adäquates Speichervolumen belegt. Nach der Installation der Datenbank existieren zwei Benutzer. Der Benutzer scott hat das Paßwort tiger und der Benutzer system das Paßwort manager. Diese beiden Benutzer werden benötigt um die Datenbank weiter an die eigenen Ansprüche anzupassen bzw. mit ihr zu arbeiten. SQL Statements können nun mit SQL*Plus ausgeführt werden. Dabei ist darauf zu achten, daß jedem Benutzer ein Tablespace zugewiesen ist. Diese und andere Anpassung erfolgen mit dem DBA Studio. 5.3.4 Net8 Assistant Einen ersten Test der Installation kann man auch mit dem Net8 Assistant vornehmen. Dazu wird der eben erstellte Datenbankdienst ausgewählt und die Funktion ‚Dienst testen...’ gewählt. Wie in Abbildung 5.9: Oracle, Net8 Assistant zu sehen ist, wurde der Datenbankdienst mit dem globalen Datenbanknamen baumbart.boerger.de installiert. Abbildung 5.9: Oracle, Net8 Assistant Marcus Börger 49 Installation Relationale Datenbanken Der Net8 Assistant kann auch benutzt werden, um einen Datenbankdienst, der auf einem anderen Computer ausgeführt wird, als lokalen Datenbankdienst ansprechen zu können. Dazu wird zunächst Dienstbenennung selektiert und dann der ‚Erstellen...’ Button geklickt. In den folgenden Dialogen wird nach den Verbindungsparametern gefragt. Dabei ist der Net Service Name, der Name, den der Datenbankdienst lokal bekommen soll. Dieser Name hat lediglich auf dem Computer Bedeutung, auf dem die Verbindung konfiguriert wird. Daher auch die Bezeichnung Dienstbenennung. Am einfachsten benutzt man hier den globalen Datenbanknamen. Die Kommunikation erfolgt im allgemeinen über TCP/IP. Abschließend werden noch der Hostname und der globale Datenbankname benötigt. Der Hostname ist dabei der DNS Name oder die IP Adresse des Computers auf dem die Datenbank installiert ist. 5.3.5 DBA Studio Mit dem DBA Studio können alle Objekte von Oracle Datenbanken (auch auf entfernten Rechnern) eingesehen und meist auch modifiziert werden. Die Datenbanken müssen entweder mit dem Net8 Assistant als Dienst eingetragen werden oder es muß eine Verbindung zur lokalen Installation erfolgen. Wenn noch keine Verbindung besteht, zum Beispiel beim ersten Aufruf, kann eine Verbindung ausgewählt bzw. eingerichtet werden. Im Normalfall steht kein Management Server zur Verfügung, so daß die Option Launch DBA Studio alone benutzt werden muß. Abbildung 5.10: Oracle, Anmelden bei Oracle Enterprise Manager Wenn keine bevorzugten ID-Daten eingestellt wurden aber bereits Dienste in der Liste eingetragen sind, kann jetzt ein Datenbankdienst ausgewählt werden. Dazu muß lediglich der Name in der Liste der konfigurierten Dienste angeklickt werden. Es erscheint der Anmelde Dialog. Bereits beim Anmelden wird die Rolle festgelegt mit der die Verbindung arbeiten soll. Diese kann NORMAL, SYSOPER oder SYSDBA sein. Wenn die Datenbank konfiguriert werden soll, muß die Anmeldung als SYSDBA erfolgen. Abbildung 5.11: Oracle, Datenbank-Anmeldung als SYSDBA Bei der Installation werden wie bereits erwähnt die beiden folgenden Benutzer angelegt: Benutzer scott system Paßwort tiger manager Tabelle 5.2: Oracle, Standardbenutzer 50 Marcus Börger Relationale Datenbanken Installation Wenn noch keine Datenbank in der Liste bekannt ist, folgt die Auswahl der Verbindung. Am einfachsten kann hier ein Dienst aus der Liste der bereits konfigurierten Datenbankdienste ausgewählt werden. Abbildung 5.12: Oracle, Datenbank hinzufügen zeigt das am Beispiel baumbart.boerger.de. Abbildung 5.12: Oracle, Datenbank hinzufügen Jetzt kann ein eigener Tablespace angelegt werden. Im folgenden wird hier der Tablespace UNI angelegt. Nach Klicken des ‚Erstellen’ Button kann der Typ des zu erstellenden Objektes augesucht werden. Hier also Tablespace. Neben dem Namen des Tablespace können weitere Eigenschaften festgelegt werden. Insbesondere kann das Größenverhalten bestimmt werden. Entweder kann die Größe lokal oder vom Dictionary verwaltet erfolgen. Bei Auswahl der zweiten Möglichkeit können zusätzlich noch die einzelnen Parameter der Extent Verwaltung geändert werden. Die lokale Verwaltung hat den Vorteil, daß der Tablespace sich alleine Verwaltet. Das ist meist schneller als globale Organisationstabellen der Dictonary Verwaltung zu benutzen. Damit aber überhaupt eine automatische Größenanpassung erfolgen kann, muß dieses noch für die Datendatei eingeschaltet werden. Hierzu wird die Datendatei markiert und mit dem ‚Datendatei bearbeiten’ Button konfiguriert. Abbildung 5.13: Oracle, Tablespace erstellen Marcus Börger 51 Installation Relationale Datenbanken Im erscheinenden Dialog kann die Anfangsgröße der Datendatei festgelegt werden und es kann die Funktion ‚Datendatei automatisch erweitern...’ eingeschaltet werden. Damit das ganze funktioniert muß natürlich auch eine Inkrement Größe angegeben werden. Bei jeder Anforderung die zu einer größeren Datendatei führt wird diese dann mindestens um diesen Wert vergrößert. Weiterhin kann die Größe der Datendatei noch beschränkt werden. Abbildung 5.14: Oracle, Datendatei bearbeiten Nachdem der Tablespace erstellt wurde kann nun ein Benutzer angelegt werden, und diesem die beiden Tablespaces Standard und Temporär zugewiesen werden. In Abbildung 5.15: Oracle, Benutzer bearbeiten wurde dem neu erstellten Benutzer der Name UNI gegeben und ihm der Standard Tablespace UNI zugewiesen. Bei jeder weiteren Verbindung des Benutzers UNI erfolgen dessen Tätigkeiten im Tablespace UNI. Damit können mittels des Benutzers UNI im Tablespace UNI alle Beispiele der folgenden Kapitel ausgetestet werden. Abbildung 5.15: Oracle, Benutzer bearbeiten In Abbildung 5.15: Oracle, Benutzer bearbeiten wurde dem Benutzer Uni auch die DBA (Database Administrator) Rolle übertragen. Damit kann dieser Benutzer alle Objekte des Datenbankdienstes bearbeiten; sowohl die Objekte im Tablespace UNI als auch alle anderen Objekte. Da jetzt ein DBA erstellt und bekannt ist, können die beiden Standardbenutzer scott und system gelöscht oder ihre Kennwörter deaktiviert werden. Zum Deaktivieren wird einfach die Checkbox ‚Kennwort läuft jetzt ab’ auf der Seite ‚Allgemein’ eingeschaltet. 52 Marcus Börger Relationale Datenbanken Installation 5.3.6 SQL*Plus Zur Ausführung von SQL Befehlen wie sie in den folgenden Kapiteln beschrieben werden gibt es bei Oracle das SQL*Plus Worksheet und SQL*Plus Zeilenmodus. Während SQL*Plus Zeilenmodus einzelne Befehle entgegen nimmt und diese direkt ausführt, kann mit dem SQL*Plus Worksheet ein ganzes Skript ausgeführt werden. Das kann benutzt werden, um umfangreiche Datenbankaufgaben zu erledigen oder formatierte Berichte zu erstellen. Näheres zu den Formatierungsfunktionen findet sich in [Genn99]. Wie bei allen Werkzeugen erfolgt zunächst die Anmeldung die einem Datenbankdienst. Die Abbildung 5.16: Oracle, Anmeldung als Normal zeigt dies für den Datenbankdienst baumbart.boerger.de als Benutzer UNI: Abbildung 5.16: Oracle, Anmeldung als Normal Da dem Benutzer UNI der Tablespace UNI zugewiesen wurde, finden also alle folgenden Befehle solange im Tablespace UNI statt, wie nicht explizit ein anderer angegeben wird. Das eigentliche SQL*Plus Worksheet besteht aus zwei Bereichen, dem Eingabebereich, weiß hinterlegt, und dem Ausgabebereich, grau hinterlegt. Im Eingabebereich können beliebig viele SQL Befehle hintereinander eingegeben werden. Diese werde bei Klicken auf den ‚Ausführen’ Button abgeschickt. Das Ergebnis ist dann im Ausgabebereich zu sehen. Beide Bereiche können getrennt von einander gelöscht und abgespeichert werden. Abbildung 5.17: Oracle, SQL*Plus Worksheet Die aktuelle Datenbankverbindung kann durch Klicken auf den ‚Datenbankverbindung ändern...’ Button geändert werden. Einfache Texte können mit dem PROMPT Befehl ausgegeben werden: PROMPT Text; Abbildung 5.18: Oracle, SQL PROMPT Marcus Börger 53 Data Definition Language Relationale Datenbanken 6 Data Definition Language Die folgenden Kapitel geben eine Einführung in die Structured Query Language (SQL). SQL ist zwar ein oft zitierter Standard, doch weichen manche Datenbanken in Teilen davon ab und die meisten haben eigene Erweiterungen, insbesondere gibt es jedoch Unterschiede in der Syntax und den unterstützten Datenformaten. Daraus ergibt sich die folgende Empfehlung bei der Arbeit mit einem bestimmten Datenbank Management System. Entweder man benutzt ein Modellierungswerkzeug, daß die benutzte Datenbank unterstützt oder man besorgt sich vor der Arbeit ein Buch oder eine Online Hilfe, in der man die verwendete Syntax und den verwendeten Umfang nachschlagen kann. Die Data Definition Language (DDL) dient dem Erzeugen der Datenstrukturen, die während der Modellierungsphase erstellt wurden. Weiterhin existieren Befehle zur Manipulation der Strukturen und zur Vergabe von Rechten auf diesen Datenstrukturen. Auf den folgenden Seiten wird SQL mit Hilfe der EBNF beschrieben (siehe A EBNF). Ein Verständnis des hier verwendeten EBNF Teilumfangs ist zwingend erforderlich. 6.1 CREATE DATABASE Als erstes wird mit dem Befehl CREATE DATABASE eine neue Datenbank angelegt: CREATE DATABASE Datenbankname; Abbildung 6.1: Aufbau des Befehles CREATE DATABASE Dieser Befehl wird unter MySQL und PostgreSQL zum Erfolg führen. Die meisten anderen Datenbank Managementsysteme benötigen weitere Angaben, die das Erstellen der Datenbankdateien regeln. Bei diesen Systemen sollten spezialisierte mitgelieferte Werkzeuge benutzt werden. Im Falle von Oracle siehe hierzu 5.3.3 Database Configuration Assistant. 6.2 Verbinden mit der Datenbank Nachdem eine Datenbank angelegt worden ist, kann dorthin verbunden werden. Danach beziehen sich dann alle Befehle auf diese Datenbank. Die Art und Weise, wie mit einer Datenbank verbunden wird, ist sehr stark abhängig vom verwendeten Datenbank Managementsystem. Viele bieten jedoch den Befehl CONNECT, der genau diese Aufgabe erfüllt: CONNECT Datenbankname; Abbildung 6.2: Verbinden mit der Datenbank 6.3 Anlegen und Verbinden mit dem Beispiel Die Beispieldatenbank Uni wird mit dem folgenden Aufruf angelegt und mit dem zweiten Befehl wird dorthin verbunden: Not connected> CREATE DATABASE Uni; Database Uni created. Not connected> CONNECT Uni; Connected to Database Uni Uni> ? Abbildung 6.3:Anlegen der Datenbank Uni 54 Marcus Börger Relationale Datenbanken Data Definition Language 6.4 CREATE TABLE Sobald eine Datenbank angelegt worden ist und die Verbindung besteht, können Tabellen erzeugt werden. Jede Tabelle erhält mindestens eine Spaltendefinition, sind mehrere notwendig, so werden die einzelnen Spaltendefinitionen durch Kommata getrennt. Wird der Primary Key einer Tabelle aus einer einzigen Spalte gebildet, so kann die Definition des Primary Key bereits in der entsprechenden Spaltendefinition erfolgen. Wenn der Primary Key nicht aus einer einzelnen Spalte gebildet wird, muß er in einem Constraint festgelegt werden. Nach den Spaltendefinitionen können weitere Constraints folgen, die jeweils durch ein Komma getrennt werden. Indizes verwenden anstelle von PRIMARY KEY das Schlüsselwort INDEX, oder im Falle eindeutiger Indizes das Schlüsselwort UNIQUE. Die Erzeugung von nicht eindeutigen Indizes kann in den meisten Datenbank Management Systemen jedoch nur außerhalb der Tabellen Deklaration mit Hilfe des Befehles CREATE INDEX erfolgen. CREATE [ TEMPORARY ] TABLE Name ( Spaltendefinitionen[, Constraints] ) [ Optionen ]; Abbildung 6.4: Aufbau des CREATE TABLE Befehles Eine Tabelle kann durch Angabe der Option TEMPORARY als temporäre Tabelle angelegt werden. In diesem Fall ist die Tabelle nur für die aktuelle Session sichtbar. Sie wird also einerseits am Ende der Session gelöscht und andererseits ist sie für andere Benutzer nicht sichtbar. Daraus ergibt sich auch, daß zwei Benutzer eine temporäre Tabelle mit gleichem Namen anlegen können. Einige DBMS erlauben in Optionen zusätzliche Parameter am Ende der Definition. 6.4.1 CREATE TABLE für MySQL MySQL verfügt über einige Erweiterungen im CREATE TABLE Befehl. Neben der Möglichkeit den Tabellentyp festzulegen ist besonders die Erweiterung IF NOT EXISTS interessant, die es ermöglicht eine Tabelle nur dann anzulegen, wenn sie noch nicht existiert. Mittels der Angabe eines SELECT Befehls kann die Tabelle als Kopie einer Anderen erstellt werden (6.4.4 CREATE TABLE SELECT). CREATE [ TEMPORARY ] TABLE [ IF NOT EXISTS ] Name ( Spaltendefinitionen [, Constraints ] ) [TYPE={ISAM|MYISAM|HEAP|MERGE|BDB|INNODB}][UNION=( Tabellen )] [SELECT ... ]; Abbildung 6.5: CREATE TABLE für MySQL Die folgende Tabelle zeigt eine Übersicht der möglichen Tabellentypen. Option Bemerkung Alter Standard Tabellentyp. Standard Tabellentyp (Typ ISAM erweitert). Temporäre Tabellen, die nicht auf Festplatte gelangen. Unterstützt nicht: BLOB, TEXT, AUTO_INCREMENT, etc. TYPE=MERGE Nein Zusammenfassung mehrerer Tabellen. Liste der Tabellen wird in der Option UNION gesetzt. TYPE=BDB Page Locking Berkeley Database ( ab 3.23.34). TYPE=INNOBASE Row Locking Tabellentyp unter GPL Lizenz ( ab 3.23.34). TYPE=ISAM TYPE=MYISAM TYPE=HEAP Transactions Nein Nein Nein Tabelle 6.1: MySQL Tabellentypen Marcus Börger 55 Data Definition Language Relationale Datenbanken 6.4.2 Spaltendefinitionen Jede Spaltendefinition beginnt mit dem Namen der zu definierenden Spalte gefolgt vom Datentyp. Alle anderen Angaben sind optional. Zunächst kann ein Standardwert mit DEFAULT Wert festgelegt werden. Danach kann eine Angabe erfolgen ob der Wert NULL erlaubt ist oder nicht. Hierbei ist darauf zu achten, ob das Datenbank Management System den Wert NULL in Primary Key oder Index Spalten erlaubt. Soll der Wert NULL erlaubt werden, so ist keine Angabe erforderlich, die Angabe NULL darf aber enthalten sein. Im anderen Fall wird NOT NULL benutzt. Mit AUTO_INCREMENT wird eine Spalte definiert, die automatisch einen eindeutigen Wert erhält, falls kein Wert angegeben wird. AUTO_INCREMENT ist eine SQL Erweiterung die von unter anderen von MySQL und MS Access benutzt wird. Oracle unterstützt keine AUTO_INCREMENT Felder, das Verhalten kann aber mit einer Sequence manuell nachgebildet werden. In PostgreSQL existiert der Datentyp SERIAL als Ersatz für AUTO_INCREMENT10. Spaltenname Datentyp [ DEFAULT Wert ] 10 [ AUTO_INCREMENT ] [ NOT NULL | NULL ] Abbildung 6.6: Einfache Spaltendefinitionen Die Spaltendefinition kann auch Constraints enthalten, wobei optional Namen vergeben werden können. Die Angabe PRIMARY KEY legt die Spalte als Primary Key fest und darf nur für eine einzige Spaltendefinition benutzt werden. Ein zusammengesetzter Primary Key kann also nicht angelegt werden, indem jede beteiligte Spaltendefinition das Schlüsselwort PRIMARY KEY erhält. Alternativ zu PRIMARY KEY kann mit UNIQUE eine Spalte als Alternate Key definiert werden. Erhalten mehrere Spalten UNIQUE, so bildet jede dieser Spalten einen eigenen Alternate Key. Wie bereits erläutert, kann eine Spalte, die Teil des Primary Key ist, nicht den Wert NULL erhalten, die Angabe NULL ist also zusammen mit PRIMARY KEY nicht zulässig. Im Gegensatz dazu sind NULL Werte bei UNIQUE zulässig und das sogar mehrfach. Die Angabe von NOT NULL bei UNIQUE ist also erforderlich, um NULL Werte zu verhindern. Ein Foreign Key kann natürlich nur zu einer Spalte einer Tabelle erfolgen, wobei auch der Datentyp übereinstimmen muß. Wenn die Primary Key Spalte der angegebenen Tabelle referenziert werden soll, kann die Angabe der Spalte inklusive Klammern entfallen. Spaltenname Datentyp [ DEFAULT Wert ] [ [ NOT ] NULL ] 10 [ AUTO_INCREMENT ] [[ CONSTRAINT Name ] { UNIQUE | PRIMARY KEY } ] [[ CONSTRAINT Name ] CHECK (Bedingung) ] [[ CONSTRAINT Name ] REFERENCES Tabelle [(Spaltenname)] [ Deferrment ] [ ON UPDATE Aktion ] [ ON DELETE Aktion ] ] Abbildung 6.7: Spaltendefinitionen MySQL erlaubt weder die Angabe von Bedingungen über CHECK(...) noch die Definition einer Relation mittels REFERENCES. Da MySQL diese Angaben aber ignoriert, können SQL DDL Dateien, die für andere Datenbank Management Systeme geschrieben worden sind, meist ohne Änderung übernommen werden. Oracle setzt bei Relationen immer das Verhalten ON UPDATE RESTRICT ein. Angaben zur Steuerung der Relationssicherung sind nur für ON DELETE erlaubt. 10 Anlegen einer impliziten Sequence in MySQL. In PostgreSQL wird durch SERIAL implizit eine Sequence angelegt. Alternativ kann der Default Wert einer Spalte das Ergebnis einer explizit deklarierten Sequence sein DEFAULT nextval(′Sequencename′). Siehe auch 6.9 CREATE SEQUENCE. 56 Marcus Börger Relationale Datenbanken Data Definition Language 6.4.2.1 SQL Datentypen In 2.2.3 Datentypen wurden Datentypen grundsätzlich behandelt. Dieser Abschnitt beschreibt jetzt die mit SQL verwendbaren Datentypen. 6.4.2.1.1 Alphanumerische Datentypen Datentyp MySQL PostgreSQL Oracle CHAR CHAR CHAR Exakt 1 Zeichen Exakt 1 Zeichen Exakt 1 Zeichen CHAR(n) Exakt n Zeichen, wobei 1<=n<=255. CHAR(n) Exakt n Zeichen, wobei 1<=n<=255. VARCHAR(n) Maximal n Zeichen. [N]VARCHAR[2](n) Zeichenketten CHAR(n) exakter Länge Exakt n Zeichen, wobei aufgefüllt mit 0<=n<=255. Leerzeichen CHAR(0) NULL Datentyp der exakt zwei Werte hat: NULL und ''. VARCHAR(n) Zeichenketten variabler Länge Maximal n Zeichen, wobei 1<=n<=255. In späteren Versionen sollen bis zu 65535 Zeichen unterstützt werden. Vor Version 7.1 je nach Binaries zwischen 8192 und 32768 Bytes. Ab Version 7.1 abhängig vom System bis zu 1GB bzw. 4GB11. NAME Maximal 32 Zeichen. TINYTEXT Max. 255=28-1 Zeichen Maximal n Bytes, wobei 1<=n<=4000. VARCHAR2 unterstützt lediglich ASCII Zeichen. NVARCHAR2 unterstützt ebenfalls maximal 4000 Bytes jedoch mit konfigurierbaren Zeichensätzen, so daß die Anzahl der Zeichen in Abhängigkeit vom Zeichensatz kleiner der Anzahl der Bytes sein kann. TEXT [N]CLOB Verhält sich wie ein unbeschränktes VARCHAR. Maximal 4 GB Daten, wobei CLOBs ASCII Zeichen speichert und NCLOBs in Abhängigkeit vom verwendeten Zeichensatz arbeitet. TEXT Max. 65535=216-1 Zeichen. Text 12 MEDIUMTEXT Max. 16777215=224-1 Zeichen. LONGTEXT Max. 4294967295=232-1 Zeichen. Tabelle 6.2: Alphanumerische Datentypen 11 Bei 64bit Binaries vermutlich mehr. 12 Mit Version 8 wurden die neuen Datentypen [N]VARCHAR2 eingeführt. Die alte Datentypen [N]VARCHAR existieren weiterhin, die Unterschiede sind jedoch unbekannt. Marcus Börger 57 Data Definition Language Relationale Datenbanken 6.4.2.1.2 Numerische Datentypen Datentyp MySQL Oracle SMALLINT, INTEGER 2 Bytes mit Vorzeichen: Eine Beschränkung [ -32768 ; +32767 ] 1 Byte [ -128 ; 127 ], ähnlich der von vzl.13: [ 0 ; 255 ] MySQL und INTEGER, INT, INT4 PostgreSQL konnte 4 Bytes mit Vorzeichen: SMALLINT[(m)] nicht festgestellt wer[UNSIGNED][ZEROFILL] [-2147483648;+2147483647] den. 2 Byte [ -32768 ; 32767 ] BIGINT, INT8 vzl.13: [ 0 ; 65535 ] 8 Bytes mit Vorzeichen: Folgendes kann mit Oracle 8i2 unter Win[ -263 ; +263-1 ] MEDIUMINT[(m)] dows 2000 i86 [UNSIGNED][ZEROFILL] SERIAL ermittelt werden: 3 Byte [-8388608;8388607] 13 4 Bytes ohne Vorzeichen: vzl. : [ 0; 16777215 ] 133 133 2133 == 2133-50 [ 0 ; 2147483647 ] 2132 != 2132-51 Werte werden aus einer INT[EGER][(m)] 2 != 2 +1 [UNSIGNED][ZEROFILL] impliziten Sequence generiert. 4 Byte: [ -232 ; 232-1 ] Das entspräche 16,5 13 vzl. : [ 0 ; 4294967295 ] Byte. Oracle selbst ermittelt einen PlatzBIGINT[(m)][UNSIGNED] bedarf von 40 Bytes. TINYINT[(m)] [UNSIGNED][ZEROFILL] Fixkomma PostgreSQL SMALLINT, INT2 [ZEROFILL] 8 Byte: [ -263 ; 263-1 ] vzl.13: [ 0 ; 264-1 ]14 Jeder Integer Typ kann mit Formatierungen versehen werden (sieh FLOAT). FLOAT[(p|m,d)] Fließkomma FLOAT4 Einfache Genauigkeit, falls 4 Byte, Einfache Genaup,m,d<=24 sonst doppelte igkeit: [ -1.175494351E-38 , Genauigkeit. -3.402823466E+38 ; 15 {DOUBLE PRECISION | +1.175494351E-38 , DOUBLE|REAL}[(p|m,d)] +3.402823466E+38] Doppelte Genauigkeit Es kann optional entweder die Genauigkeit (p<53) oder die Anzeigelänge (m<256) und die Anzahl der Nachkommastellen (d<30, d<m-2) angegeben werden. ZEROFILL füllt links mit 0en auf. FLOAT REAL 15 DOUBLE PRECISION FLOAT, FLOAT8, 15 DOUBLE PRECISION 8 Byte, doppelte Genauigkeit: [-1.7976931348623157E-308, -2.2250738585072014E+308; +1.7976931348623157E-308, +2.2250738585072014E+308] Tabelle 6.3: Numerische Datentypen 13 vzl: Vorzeichenlose Werte können ein Bit mehr benutzen, indem ansonsten das Vorzeichen gespeichert wird. Wegen der verwendeten Rechenwerke heutiger Prozessoren (auch 64-bittige) sollten die Werte kleiner +263 sein. 15 Der Datentyp DOUBLE PRECISION benutzt tatsächlich zwei Wörter und wird von allen drei unterstützt. 14 58 Marcus Börger Relationale Datenbanken Data Definition Language 6.4.3 Constraints Den Abschluß einer Spaltendefinition bildet die Angabe über Bedingungen (Constraints). Es gibt verschiedene Arten von Constraints, sie schränken jedoch alle den Wertebereich von Spalten oder Spaltengruppen ein. Mit MySQL können keine Constraints benutzt werden. Wie bereits erwähnt ignoriert MySQL allerdings die meisten Angaben zu Constraints, so daß korrekte Definitionen wenigstens eingelesen werden können. 6.4.3.1 Check Constraint Mit Check Constraints können die Wertebereiche von Spalten eingeschränkt werden. [ CONSTRAINT Name ] CHECK (Bedingung) Abbildung 6.8: Check Constraint Dazu können sowohl Operatoren wie <, <=, >, >=, =, <>, and, or, not, in sowie IS NULL als auch Funktionen wie length zum Einsatz kommen. Bereits durch den Einsatz der Operatoren können Intervalle und Aufzählungen16 realisiert werden. Hierzu einige Beispiele: CREATE TABLE test t1 INT t2 INT t3 INT t4 INT t5 INT t6 CHAR t7 CHAR t8 VARCHAR(3) t9 VARCHAR(4) ); ( CHECK ( t1 > 0 ), CHECK ( t2 != 0 ), CHECK ( t3 <> 0 ), CHECK ( t4 < 0 AND t4 > 0 ), CHECK ( NOT t5 IS NULL AND NOT t5=0 ), NOT NULL CHECK ( t6=’A’ OR t6=’B’ OR t6=’C’), NOT NULL CHECK ( t7 IN (’A’,’B’,’C’) ), NOT NULL CHECK ( length(t8) > 1 ), NOT NULL CHECK ( length(t9) > length(t8) ) Abbildung 6.9: Check Constraints Die Spalte t1 darf nur NULL oder solche Werte annehmen die größer 0 sind. Die Werte der Spalten t2 und t3 müssen ungleich 0 sein, wobei auch hier NULL zulässig ist. In t4 ist nur der Wert NULL zulässig, denn es existiert keine Zahl, die sowohl kleiner als auch größer 0 ist. Auch die Werte für t5 müssen ungleich 0 sein, nur daß hier zusätzlich keine NULL Werte erlaubt sind. Alle anderen Spalten müssen ebenfalls einen Wert ungleich NULL annehmen. In den Spalten t6 und t7 sind nur die Zeichen A, B und C zulässig. Die Bedingung der Spalte t8 legt fest, daß die Werte mehr als 1 Zeichen lang sein müssen. Eine Besonderheit ist die Definition für t9, die verlangt, daß die Werte in t9 länger als die Werte in t8 des gleichen Datensatzes sein müssen. Die oben verwendete Funktion length zeigt das gleiche Verhalten wie alle herkömmlichen Operatoren und Funktionen in Bezug auf den Wert NULL. Sie liefern für NULL Werte als Ergebnis ebenfalls NULL. Damit gelten: • (1 < NULL) = NULL • (1 > NULL) = NULL 17 • (NULL = NULL) = NULL • length(’’) = 0 • length(NULL) = NULL • (length(NULL) < length(’’)) = NULL 16 MySQL stellt den Datentyp ENUMERATION zur Verfügung. Dieser stellt eine sehr einfache Möglichkeit zur Erstellung von Aufzählungen dar, da man so auf eine Realisierung durch komplexe CONSTRAINTS verzichten kann. 17 Bei binären Vergleichen ist das Ergebnis NULL gleichbedeutend mit false (falsch). Postgres implementiert den Vergleichsoperator = mit einem Wert NULL als Abkürzung für IS NULL. Marcus Börger 59 Data Definition Language Relationale Datenbanken 6.4.3.2 Primary Key Contraint Mit Primary Key Constraints können Primary Keys, über Spaltenlisten, definiert werden. Werte von Primary Key Feldern müssen eindeutig und ungleich NULL sein (2.2.6.1 Primary Keys). Primary Key Namen beginnen häufig mit dem Präfix „PK_“ gefolgt vom Tabellennamen. [ CONSTRAINT Name ] PRIMARY KEY (Spaltenliste) Abbildung 6.10: Primary Key Constraint 6.4.3.3 Alternate Key Constraint Alternate Keys sind eindeutige Indizes und können im Gegensatz zu einfachen Indizes innerhalb einer Tabellendefinition angelegt werden. Im Gegensatz zu diesen stellt die Eindeutigkeit ja eine Bedingung dar, denn es können nur Datensätze eingefügt werden, die noch nicht in der Tabelle vorhanden sind. Ausgenommen sind NULL Werte, die mehrfach vorkommen dürfen. Alternate Keys werden meist aus Präfix „AK_“ gefolgt vom Tabellennamen und einer Nummer oder dem Zweck gebildet. [ CONSTRAINT Name ] UNIQUE (Spaltenliste) Abbildung 6.11: Alternate Key Constraint 6.4.3.4 Foreign Key Constraint Foreign Key Constraints, die über mehr als ein Feld definiert sind, müssen extra definiert werden, wobei die Typen der Spalten beider Spaltenlisten übereinstimmen müssen. Während die Spaltenliste1 angegeben werden muß, ist die Angabe der Spaltenliste2 zur Auswahl der Spalten in der Zieltabelle optional, wenn der Primary Key referenziert wird. Die zusätzlichen Angaben ON DELETE und ON UPDATE legen das Verhalten der Constraint fest und sind optional. Die Aktionsangaben zu ON DELETE bzw. ON UPDATE können RESTRICT, CASCADE, SET NULL oder SET DEFAULT sein (siehe 2.2.7 Referenzielle Integrität). Oracle kennt weder ON UPDATE noch RESTRICT. Der Name von Foreign Keys wird meist aus dem Präfix „FK_“ und den Namen der beteiligten Tabellen oder der Bedeutung der Relation gebildet. [ CONSTRAINT Name ] FOREIGN KEY (Spaltenliste1) REFERENCES Tabelle[(Spaltenliste2)] [ Deferrment ] [ ON UPDATE Aktion ] [ ON DELETE Aktion ] Abbildung 6.12: Foreign Key Constraint 6.4.3.5 Constraint Deferrment Mache Datenbank Managementsysteme erlauben weiteren Einfluß auf das Verhalten der Constraints zu nehmen, indem zu jeder einzelnen Constraint eine Deferrment Angabe erfolgen kann. Dabei bedeutet INITIALLY IMMEDIATE, daß die Constraint sofort geprüft wird und INITIALLY DEFERRED, daß die Constraint am Ende der Transaktion geprüft wird. Zusätzlich legt die Option DEFERRABLE fest, daß einer Constraint manuell in den Zustand DEFERRED versetzen kann, und somit deaktiviert wird. Die Option NOT DEFERRABLE verhindert das. [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [[NOT] DEFERRABLE] Abbildung 6.13: Constraint Deferrment 60 Marcus Börger Relationale Datenbanken Data Definition Language 6.4.4 CREATE TABLE SELECT Tabellen können auch über SELECT Abfragen, wie sie in 7.2 SELECT beschrieben werden, erstellt und mit Daten aufgefüllt werden. Dieses Vorgehen ermöglicht zum Beispiel eine Teilmenge der Daten in einer temporären Tabelle weiter zu verarbeiten. MySQL benutzt dazu die Form CREATE TABLE SELECT und kann die neue Tabelle durch die Angabe von Spaltendefinitionen um zusätzliche Spalten erweitern. Wird das ausgenutzt, müssen Vorkehrungen zur Behandlung der zusätzlichen Spalten getroffen werden, denn diese Spalten können nicht über den nachfolgenden SELECT Befehl mit Daten gefüllt werden. Als Lösung bieten sich daher die Verwendung von AUTO_INCREMENT oder Defaultwerten sowie das Zulassen von NULL an. Alternativ können weitere Spalten auch durch die Angabe von Konstanten im SELECT Abschnitt angefügt werden, wobei sich die Benutzung von Aliasnamen für diese Spalten empfiehlt, da andernfalls der Spaltenname aus dem Wert der Konstante gebildet wird. Durch die Angabe eines immer ungültigen WHERE Abschnittes (wie WHERE 0=1) läßt sich eine Tabellenstruktur auch ohne Daten kopieren. CREATE [ TEMPORARY ] TABLE Tabelle [ (Spaltendefinitionen) ] [ AS ] SELECT Spaltenliste [ FROM ... ]; Abbildung 6.14: CREATE TABLE SELECT, MySQL PostgreSQL erlaubt zwei syntaktisch verschiedene Varianten. Die erste Variante erinnert sehr stark an die MySQL Form, mit dem Unterschied, daß keine Erweiterung durch die Angabe von Spaltendefinitionen möglich ist und das Schlüsselwort AS zwingend ist. Da PostgreSQL ferner typgenau arbeitet, legt der SELECT Abschnitt die Spaltentypen exakt fest. Allerdings werden keine CONSTRAINTS oder Indizes kopiert und in allen Spalten ist NULL erlaubt. Diese syntaktische Variante ist eng mit INSERT INTO SELECT verwandt (siehe 7.1.1 INSERT INTO SELECT). CREATE [ TEMPORARY ] TABLE Tabelle AS SELECT Spaltenliste [ FROM ... ]; Abbildung 6.15: CREATE TABLE SELECT, PostgreSQL & Oracle Die zweite Variante benutzt eine andere Syntax, verhält sich ansonsten aber exakt wie die oben beschriebene erste Variante. SELECT Spaltenliste INTO [ TEMPORARY ] Tabelle FROM ... ; Abbildung 6.16: SELECT INTO FROM, PostgreSQL Oracle erlaubt die Benutzung der ersten Variante und verlangt wie PostgreSQL die Verwendung des Schlüsselwortes AS. Marcus Börger 61 Data Definition Language Relationale Datenbanken 6.4.5 Anlegen der Tabellen der Datenbank Uni Die folgenden drei Abbildungen legen die drei Tabellen Personen, Veranstaltungen und besuchen an. Die Constraint Angaben in den Tabellen Veranstaltungen und besuchen bewirken, daß ein Löschen eines Dozenten zur Folge hat, daß alle seine Veranstaltungen aus der Tabelle Veranstaltungen gelöscht werden. Dies wiederum bewirkt ein Löschen aller zugehörigen Datensätze in der Tabelle besuchen. Wird eine PNr geändert, so werden die Änderungen in den Tabellen Veranstaltungen und besuchen nachvollzogen. Als letztes bewirkt das Löschen eines Datensatzes aus Persononen, das Löschen aller zugeordneten Datensätze in der Tabelle besuchen, also aller Datensätze mit gleicher PNr. Uni> CREATE TABLE Personen ( PNr INT NOT NULL, Name VARCHAR(255) NOT NULL, Gehalt FLOAT, Datum VARCHAR(30), CONSTRAINT PK_Personen PRIMARY KEY (PNr) ); Abbildung 6.17: Erzeugen der Tabelle Personen Uni> CREATE TABLE Veranstaltungen ( VNr INT NOT NULL, PNr INT NOT NULL, VName VARCHAR (255) NOT NULL, VZeit VARCHAR (32) NOT NULL, VOrt VARCHAR (32) NOT NULL, CONSTRAINT PK_Veranstaltungen PRIMARY KEY (VNr), CONSTRAINT AK_Veranst_VName UNIQUE (VName), CONSTRAINT AK_Veranst_VZeit UNIQUE (VZeit, VOrt), CONSTRAINT FK_Veranst_Personen FOREIGN KEY (PNr) REFERENCES Personen(PNr) ON DELETE CASCADE ON UPDATE CASCADE ); Abbildung 6.18: Erzeugen der Tabelle Veranstaltungen Uni> CREATE TABLE besuchen ( VNr INT NOT NULL, PNr INT NOT NULL, CONSTRAINT PK_besuchen PRIMARY KEY (VNr, PNr), CONSTARINT FK_besuchen_Veranst FOREIGN KEY (VNr) REFERENCES Veranstaltungen(VNr) ON DELETE CASCADE ON UPDATE CASCADE, CONSTARINT FK_besuchen_Personen FOREIGN KEY (PNr) REFERENCES Personen(PNr) ON DELETE CASCADE ON UPDATE CASCADE ); Abbildung 6.19: Erzeugen der Tabelle besuchen Die Kommandos lassen sich sowohl mit MySQL als auch mit Postgres direkt ausführen, wobei MySQL sämtliche Angaben über Relationen ignoriert. Für die Ausführung unter Oracle müssen alle ON UPDATE CASCADE Regeln entfernt werden. Denn bei Oracle ist immer ON UPDATE RESTRICT eingestellt und es kann nur für Löschoperationen das Verhalten festgelegt werden. 62 Marcus Börger Relationale Datenbanken Data Definition Language 6.5 CREATE INDEX Das Anlegen der Indizes muß nicht unbedingt innerhalb der Tabellendefinition erfolgen. In vielen Datenbank Management Systemen könne Indizes sogar nur außerhalb der Tabellendefinitionen erzeugt werden. Insbesondere kann man dadurch auch nachträglich Indizes anlegen. Neben der Angabe der Spalten kann auch die Sortierrichtung angegeben werden, dabei steht ASC für aufsteigend und DESC für Absteigend. Durch den Zusatz UNIQUE können eindeutige Indizes also Alternate Keys erzeugt werden. Bei der Benennung von Indizes wird oft „IX_“ gefolgt vom Tabellennamen als Präfix benutzt. CREATE [ UNIQUE ] INDEX Name ON Tabelle (Spaltenliste); Abbildung 6.20: Aufbau des CREATE INDEX Befehles Das folgende Beispiel legt die Indizes für die Datenbank Uni an: Uni> CREATE ON Uni> CREATE ON INDEX IX_Personen_Name Personen (Name ASC, Gehalt ASC, Datum ASC); INDEX IX_Veranst_PNr Veranstaltungen (PNr); Abbildung 6.21: Anlegen der Indizes für die Datenbank Uni 6.6 CREATE VIEW Virtuelle Tabellen können mit dem Befehl CREATE VIEW erzeugt werden. Dazu kann jede beliebige SQL Abfrage benutzt werden, mit der Einschränkung, daß manche Datenbank Management Systeme keine Sortierung (ORDER BY) zulassen. CREATE VIEW Name AS SELECT Abfrage; Abbildung 6.22: Aufbau des CREATE VIEW Befehles Ein komplexes Beispiel wird in Abbildung 7.21: VIEW Anzahl gezeigt. 6.7 CREATE TRIGGER Trigger ermöglichen es auf Aktionen in der Datenbank mit komplexen Funktionen zu reagieren. Genaugenommen können Trigger auf verändernde DML Aktionen innerhalb einer Datenbank reagieren, also Einfügen, Löschen oder Verändern von Daten. Sie können nicht auf Abfragen oder Befehle aus dem DDL Bereich reagieren wie etwa Erzeugen oder Löschen von Tabellen. Trigger können sowohl vor (BEFORE) als auch nach (AFTER) der Aktion ausgeführt werden und sie können auf einzelne Befehle (FOR EACH STATEMENT) oder für jeden einzelnen Datensatz (FOR EACH ROW) der von dem Befehl beeinflußt wird ausgeführt werden. Manche DBMS haben auch die sogenannten INSTEAD OF Trigger implementiert, bei denen der auslösende Befehl durch die Triggerfunktion ersetzt wird18. Das Kapitel 10 Trigger befaßt sich ausführlich mit dem Thema. 18 Der Microsoft SQL Server erlaubt nur INSTEAD OF Trigger, also weder BEFORE noch AFTER. Während Oracle und Postgres keine INSTEAD OF Trigger erlauben. Marcus Börger 63 Data Definition Language Relationale Datenbanken 6.8 CREATE RULE Mit Regeln kann man viele einfache Anwendungen von Triggern elegant lösen. Im Gegensatz zu Triggern kann man mit Regeln allerdings DML Befehle lediglich durch andere DML Befehle ersetzen und nicht durch komplexe Funktionen. Im Gegensatz zu Triggern können Rules aber auch für Abfragen also SELECT Befehle erstellt werden. 6.9 CREATE SEQUENCE MySQL unterstützt ausschließlich implizite Sequences über den Zusatz AUTO_INCREMENT zu einer numerischen Spalte. 6.10 ALTER TABLE Der ALTER TABLE Befehl ermöglicht es Tabellen Definitionen zu ändern, allerdings ist der Umfang des Befehles sehr stark vom verwendeten DBMS abhängig. 6.10.1 ALTER TABLE und MySQL 6.10.2 ALTER TABLE und Oracle 6.10.3 ALTER TABLE und PostgreSQL 64 Marcus Börger Relationale Datenbanken Data Definition Language 6.11 DROP Mit DROP können Objekte innerhalb der Datenbank gelöscht werden. Dazu wird neben dem Namen des zu löschenden Objektes noch der Objekttyp benötigt. DROP Objekttyp Objektname; Abbildung 6.23: Aufbau des DROP Befehles Der folgende Befehl löscht Beispielsweise die Tabelle besuchen: DROP TABLE besuchen; Abbildung 6.24: Löschen der Tabelle besuchen Neben TABLE kommen als Objekttyp noch DATABASE, CONSTRAINT, INDEX, TRIGGER, RULE in Frage. Wenn ein Objekt gelöscht wird, so werden auch alle direkt abhängigen Objekte gelöscht. Beim Löschen eines DATABASE Objektes werden also insbesondere alle darin gespeicherten TABLE Objekte ohne Einschränkung inklusive aller Datensätze gelöscht. Wird ein TABLE Objekt gelöscht, so werden alle darin enthaltenen Daten gelöscht. Weiterhin werden alle direkt zusammenhängende Objekte wie CONSTRAINT19, INDEX und TRIGGER gelöscht. Eine Tabelle kann daher nicht gelöscht werden, wen andere Objekte der Datenbank auf sie verweisen. Wenn die Tabelle A von der Tabelle B referenziert wird, es also in der Tabelle B einen FOREIGN KEY auf die Tabelle A gibt, so kann die Tabelle A nicht gelöscht werden, ohne zuvor die Tabelle B oder die FOREIGN KEY Definition zu löschen. 6.12 TRUNCATE TABLE Mit dem TRUNCATE Befehl besteht die Möglichkeit eine Tabelle sehr schnell zu leeren. Während der in 7.5 DELETE beschriebene Befehl Datensätze einzeln löscht, erfolgt dies bei TRUNCATE als Mengenoperation. Das bedeutet, daß abhängig vom Datenbank Management System Datensätze Blockweise oder sogar alle Datensätze auf einmal gelöscht werden. Der TRUNCATE Befehl löst in den meisten DBMS keine TRIGGER aus. Allerdings verhindern Trigger und Foreign Key Constraints bei manchen Systemen die Ausführung des Befehles. TRUNCATE TABLE Objektname; Abbildung 6.25: Aufbau des TRUNCATE TABLE Befehles Natürlich könnte man die Tabelle auch mit dem Befehl DROP TABLE löschen, dann müsste man aber alle Strukturen, die zur Datenbank gehören neu anlegen. Weiterhin ist es auch nicht immer möglich eine Tabelle zu löschen und neu zu erstellen, da dadurch Tabellenabhängigkeiten zerstöt werden. 19 Bei Oracle muß hierzu der Befehl DROP TABLE Name CASCADE CONSTRAINTS benutzt werden. Marcus Börger 65 Data Manipulation Language Relationale Datenbanken 7 Data Manipulation Language Mit den Befehlen der Data Manipulation Language (DML) können Daten erzeugt, ermittelt, verändert und gelöscht werden. 7.1 INSERT INTO Nachdem eine Datenbank modelliert und angelegt wurde, kann sie mit Daten gefüllt werden. Diese Aufgabe wird vor allem durch Verwendung von INSERT INTO Befehlen erledigt. Liegen die Daten bereits als Textdatei oder in anderen elektronischen Formaten vor, so gibt es eine Reihe wesentlich effizienterer Möglichkeiten, die jedoch sehr stark von dem verwendeten Datenbank Managementsystem sind. Eine dieser Möglichkeiten ist der Befehl LOAD FROM FILE, in vielen DNMS angeboten wird. Es gibt auch vielfältige Möglichkeiten eine Textdatei o.ä. zu einer Reihe von INSERT INTO Befehlen zu konvertieren und damit zurück zum Befehl: INSERT INTO Tabelle [ (Spaltenliste) ] VALUES (Wertliste); Abbildung 7.1: Aufbau des INSERT INTO Befehles Zunächst werden die Tabelle und die angegebenen Spalten festgelegt, wobei die Spaltenliste optional ist. Entfällt sie, müssen alle Spalten in der Wertliste belegt werden. Es dürfen beim INSERT INTO Befehl logischerweise keine Spalten ausgelassen werden, die als NOT NULL definiert sind und keinen Standardwert besitzen. Die Werte innerhalb der Wertliste werden durch Kommas voneinander getrennt und alle Werte außer Zahlen werden von einfachen Anführungsstrichen umschlossen. Wird der einfache Anführungsstrich als Wert oder Teil einer Zeichenkette benötigt kann man ihn escapen, indem man vor das Anführungszeichen ein Gegenschrägstrich (Backslash \) schreibt. Es ist durchaus sinnvoll auch bei vollständigen INSERT INTO Befehlen, wenn also alle Spalten belegt werden, die Spaltenliste anzugeben. Erstens kann man dann die Spaltenreihenfolge unabhängig von der Reihenfolge in der Datenbank wählen. Und Zweitens kann man die Befehle auch dann weiterverwenden, wenn sich die Struktur der Tabelle geändert hat. Dabei muß allerdings vorausgesetzt sein, daß die Spalten des alten Befehles in gleicher Form noch in der geänderten Tabelle benutzbar sind und es keine neuen Spalten gibt, die angegeben werden müssen. 7.1.1 INSERT INTO SELECT Der INSERT Befehl kann zusammen mit dem in 7.2 SELECT vorgestelltem SELECT Befehl verwendet werden. Im Gegensatz zu CREATE TABLE SELECT und SELECT INTO muß hier die Tabelle bereits vorhanden sein (siehe 6.4.4 CREATE TABLE SELECT). INSERT INTO Tabelle SELECT Spaltenliste FROM ...; Abbildung 7.2: Aufbau des INSERT INTO SELECT Befehles In der nachstehenden Abbildung wird zunächst eine leere Tabelle mit dem Namen Dozenten und der Struktur der Tabelle Personen erstellt. Danach werden alle Dozenten aus Personen in diese Tabelle kopiert. CREATE TABLE Dozenten AS SELECT * FROM Personen WHERE 0=1; INSERT INTO p SELECT * FROM Personen WHERE PTyp='Dozent'; Abbildung 7.3: INSERT INTO SELECT Beispiel 66 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.1.2 Eingabe der Beispieldaten Das folgende Beispiel fügt alle Personen in die Tabelle Personen ein, wobei die Spalte Adresse nicht angegeben wird: INSERT INTO Personen (PNr, Name, Gehalt, Datum) VALUES (100000, 'Ebert, K.', 10000, '13.9.1980'); INSERT INTO Personen (PNr, Name, Gehalt, Datum) VALUES (100001, 'Zucker, G.', 11000, '5.3.1982'); INSERT INTO Personen (PNr, Name, Gehalt, Datum) VALUES (100002, 'Meier, A.', NULL, '1.10.1998'); INSERT INTO Personen (PNr, Name, Gehalt, Datum) VALUES (100003, 'Kühn, H.', NULL, '1.10.1999'); INSERT INTO Personen (PNr, Name, Gehalt, Datum) VALUES (100004, 'Muster, M.', NULL, '1.10.1999'); Abbildung 7.4: Belegen der Tabelle Personen Das Zweite Beispiel belegt die Tabelle Veranstaltungen: INSERT INTO Veranstaltungen (VNr, PNr, VName, VZeit, VOrt) VALUES (1, 100000, 'Einführung', 'Mo, 10:00', 'H1'); INSERT INTO Veranstaltungen (VNr, PNr, VName, VZeit, VOrt) VALUES (2, 100000, 'Modellierung', 'Di, 12:00', 'H2'); INSERT INTO Veranstaltungen (VNr, PNr, VName, VZeit, VOrt) VALUES (3, 100001, 'SQL-DDL', 'Mo, 10:00', 'H3'); INSERT INTO Veranstaltungen (VNr, PNr, VName, VZeit, VOrt) VALUES (4, 100001, 'SQL-DML', 'Di, 10:00', 'H1'); Abbildung 7.5: Belegen der Tabelle Veranstaltungen Als letztes wird die Tabelle besuchen mit Werten gefüllt: INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO besuchen besuchen besuchen besuchen besuchen besuchen (PNr, (PNr, (PNr, (PNr, (PNr, (PNr, VNr) VNr) VNr) VNr) VNr) VNr) VALUES VALUES VALUES VALUES VALUES VALUES (100002, (100002, (100002, (100003, (100004, (100004, 2); 3); 4); 1); 1); 2); Abbildung 7.6: Belegen der Tabelle besuchen Die Reihenfolge der INSERT INTO Befehle ist für die Beispiel Datenbank nicht unerheblich, wenn die Relationen gesichert werden. Wird PNr der Tabelle Veranstaltungen als Foreign Key definiert, so muß es einen Datensatz mit dem entsprechenden Wert für PNr in der Tabelle Personen geben, bevor ein Datensatz mit diesem Wert in die Tabelle Veranstaltungen eingefügt werden kann. Am einfachsten erreicht man das für die Beispieldatenbank, indem man zuerst alle Personen, dann alle Veranstaltungen und schließlich alle Werte der Tabelle besuchen in die Datenbank schreibt. In den drei vorangegangenen Abbildungen fällt auf, daß Zahlen nicht von einfachen Anführungsstrichen eingeschlossen sind. Das ist zwar erlaubt aber unnötig. Nachdem die Datenbank mit Werten gefüllt ist, kann nun die eigentliche Arbeiten mit der Datenbank beginnen. Es können nun Daten ermittelt und berechnet werden. Das nächste Kapitel zeigt, wie das gemacht werden kann. Marcus Börger 67 Data Manipulation Language Relationale Datenbanken 7.2 SELECT Der SELECT Befehl wird benutzt, um Daten aus der Datenbank zu ermitteln. Dies kann im einfachsten Fall bedeuten, daß ein Datensatz der Datenbank abgerufen wird. Im Extremfall kann man so aber auch Berechnungen über der gesamten Datenbank ausführen. Der SELECT Befehl hat den folgenden Aufbau: SELECT Spaltenliste [ FROM Tabellenliste ] [ WHERE Kriterium ] [ GROUP BY Gruppierung ] [ HAVING wobei ] [ ORDER BY Sortierung ] [ FOR UPDATE ]; Abbildung 7.7: Aufbau des SELECT Befehls 7.2.1 FROM Im einfachsten Fall selektiert man die Werte einer Spalte einer Tabelle, durch die Abschnitte SELECT und FROM, die zwingend sind (alle anderen sind optional). Im nachfolgenden Beispiel erhält man zweimal Dozent und dreimal Student als Ergebnis, da das SELECT Kommando nicht weiter eingeschränkt worden ist: Uni> SELECT PTyp FROM Personen; PTyp ---------Dozent Dozent Student Student Student (5 rows) Abbildung 7.8: Einfaches SELECT Mehrere Spalten können durch Kommata getrennt angegeben werden: Uni> SELECT Name, PTyp FROM Personen; Name PTyp ---------------------Ebert, K. Dozent Zucker, G. Dozent Meier, A. Student Kühn, H. Student Muster, M. Student (5 rows) Abbildung 7.9: SELECT mit mehreren Spalten Wird statt dessen der * Operator angegeben, so erhält man alle Spalten im Ergebnis: Uni> SELECT * FROM Personen; Abbildung 7.10: SELECT * 68 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.2 WHERE Der WHERE Abschnitt einer SELECT Abfrage dient dazu das Ergebnis zu beschränken, indem nur Datensätze zurückgeliefert werden, die ein bestimmtes Kriterium erfüllen. Über die Operatoren AND, OR sowie NOT lassen sich mehrere Kriterien zu einem zusammenfassen. Es existiert eine Vielzahl von Operatoren und Vergleichsoperationen (siehe 7.6 Operatoren und Funktionen). SELECT Name FROM Personen WHERE PTyp='Dozent'; SELECT Name FROM Personen WHERE PTyp='Dozent' AND Gehalt>10000; Abbildung 7.11: WHERE in SELECT 7.2.3 Aliasnamen Treten Namen in einer Abfrage mehrfach für verschiedene Verwendungszwecke auf, so kann man sie durch die Vergabe von Aliasnamen differenzieren. Man kann aber auch einfach die Spaltennamen der Rückgabewerte umbenennen. SELECT Name AS Professor FROM Personen WHERE PTyp='Dozent'; SELECT p.Name Professor FROM Personen p WHERE p.PTyp='Dozent'; Abbildung 7.12: Aliasnamen In Abbildung 7.12: Aliasnamen erkennt man, daß SQL das Schlüsselwort AS vorsieht, um Aliasnamen zu deklarieren. Das zweite Beispiel zeigt den Verzicht auf AS, daß bei den meisten Datenbanken entfallen kann. Es zeigt auch die Verwendung von Aliasnamen für Tabellen. Eine häufige Ursache für das mehrfache Auftreten von Namen für verschiedene Zwecke ist die Verwendung gleicher Spaltennamen in mehreren Tabellen. Sollen mehrere Wörter einen Spaltennamen bilden, so kann dies durch doppelte Anführungsstriche erreicht werden. 7.2.4 Abfragen über mehrere Tabellen SELECT Abfragen können sich natürlich über mehrere Tabellen erstrecken. Das wird vor allem im Zusammenhang mit definierten Relationen verwendet. Dabei ist es wichtig Spaltennamen, die in mehreren Tabellen vorkommen, durch den vorangestellten Tabellennamen eindeutig zu identifizieren. Die Abbildung unten zeigt die Relation aus Abbildung 2.15: Relationstyp n zu m: Uni> SELECT p.Name, v.VName FROM Personen p, Veranstaltungen v, besuchen b WHERE p.PNr=b.PNr AND b.VNr=v.VNr AND p.PTyp='Student'; Name VName ----------------------------Meier, A. Modellierung Kühn, H. Einführung Kühn, H. Modellierung Muster, M. Modellierung Muster, M. SQL-DML Muster, M. SQL-DDL (6 rows) Abbildung 7.13: SELECT über einer n zu m Relation Wird der * Operator bei SELECT Abfragen verwendet, die in ihrem FROM Teil mehrere Tabellen auflisten, so erhält man als Ergebnis alle Spalten aller gelisteten Tabellen. Um lediglich alle Spalten einer Tabelle zu ermitteln stellt man dem * Operator den Namen der Tabelle voran (SELECT tabelle1.* FROM tabelle1, tabelle2). Marcus Börger 69 Data Manipulation Language Relationale Datenbanken 7.2.5 Tabellen mehrmals in einer Abfrage Es kann durchaus sinnvoll sein eine Tabelle mehrfach in einer Abfrage zu benutzen, dann müssen verschiedene Aliasnamen für die Tabelle vergeben werden (eine Verwendung benötigt keinen Aliasnamen). Auch hierbei wird von der Abfrage das Kreuzprodukt aller Datensätze aller beteiligten Tabellen gebildet, wenn das Ergebnis durch den Einsatz von WHERE nicht weiter einschränkt. Das nachfolgende Beispiel ermittelt alle Dozenten und deren Gehalt, die ein höheres oder gleiches Gehalt haben, als der Dozenten mit der PNr 100000, ohne dessen Gehalt zu kennen: Uni> SELECT p2.Name, p2.Gehalt FROM Personen p1, Personen p2 WHERE p1.PNr=100000 AND p1.PNr<>p2.PNr AND p2.Gehalt>p1.Gehalt; Name Gehalt ---------------------Zucker, G. 11000 (1 rows) Abbildung 7.14: Mehrfachverwendung einer Tabelle in einer Abfrage Bei der Verwendung von p2.Gehalt>=p1.Gehalt und ohne p1.PNr<>p2.PNr würde die Abfrage in Abbildung 7.14: Mehrfachverwendung einer Tabelle in einer Abfrage neben dem Dozenten Zucker, G. ermitteln auch den Dozenten Ebert, K. ermitteln. 7.2.6 Abfragen mit indirekten Tabellen Es ist auch möglich Abfragen zu erstellen, bei denen Tabellen nur indirekt benötigt werden. Indirekte Tabellen finden dabei im WHERE Abschnitt Verwendung, aber keine ihrer Spalten werden zurück geliefert. Das passiert zum Beispiel, wenn alle Studenten-Dozenten Beziehungen gelistet werden sollen: Uni> SELECT p1.Name "Student hört", p2.Name Dozent FROM Personen p1, Personen p2, besuchen b, Veranstaltungen v WHERE p1.PNr=b.PNr AND b.VNr=v.VNr AND v.PNr=p2.PNr GROUP BY p1.PNr, p2.PNr; Student hört Dozent ------------------------Meier, A. Ebert, K. Meier, A. Zucker, G. Kühn, H. Ebert, K. Muster, M. Ebert, K. Muster, M. Zucker, G. (5 rows) Abbildung 7.15: SELECT mit indirekten Tabellen Die Abbildung 7.15: SELECT mit indirekten Tabellen zeigt zunächst die Verwendung von Aliasnamen in doppelten Anführungsstrichen. Das bewirkt, daß der gesamte enthaltene Text als Spaltenname genutzt wird und somit im Beispiel der Satz "Student hört Dozent" als Tabellenüberschrift entsteht. Außerdem werden die Tabellen besuchen und Veranstaltungen nur indirekt im WHERE Abschnitt benutzt, weshalb sie im FROM Teil gelistet werden. Als letztes bewirkt die Verwendung von GROUP BY, daß keine doppelten Datensätze im Ergebnis enthalten sind. 70 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.7 Aggregation Mittels Aggregation können schon während der Abfrage Daten berechnet werden. Das ist sehr nützlich, da oft nicht einzelne Datensätze, sondern vielmehr Informationen über diese benötigt werden. Dazu gibt es die folgen Aggregatfunktionen. 7.2.7.1 SUM, MAX, MIN, AVG Die vier Standard Aggregatfunktionen sind SUM, MAX, MIN und AVG. Zur Berechnung werden alle selektierten Werte einer Spalte herangezogen, welche nicht den Wert NULL haben. Sind hingegen alle betrachteten Werte mit NULL belegt, so ist auch das Ergebnis NULL. • SUM berechnet die Summe der Spaltenwerte. Hier verhalten sich NULL Werte also wie der Wert 0. • MAX ermittelt den größten Wert einer Spalte. Der kleinste Wert ist NULL. • MIN liefert den kleinsten Wert einer Spalte. Der größte Wert ist NULL. • AVG berechnet den Durchschnitt der Spaltenwerte. 7.2.7.2 COUNT Mit COUNT können Datensätze einer Tabelle oder nicht NULL Werte von Spalten gezählt werden. • COUNT(*) zählt alle Datensätze. Im Gegensatz zu den vorgenannten Aggregatfunktionen ignoriert COUNT in diesem Fall keine NULL Werte. • COUNT(sp) zählt alle Datensätze, die nicht NULL als Wert der Spalte sp besitzen. Da AVG nur nicht NULL Werte benutzt, muß COUNT(sp) benutzt werden um die Anzahl der von AVG(sp) berücksichtigten Werte zu ermitteln. 7.2.8 GROUP BY Das Gruppieren von Datensätzen erlaubt GROUP BY. Durch die Angabe einer Spalte im GROUP BY Abschnitt wird die Tabelle in disjunkte Gruppen zerlegt, denen jeweils exakt ein Wert der angegebenen Spalte entspricht. Diese Art der Gruppierung läßt sich auch über mehrere Spalten definieren. In der Tabelle Personen wurden bisher Studenten und Dozenten gespeichert. Wird GROUP BY auf PTyp angewandt, so entstehen genau die zwei Gruppen Studenten und Professoren. uni> SELECT PTyp, COUNT(*) AS count FROM Personen GROUP BY PTyp; PTyp count ----------------Dozent 2 Student 3 (2 rows) Abbildung 7.16: GROUP BY Abfrage Man erkennt in Abbildung 7.16: GROUP BY Abfrage, daß die Spaltenüberschrift im Ergebnis der Abfrage aus der Aggregatfunktion und nicht aus der Tabelle gebildet wird. Wird die gleiche Aggregatfunktion auf mehrere Spalten angewandt, müssen also Aliasnamen vergeben werden. Manche Datenbank Management Systeme liefern aber auch COUNT(*) als Überschrift. Marcus Börger 71 Data Manipulation Language Relationale Datenbanken 7.2.9 HAVING Aggregat Werte können nicht im WHERE Abschnitt einer SQL Abfrage genutzt werden. Hierzu dient der HAVING Teil. Meist wird HAVING im Zusammenhang mit GROUP BY genutzt, denn auf diese Weise kann man aus den Ergebnisgruppen diejenigen auswählen, die bezüglich der Aggregatwerte von Interesse sind. uni> SELECT PTy, COUNT(*) AS count FROM Personen GROUP BY PTyp HAVING COUNT(*) > 2; PTyp count ----------------Student 3 (1 row) Abbildung 7.17: HAVING Abfrage 7.2.10 ORDER BY In den vorangegangenen Kapiteln war schon mehrfach die Rede davon, Ausgaben sortieren zu können. Dazu wird im SELECT Befehl der Abschnitt ORDER BY verwendet. Sortierungen erfolgen immer Spaltenweise, wobei ein entsprechender Index vorhanden sein sollte, der die gewünschte Sortierfolge bereithält, da sie ansonsten bei jeder Abfrage temporär erstellt werden müßte. Uni> SELECT Name FROM Personen ORDER BY Name; Name ------------------------Ebert, K. Kühn, H. Meier, A. Muster, M. Zucker, G. (5 rows) Abbildung 7.18: Sortierte Abfrage Man kann die Sortierrichtung mit der Angabe ASC explizit als aufsteigend oder mit DESC als absteigend festlegen. Wird nur ein Sortierkriterium angegeben, so kann fast immer die Angabe der Richtung entfallen, wobei der Vorgabe Wert aufsteigend ist. Viele Datenbank Management Systeme verlangen jedoch die Angabe, wenn nach mehr als einer Spalte sortiert werden soll: Uni> SELECT PTyp, Name FROM Personen ORDER BY PTyp ASC, Name ASC; PTyp Name ---------------------Dozent Ebert, K. Dozent Zucker, G. Student Kühn, H. Student Meier, A. Student Muster, M. (5 rows) Abbildung 7.19: Mehrfachsortierung 72 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.11 UNION Mit UNION können die Ergebnisse von SELECT Abfragen zu einem Ergebnis zusammengefaßt werden, sofern sie die gleiche Datenstruktur zurück liefern. Haben die Ergebnisspalten dabei unterschiedliche Namen, so werden die Namen der ersten Abfrage genutzt. Die Abbildung 7.20: UNION zeigt eine einfache Union, die alle Namen für Personen und Veranstaltungen in einer Abfrage zurück liefert: Uni> SELECT Name FROM Personen UNION SELECT VName FROM Veranstaltungen; Name ------------Ebert, K. Zucker, G. Meier, A. Kühn, H. Muster, M. Einführung Modellierung SQL-DDL SQL-DML (9 rows) Abbildung 7.20: UNION Die folgende Abbildung zeigt, wie eine View erzeugt und benutzt wird. Dies wird oft bei sehr komplexen Abfragen wie der hier gezeigten dreifachen Union benutzt, um die Abfrage nach dem einmaligen Erzeugen als View einfacher handhaben zu können: Uni> CREATE SELECT UNION SELECT UNION SELECT VIEW Anzahl AS 'Personen' AS Tabelle, COUNT(*) FROM Personen 'Veranstaltungen', COUNT(*) FROM Veranstaltungen 'besuchen', COUNT(*) FROM besuchen; View created Uni> SELECT * FROM Anzahl; Tabelle Anzahl ------------------------Personen 5 Veranstaltungen 4 besuchen 6 (3 rows) Abbildung 7.21: VIEW Anzahl In diesem Beispiel wird auch demonstriert wie vorgegebene Texte (hier die Tabellennamen) als Ergebnis geliefert werden können. Bei kleinen Modellen, wie dem hier benutzten 3 Tabellen Modell, funktioniert die Abfrage sehr gut. Bei großen Modellen sollte man derartige Abfragen aus Datenbank spezifischen Befehlen erstellen, die eine derartige Aufgabe ohne View und Union ermöglichen. Marcus Börger 73 Data Manipulation Language Relationale Datenbanken 7.2.12 UNION ALL Eine UNION liefert keine doppelten Werte. Diese werden erst durch die Verwendung von UNION ALL anstelle von UNION ermittelbar. 7.2.13 EXCEPT EXCEPT verhält sich syntaktisch wie UNION, es faßt also zwei Abfragen zu einer zusammen. Al- lerdings enthält das Ergebnis alle Datensätze aus der ersten Abfrage, die nicht in der Zweiten enthalten sind. Das folgende Beispiel ließe sich natürlich auch wesentlich einfacher lösen (SELECT Name FROM Personen WHERE Gehalt IS NULL OR Gehalt=0;): Uni> SELECT Name FROM Personen EXCEPT SELECT Name FROM Personen WHERE Gehalt>0; Name ------------Meier, A. Kühn, H. Muster, M. (3 rows) Abbildung 7.22: Abfrage mit EXCEPT Bei Oracle wurde EXCEPT durch das Schlüsselwort MINUS ersetzt. 7.2.14 INTERSECT Der letzte Verwandte zu UNION ist INTERSECT. Mit INTERSECT können solche Datensätze ermittelt werden, die in verschiedenen SELECT Abfragen vorhanden sind. Es werden also die gemeinsamen Datensätze ermittelt. In Abbildung 7.23: UNION, EXCEPT, INTERSECT wird das Verhalten der drei Verwandten veranschaulicht: b = (2, 3) a = (1, 2) SELECT * FROM a UNION SELECT * FROM b 1, 2, 3 SELECT * FROM a UNION ALL SELECT * FROM b 1, 2, 2, 3 SELECT * FROM a EXCEPT SELECT * FROM b 1 SELECT * FROM a INTERSECT SELECT * FROM b 2 Abbildung 7.23: UNION, EXCEPT, INTERSECT 74 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.15 Subselects Während UNION, EXCEPT und INTERSECT Abfragen auf einer Ebene zusammenfassen konnten, ist es durch den Einsatz von Subselects (Unterabfragen) möglich Abfragen ineinander zu verschachteln. Leider sind Subselects zur Zeit in MySQL nicht möglich (MySQL 3.23), einige der hier vorgestellten Operatoren können aber dennoch mit Konstanten Verwendung finden. Subselects können sowohl in SELECT als auch in anderen SQL Befehlen (INSERT, UPDATE, DELETE) Verwendung finden. Sie fungieren dort als unabhängige Spalten oder Tabellen. 7.2.15.1 Subselect ersetzt Konstante Subselects können Konstanten ersetzen, so daß sich die Konstanten aus einer Abfrage ergeben und damit die Abfrage nicht ständig neu gestellt werden muß. Bei dieser Art der Verwendung muß darauf geachtet werden, daß die Unterabfrage immer exakt einen Wert liefert. Falls die Unterabfrage keinen oder mehrere Werte ermittelt, wird die gesamte Abfrage unmittelbar abgebrochen. Uni> SELECT AVG(Gehalt) FROM Personen; avg -------10500 (1 row) Uni> SELECT Name, Gehalt FROM Personen WHERE Gehalt > 1050; Name Gehalt ----------------------Ebert, K. 10000 Zucker, G. 11000 (2 rows) Uni> SELECT Name, Gehalt FROM Personen WHERE Gehalt > ( SELECT AVG(Gehalt) FROM Personen); Name Gehalt ----------------------Ebert, K. 10000 Zucker, G. 11000 (2 rows) Abbildung 7.24: Subselect ersetzt Konstante Für die Behandlung von Unterabfragen, die nicht zwingend genau ein Ergebnisdatensatz liefern existieren spezielle Operatoren die im Abschnitt 7.2.15.4 Subselect Operatoren behandelt werden. Das obige Beispiel zeigt auch ein Hauptproblem mit aufeinanderaufbauenden SQL Befehlen. Werden diese manuell eingegeben, so kommt es sehr leicht zu Übertragungsfehlern. Auf diese Art wurde der ermittelte Wert 10500 als Durchschnittsgehalt fälschlicherweise als 1050 in die zweite Abfrage übertragen und somit das falsche Gesamtergebnis erstellt. Marcus Börger 75 Data Manipulation Language Relationale Datenbanken 7.2.15.2 Subselects und Korrelation Beim Einsatz einer Subselect anstelle einer Konstante können die Werte der Subselect auch mit den Werten des äußeren Befehles korrelieren. Das bedeutet, daß die Datensätze des äußeren Befehles und der Unterabfrage Bezug zueinander nehmen dürfen. Wenn die Werte der äußeren Abfrage in der Unterabfrage benutzt werden, so muß die Unterabfrage für jeden möglichen Datensatz der äußeren Abfrage selbstverständlich erneut ausgeführt werden. Es empfiehlt sich also, die Daten der äußeren Abfrage derart zu sortieren, daß möglichst häufig Gruppen von gleichen Werten der äußeren Abfrage hintereinander in der Unterabfrage benutzt werden. Dieses sollte ein guter Optimizer erkennen und dementsprechend seltener die Unterabfrage ausführen. Wenn das gegeben ist, jedoch eine diesbezüglich ungünstigere Reihenfolge benötigt wird, kann es schneller sein, wenn die benötigte Sortierung erst in einer weiteren äußeren Abfrage realisiert wird. Das folgende Beispiel ermittelt zu jeder Person, die ein Gehalt bezieht, die Anzahl der Personen, die mehr Gehalt erhalten. Das Ergebnis wird zuerst nach der Anzahl, mehr verdienender Personen, und dann nach den Namen der schlechter verdienenden sortiert. Die innerste Unterabfrage benutzt jedoch das Gehalt, daß im Ergebnis unsortiert ist. Daher wird eine mittlere Abfrage benutzt, die das Zwischenergebnis zunächst nach dem Gehalt sortiert. Ausgehend davon, daß es wesentlich weniger Gehaltsbeträge als bezahlte Personen gibt, kommen in der innersten Unterabfrage also häufig gleiche Werte für Gehalt an. Uni> SELECT * FROM ( SELECT Name, Gehalt, ( SELECT COUNT(*) FROM Personen WHERE Gehalt > p.Gehalt ) AS Anzahl FROM Personen p WHERE Gehalt > 0 ORDER BY Gehalt) ORDER BY Anzahl ASC, Name ASC; Name Gehalt Anzahl ------------------------------Zucker, G. 11000 0 Ebert, K. 10000 1 (2 rows) Abbildung 7.25: Subselect mit Korrelation Zwei Unterabfragen auf einer Ebene können nicht miteinender Korrelieren, es sei denn die Korrelation basiert auf einem Wert der umschließenden Abfrage. Somit ist eine Abfrage der folgenden Form ungültig: SELECT * FROM ( SELECT a FROM ... ) AS A, ( SELECT b FROM ... WHERE A.b=b) AS B Abbildung 7.26: Korrelation auf gleicher Ebene ist unzulässig Folgende Formen sind zulässig: SELECT ..., ( SELECT b FROM ... WHERE A.a=b) FROM ( SELECT a ... FROM ... ) AS A, WHERE ... ( SELECT c FROM ... WHERE A.a=c) ... Abbildung 7.27: Zulässige Korrelationsformen 76 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.15.3 Subselects als unabhängige Spalten Es ist auch möglich Subselects als unabhängige Spalten zurück zu liefern. Dazu muß die Unterabfrage dann im FROM Abschnitt erfolgen und es muß zwingend ein Alias vergeben werden. Wenn die Unterabfrage nicht in Verbindung mit den anderen Tabellen der Abfrage gebracht wird, entsteht auch hier ein Kreuzprodukt. Um die Verwendung zu veranschaulichen, wird die folgende Abfrage umgestellt: Uni> SELECT p.Name,p.Gehalt,n.Name AS Name2, n.Gehalt AS Gehalt2 FROM Personen p, Personen n WHERE p.Gehalt > 0 AND n.Gehalt > 0 AND p.Name != n.Name ORDER BY p.Gehalt, n.Gehalt; Name Gehalt Name2 Gehalt2 ---------------------------------------------Ebert, K. 10000 Zucker, G. 11000 Zucker, G. 11000 Ebert, K. 10000 (2 rows) Abbildung 7.28: Abfrage mit zwei Tabellen Zunächst wird der zweite Zugriff auf die Tabelle Personen in eine Unterabfrage umgewandelt: Uni> SELECT Name, Gehalt, n.* FROM Personen p, (SELECT Name AS Name2, Gehalt AS Gehalt2 FROM Personen WHERE Gehalt > 0) n WHERE Gehalt > 0 AND Name != Name2 ORDER BY Gehalt, Gehalt2; Name Gehalt Name2 Gehalt2 ---------------------------------------------Ebert, K. 10000 Zucker, G. 11000 Zucker, G. 11000 Ebert, K. 10000 (2 rows) Abbildung 7.29: Subselect als unabhängige Spalten Das Beispiel in Abbildung 7.29: Subselect als unabhängige Spalten stellt eine Korrelation zwischen der Tabelle Personen und der Unterabfrage her, da im WHERE Abschnitt der äußeren Abfrage die Spalten Name aus Personen und Name2 aus der Unterabfrage verglichen werden. Es ist jedoch nicht möglich den Vergleich in die Unterabfrage zu verschieben, da die Unterabfrage hier als unabhängige Tabelle eingesetzt wird und somit in der Abfrage keine Spalte der äußeren Abfrage benutzt werden darf. Die folgende Abfrage zeigt, daß auch mehrere Unterabfragen parallel als unabhängige Tabellen eingesetzt werden können: Uni> SELECT p.*, n.Name AS Name2, n.Gehalt AS Gehalt2 FROM (SELECT Name, Gehalt FROM Personen WHERE Gehalt>0) p, (SELECT Name, Gehalt FROM Personen WHERE Gehalt>0) n WHERE p.Name != n.Name ORDER BY p.Gehalt, n.Gehalt; Name Gehalt Name2 Gehalt2 ---------------------------------------------Ebert, K. 10000 Zucker, G. 11000 Zucker, G. 11000 Ebert, K. 10000 (2 rows) Abbildung 7.30: Abfrage mit unabhängigen Subselects Marcus Börger 77 Data Manipulation Language Relationale Datenbanken 7.2.15.4 Subselect Operatoren und Quantoren Es ist offensichtlich, daß Subselects Wertlisten ermitteln können. Um solche Listen in Vergleichen nutzbar zu machen existieren die Operatoren IN, EXISTS ANY, und ALL eingesetzt. 7.2.15.4.1 Der Operator IN Der Operator IN ist ein binärer Operator, der ermittelt ob ein Wert in einer Liste von Werten enthalten ist. Das Ergebnis von Tests mit dem Wert NULL ist immer NULL bzw. false. • Wert IN ( Wertliste ) Wert IN ( SELECT Spalte1 FROM ... ) Überprüft ob Wert in Wertliste enthalten ist, wobei Wertliste auch aus einer Unterabfrage ermittelt werden kann. Diese Unterabfrage muß exakt eine Spalte, hier Spalte1, ermitteln. • Spalte IN ( Wertliste ) Spalte IN ( SELECT Spalte1 FROM ... ) Ist wahr, wenn der Wert von Spalte in Wertliste enthalten ist. Wobei Wertliste das Ergebnis eines SELECT Befehls sein kann, der eine Spalte, hier Spalte1, liefert. Beim Einsatz einer Unterabfrage sind die Spalten der Abfrage und der Unterabfrage unabhängig, auch wenn sowohl Abfrage als auch Unterabfrage sich auf die gleiche Tabelle beziehen. • Spalte IN ( Spaltenliste ) Bei dieser Form des Einsatzes von IN entstammen die Werte für Spalte und die aus Spaltenliste immer aus dem gleichen Datensatz. • Spalte IN ( SELECT Spaltenliste FROM ...) Eine solche Abfrage ist hingegen nicht zulässig. Es gibt zwei naheliegende Interpretationen für eine solche Anfrage. Erstens der Wert für Spalte ist in allen Spalten der Spaltenliste enthalten und zweitens er ist in mindestens einer der Spalten aus Spaltenliste enthalten: 1. Spalte IN ( SELECT Spalte1 FROM ...) AND Spalte IN ( SELECT Spalte2 FROM ...) AND … 2. Spalte IN ( SELECT Spalte1 FROM ...) OR Spalte IN ( SELECT Spalte2 FROM ...) OR … Eigentlich sollten alle beteiligten Werte bzw. Spalten vom gleichen Datentyp sein. Wenn dies nicht der Fall ist, wird eine Konvertierung ausgeführt, wobei die meisten Datenbanken die Werte in der Liste konvertieren. Dabei können Konvertierungsfehler entstehen, die zum Abbruch des SQL Befehls führen. So kann man Zahlen zwar in Zeichenketten konvertieren, meist jedoch nicht Zeichenketten in Zahlen (ab ist keine Zahl). Auch die Art und Weise wie Fließkommazahlen in Ganzzahlen konvertiert werden variiert. MySQL schneidet Nachkommazahlen einfach ab, während das bei PostgreSQL und Oracle nicht geschieht (0 ist ungleich 0,1 aber 0 ist gleich 0,0). Auch inverse Abfragen sind möglich, wozu der Operator NOT IN benutzt wird. Solle ein DBMS diesen Operator nicht unterstützen kann er nachgebildet werden: • 78 NOT ( ... IN ( ... )). Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.15.4.2 Der Quantor EXISTS Wie der Name vermuten läßt ist EXISTS ein Existenzoperator, der überprüft ob eine Unterabfrage mindestens ein Ergebnis Datensatz liefern kann. Das Ergebnis des Quantors EXISTS ist entweder true oder false und er kann im Gegensatz zum Operator IN ausschließlich mit einem SELECT Befehl als Eingabe verwendet werden. Auch wenn die benutzte Subselect den Wert NULL als einziges Ergebnis ergibt, muß der Quantor EXISTS als Ergebnis true ergeben. Denn es macht einen Unterschied ob eine Abfrage kein Ergebnis hat, also 0 Datensätze, oder ob sie NULL als einziges Ergebnis hat. Die inverse Form des Quantors ist NOT EXISTS, sie ermöglicht es auf Nicht-Existenz zu prüfen. Uni> SELECT Name, Gehalt FROM Personen p WHERE Gehalt > 0 AND EXISTS ( SELECT * FROM Personen WHERE Gehalt>p.Gehalt) ORDER BY Gehalt; Name Gehalt ----------------------Ebert, K. 10000 (1 row) Abbildung 7.31: Subselect und EXISTS Da MySQL keine Subselects unterstützt und Quantors ausschließlich mit Subselects arbeiten unterstützt MySQL diese nicht. Das gilt für die Quantoren EXISTS und NOT EXISTS genauso wie für die Quantoren ANY und ALL. 7.2.15.4.3 Die Quantoren ALL und ANY Die Quantoren ALL und ANY können auf alle binären Vergleichsoperatoren angewandt werden (<, >, = etc.). Sie müssen den Platz des zweiten Parameters gefolgt von einem Subselect einnehmen. Das Ergebnis eines solchen Vergleichs mit dem Operator ANY ist true, wenn der Vergleich für mindestens einen Wert aus der Liste true ist. Hingegen ist es bei ALL nur dann true, wenn der Vergleich für alle Werte true ist. Uni> SELECT Name, Gehalt FROM Personen p WHERE Gehalt < ANY (SELECT Gehalt FROM Personen) ORDER BY Gehalt; Name Gehalt ----------------------Ebert, K. 10000 (1 row) Uni> SELECT Name, Gehalt FROM Personen p WHERE Gehalt <= ALL (SELECT Gehalt FROM Personen) ORDER BY Gehalt; Name Gehalt ----------------------(0 rows) Abbildung 7.32: Subselect und ANY Die zweite Abfrage liefert kein Ergebnis, da es Personen mit Gehalt gleich NULL gibt. Marcus Börger 79 Data Manipulation Language Relationale Datenbanken 7.2.15.5 Simulation von Subselects Subselects können eingeschränkt mit temporären Tabellen simuliert werden. • Der Operator IN SELECT Spaltenliste FROM ... SW IN (SELECT Spalte FROM Tabelle…)… SELECT Spalte INTO TEMP t FROM Tabelle … SELECT Spaltenliste FROM t ... SW=t.Spalte …GROUP BY Spaltenliste Der Parameter SW kann sowohl eine Konstante als auch eine Spalte der äußeren Abfrage sein. Der Group By Abschnitt verhindert, daß für jedes Element der, durch die temporäre Tabelle t ersetzten, Unterabfrage ein Ergebnisdatensatz erstellt wird. • Der Quantor EXISTS SELECT ... EXITS(SELECT Spaltenliste FROM Tabelle... ) … SELECT COUNT(Spaltenliste) AS count INTO TEMP t FROM Tabelle … SELECT ... FROM t ... t.count > 0 ... Wenn der Quantor EXISTS durch die Aggregation COUNT ersetzt wird, ist unbedingt darauf zu achten, daß beide mit der gleichen Spaltenliste bzw. * arbeiten. Die vorgestellte Methode basiert darauf, daß die erste Abfrage eine Tabelle mit genau einem Ergebnis erstellt. Daher liefert das Kreuzprodukt aus der alten Abfrage und der neuen Tabelle die gleiche Anzahl Ergebnisse wie die alte Abfrage. • Der Quantor ANY SELECT ... Wert OP ANY ( SELECT Spalte FROM Tabelle ) ... SELECT 1 INTO TEMP t FROM Tabelle WHERE Wert OP Spalte SELECT ... FROM t ... COU 80 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.2.16 SELECT DISTINCT Der Zusatz DISTINCT zum SELECT Befehl bewirkt in den meisten Datenbanken, daß keine gleichen aufeinander folgenden Datensätze geliefert werden. In anderen bewirkt er, daß überhaupt keine doppelten Datensätze geliefert werden. Durch geeignete Verwendung von ORDER BY und GROUP BY ist es natürlich möglich beide Verhaltensweisen anzugleichen. Generell kann hier aber nur von der Verwendung abgeraten werden. Zumindest muß vor dem Einsatz das Verhalten in der eingesetzten Datenbank geprüft werden. 7.2.17 SELECT ohne FROM Der SELECT Befehl kann benutzt werden, um Funktionen des Datenbank Management Systems auszuführen oder einfache Berechnungen zu erledigen. In diesen Fällen wird also kein FROM benötigt. Eine Sonderstellung nimmt dabei Oracle ein, da dort die Pseudo-Tabelle DUAL benutzt werden muß. uni> SELECT 2*3 [ FROM DUAL ]; 2*3 -------6 (1 row) Abbildung 7.33: SELECT ohne FROM 7.2.18 Top-Level Abfragen Der Sprachstandard SQL selbst kennt keine sogenannten Top-Level Abfragen, die benutzt werden, wenn nur eine gewisse Anzahl von Datensätzen benötigt wird. Nahezu alle Datenbanksysteme haben aber eigene Ergänzungen, mit denen Abfragen wie „die ersten 10“ oder „die Datensätze 10 bis 20“ möglich sind. MySQL verwendet die Spracherweiterung LIMIT, die sowohl den Startindex als auch die Anzahl angeben kann: • SELECT * FROM tabelle LIMIT [ start, ] anzahl PostgreSQL benutzt zwei verschiedene Spracherweiterungen. Erstens wird LIMIT zur Angabe der Anzahl benutzt und zweitens OFFSET zur Angabe des Startindexes. Das hat den Vorteil, daß man auch ohne Angabe der Anzahl den Startwert festlegen kann: • SELECT * FROM tabelle [ LIMIT anzahl ] [ OFFSET start ] Bei Oracle wird die Pseudospalte ROWNUM genutzt. Damit ist es leider nicht möglich Anzahl und Offset in einer Abfrage ohne Subselect zu benutzen. Der einfachere Fall, in dem nur die ersten Datensätze benötigt werden, kann mit einem WHERE Abschnitt erfolgen. Soll ROWNUM zurückgeliefert werden, ist zu beachten ist, daß * nur noch mit Angabe der Tabelle benutzt werden darf: • SELECT [ ROWNUM, tabelle.]* FROM tabelle WHERE ROWNUM<=anzahl; Wird hingegen ein Ausschnitt aus der Ergebnismenge benötigt, so muß zunächst die Abfrage um ROWNUM ergänzt werden und darum eine umschließende Abfrage ergänzt werden, welche die innere ROWNUM auswertet, wodurch ein Alias in der inneren Abfrage notwendig wird. • SELECT * FROM ( SELECT ROWNUM r, tabelle.* FROM tabelle WHERE r < start + anzahl ) WHERE r >= start; Marcus Börger 81 Data Manipulation Language Relationale Datenbanken 7.3 UPDATE Mit Hilfe des UPDATE Befehles können Datensätze gezielt verändert werden. Zunächst wird hierzu die Tabelle ausgewählt, die geändert werden soll. Dann werden Spalten in der Form Spalte=Wert zugewiesen, wobei mehrere Spalten in einem Datensatz gleichzeitig geändert werden können, indem mehrerer solcher Zuweisungen durch Kommata getrennt angegeben werden. Der UPDATE Befehl wirkt sich ohne weitere Angaben auf alle Datensätze einer Tabelle aus. Falls das nicht gewünscht ist, können mit optionalen FROM und WHERE Abschnitten gezielt Datensätze geändert werden. Wobei der FROM Abschnitt nicht von allen Datenbank Management Systemen unterstützt wird. Die meisten Datenbank Management Systeme geben die Anzahl der veränderten Datensätze nach Ausführung zurück. UPDATE Tabelle SET Zuweisungsliste [ FROM Tabellenliste ] [ WHERE Kriterium ]; Abbildung 7.34: Aufbau des UPDATE Befehles Nachfolgend ist das UPDATE Kommando gezeigt, daß die in 2.2.7.2.1 Cascade bei Änderungen beschriebene Aktion auslösen soll. UPDATE Personen SET PNr=1 WHERE PNr=100000; Abbildung 7.35: UPDATE Beispiel 7.3.1 SELECT FOR UPDATE; UPDATE; Mit dem Befehl SELECT und dem Zusatz FOR UPDATE kann eine Transaktion eingeleitet werden (siehe auch 8 Transactions). Diese wird mit der Ausführung des UPDATE Befehles beendet (genaugenommen mit jedem anderen SQL Befehl). Man erreicht so, daß ein gefundener Datensatz nicht gleichzeitig von einer anderen Verbindungsinstanz geändert werden kann. Wenn mehrere Tabellen zur Ermittlung der zu sperrenden Datensätze benötigt werden, so kann man die zu sperrenden Tabellen angeben (SELECT ... FOR UPDATE OF tabelle). 82 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.4 REPLACE INTO Im Gegensatz zum INSERT INTO Befehl können über REPLACE INTO Datensätze sowohl eingefügt, als auch geändert werden. Wenn im REPLACE INTO Datensatz keine Primary Keys oder Alternate Keys vorhanden sind, so werden die übergebenden Daten immer eingefügt. Wird ein Teil des übergebenden Datensatzes vollständig in Alternate Keys bzw. Primary Keys abgelegt, so wird zunächst getestet, ob der durch diesen Index/Key identifizierte Datensatz bereits existiert. Falls vorhanden wird er durch den neuen ersetzt, ansonsten wird er neu angelegt. Sind mehrere Keys betroffen, so darf nur ein oder kein Datensatz betroffen sein. REPLACE INTO Tabelle [ (Spaltenliste) ] VALUES (Wertliste); Abbildung 7.36: Aufbau des REPLACE INTO Befehles Leider existiert REPLACE INTO nur in sehr wenigen Datenbanken. Dies liegt daran, daß es nicht im SQL Standard aufgelistet ist. Theoretisch ist es exakt definiert, so daß einer Implementierung eigentlich nichts im Wege steht. Wenn das REPLACE INTO Kommando nicht vorhanden ist, muß REPLACE INTO durch eine Folge von Befehlen ersetzt werden: Start SELECT FOR UPDATE >1 =1 Anzahl Datensätze =0 ERROR INSERT INTO UPDATE Ende Ende Ende Abbildung 7.37: REPLACE INTO ersetzen Im ersten Schritt wird dabei geprüft, ob der Datensatz bereits vorhanden ist. Falls vorhanden wird er im nächsten Schritt modifiziert, andernfalls wird er neu angelegt. Zum Auffinden des Datensatzes werden die angegebenen Key Felder (Primary Key und Alternate Key) genutzt. Werden mehrere Key Felder angegeben und eine OR Suche20 benutzt, so kann es passieren, daß mehr als ein Datensatz gefunden wird. Bei einer AND Suche kann es hingegen passieren, daß kein Datensatz gefunden wird, da sich zwei Key Werte widersprechen. In einem solchen wird REPLACE ebenfalls einen Fehler erzeugen, die Key Werte bereits in der Tabelle vorhanden sind. Datensätze: (1,2,'alt') (3,4,'alt') REPLACE INTO tabelle VALUES(1,1,'neu') ERROR UPDATE (1,2,'alt') REPLACE INTO tabelle VALUES(1,2,'neu') REPLACE INTO tabelle VALUES(1,4,'neu') REPLACE INTO tabelle VALUES(2,3,'neu') UPDATE (1,2,'alt') ERROR INSERT (2,3,'neu') UPDATE (1,2,'alt') ERROR INSERT (2,3,'neu') AND OR Tabelle 7.1: REPLACE INTO Verhalten 20 SELECT * FROM tabelle WHERE primaryKey='value1' OR alternateKey='value2'; Marcus Börger 83 Data Manipulation Language Relationale Datenbanken 7.5 DELETE Mit dem DELETE Befehl könne einzelne Datensätze aus Tabellen gezielt gelöscht werden. Im Gegensatz zu den anderen Befehlen hat der DELETE Befehl nur Zugriff auf eine Tabelle. Wenn das Löschen abhängig von den Werten anderer Tabellen ist, so kann dies nur durch Subselects gelöst werden. Solche Abhängigkeiten müssen bei MySQL also durch temporäre Tabellen oder Subselects gelöst werden. DELETE FROM Tabelle [ WHERE Kriterium ]; Abbildung 7.38: Aufbau des DELETE FROM Befehles Ohne eine Auswahl der zu löschenden Datensätze, also WHERE Abschnitt, kann eine Tabelle auch komplett geleert werden. Das läßt sich aber mit dem Befehl TRUNCATE schneller erledigen (siehe 6.12 TRUNCATE). Beide Befehle haben gemeinsam, daß sie die Struktur der Datenbank nicht verändern und insbesondere die Tabelle erhalten bleibt. Wird die Tabelle hingegen nicht mehr benötigt, so kann dies mit dem Befehl DROP TABLE erledigt werden (siehe 6.11 DROP). Der TRUNCATE Befehl kann in manchen DBMS jedoch nicht benutzt werden, wenn Foreign Key Constraints, also Referenzen, definiert sind und es in anderen Tabellen Referenzen auf zu löschende Datensätze gibt. Auch werden beim Löschen mittels TRUNCATE keine Trigger ausgeführt. In all diesen Fällen ist die Benutzung von DELETE also erforderlich. Zudem ist es mit DELETE möglich auch die Datensätze zu löschen, die ansonsten aufgrund von Referenzen nicht gelöscht werden könnten, indem man solche Datensätze über die Einstellung ON DELETE CASCADE aller Referenzen gleichfalls automatisch löscht. Im Extremfall kann das Löschen eines Datensatzes auf diese Art und Weise eine gesamte Datenbank leeren. 7.5.1 Top-Level Delete Sofern kein Primary Key bekannt ist, können in einer Tabelle identische Datensätze existieren. Um nur einen Teil dieser Datensätze zu löschen, kann man bei MySQL die Erweiterung LIMIT für Top-Level Abfragen direkt benutzen (siehe 7.2.18 Top-Level Abfragen). Bei PostgreSQL müssen die Datensätze über die DBMS interne Datensatzidentifizierung OID gelöscht werden, Oracle verwendet hierzu den Bezeichner ROWID. Zunächst werden also die entsprechenden Datensatzidentifizierer aufgelistet und dann die zugehörigen Datensätze darüber gelöscht. Da bei diesem Umweg eine Abfrage eingesetzt wird, kann man diese Abfrage zu einer Top-Level Abfrage erweitern und als Subselect des DELETE Aufrufes einsetzen. DELETE FROM Tabelle WHERE OID IN (SELECT OID FROM Tabelle LIMIT 1); Abbildung 7.39: Top-Level DELETE mit PostgreSQL 7.5.2 Löschen doppelter Datensätze Über die Identifizierer OID bzw. ROWID und Subselects kann man bei PostgreSQL und Oracle auf einfache Weise doppelte Datensätze löschen, ohne Top-Level Elemente zu nutzen. Der IN Operator wird benutz, um Fehler bei Nichtexistenz zu löschender Datensätze zu vermeiden. DELETE FROM Tabelle WHERE OID NOT IN (SELECT MIN(OID) FROM Tabelle); Abbildung 7.40: Löschen doppelter Datensätze mit PostgreSQL 84 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.6 Operatoren und Funktionen Das folgende Kapitel stellt die wichtigsten Operatoren und Funktionen vor. Einige der vorgestellten Operatoren und Funktionen sind boolesch, sie liefern also entweder wahr oder falsch als Ergebnis, der Ergebnistyp ist also BOOL. Während Postgres diese beiden Werte als t für wahr bzw. true und f für falsch bzw. false darstellt, benutzt MySQL die Darstellung 1 für wahr und 0 für falsch. Oracle wiederum kennt den Datentyp BOOL nicht, sodaß man zwar intern damit arbeiten kann, eine direkte Darstellung aber nicht möglich ist. Wenn einer der Parameter den Wert NULL hat, ist das Ergebnis häufig auch NULL. Die betreffenden Operatoren und Funktionen haben damit also drei Zustände. 7.6.1 Mathematische Operatoren Die folgende Übersicht zeigt die von MySQL, Postgres und Oracle unterstützten mathematischen Operatoren und ihre Bedeutung: • Addition 2 + 3 = 5 • Subtraktion 2 – 3 = -1 • Multiplikation 2 * 3 = 6 • Division21 2 / 3 = 0.67 • Divisionsrest22 2 % 3 = 2 7.6.2 Bitweise Operatoren Bitweise Operatoren arbeiten auf den jeweils größten verfügbaren ganzzahligen Datentyp. Das Ergebnis einer bitweisen Operation hat also maximal so viele Bits wie dieser Datentyp. • Bitweise Oder 2 | 5 = 7 • Bitweise Und 2 & 5 = 1 • Bitweise Negation • Bitweise links schieben 6 << 2 = 24 • Bitweise rechts schieben 6 >> 2 = 1 ~ 0 = -1 7.6.3 Logische Operatoren MySQL interpretiert alle Werte Boolesche Werte wenn man sie auf logische Operatoren anwendet. Dabei wird für alle sich ergebenden Zahlen deren Betrag größer oder gleich 1 ist der Boolesche Wert true angenommen. PostgreSQL und Oracle können logische Operatoren nur auf Boolesche Werte anwenden. 21 22 • Logische Und 0 and 1 = 0 • Logisches Oder 0 or 1 = 1 • Logische Negation NOT 0 = 1 Bei Division mit Divisor gleich 0 ergibt MySQL NULL und PostgreSQL sowie Oracle brechen mit Fehler ab. MySQL akzeptiert auch die a MOD b, während Oracle ausschließlich MOD(a,b) unterstützt. Marcus Börger 85 Data Manipulation Language Relationale Datenbanken 7.6.4 Vergleichsoperatoren Es stehen die üblichen Vergleichsoperatoren zur Verfügung: <, <=, <>, !=, >=, >. Bei MySQL können auch Zeichenketten verglichen werden. Dabei erfolgen alle Vergleiche ohne Berücksichtigung von Klein/Großschreibung und Leerzeichen am Ende werden ignoriert. Es gilt also 'A' = 'a ' und 'A A' = 'A a' nicht jedoch 'A' = 'A a'. Die beiden DBMS PostgreSQL und Oracle verlangen den Einsatz entsprechender Funktionen, siehe hierzu 7.6.7 Funktionen für Zeichenketten. 7.6.5 Bedingungsoperatoren Der Auswahloperator IF erwartet drei Parameter, das Ergebnis ist der Wert des zweiten Parameters, wenn der erste Parameter den Wert true hat, ansonsten der Wert des dritten Parameters. Das folgende Beispiel für MySQL veranschaulicht, wie MySQL die Operatoren = und < mit Zeichenketten verwendet. mysql> CREATE TABLE x ( v VARCHAR(2)); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO x VALUES('a'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO x VALUES('b'); Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE y ( w VARCHAR(2)) SELECT * FROM x; Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT x.v, IF(x.v=y.v,'=',IF(x.v<y.v,'<','>')) "?", y.v FROM x, y; +------+---+------+ | v | ? | v | +------+---+------+ | a | = | a | | b | > | a | | a | < | b | | b | = | b | +------+---+------+ 4 rows in set (0.02 sec) Abbildung 7.41: MySQL mit IF und <, = bei Zeichenketten 86 Marcus Börger Relationale Datenbanken Data Manipulation Language 7.6.6 Umgang mit NULL Wie bereits mehrfacherwähnt ist das Ergebnis nahezu aller Operatoren und Funktionen NULL, wenn einer der Parameter NULL ist. Da dieses vielfach zu Problemen führt existieren die verschiedensten Operatoren zum Umgang mit NULL Werten. 7.6.6.1 IS NULL Die Postfixoperatoren IS NULL und IS NOT NULL überprüfen einen Wert auf NULL oder nicht NULL. Das Ergebnis ist entweder true oder false. Uni> SELECT 1 IS NULL AS "NULL", 1 IS NOT NULL AS "Wert"; NULL Wert ---------------false true (1 row) Abbildung 7.42: Operator IS NULL 7.6.6.2 NULLIF Die Funktion NULLIF vergleicht zwei Parameter und hat bei Gleichheit den Wert NULL, ansonsten den Wert des ersten Parameters. Wenn der erste Parameter den Wert NULL hat, ist das Ergebnis immer NULL. Oracle unterstützt diesen Operator nicht und bei MySQL führen Konvertierungsprobleme zum Zwischenergebnis Ungleichheit und somit zum Wert des ersten Parameters als Ergebnis (NULLIF('a',1)='a'). Uni> SELECT NULLIF( 1, 1) AS "Gleich", NULLIF( 'a', 'b') AS "Ungleich"; Gleich Ungleich ----------------------------NULL a (1 row) Abbildung 7.43: Funktion NULLIF 7.6.6.3 IFNULL Durch die Funktion IFNULL ist es möglich NULL Werte durch Default Werte zu ersetzen ohne dabei einen Default Wert für Spalten vergeben zu müssen. Zudem kann jede Abfrage einen anderen Ersatzwert für NULL Werte benutzen. Uni> SELECT IFNULL( NULL, 1) AS "NULL", IFNULL( 2, 3) AS "Wert"; NULL Wert ----------------------------1 2 (1 row) Abbildung 7.44: Funktion IFNULL Marcus Börger 87 Data Manipulation Language Relationale Datenbanken 7.6.6.4 COALESCE Mit der Funktion COALESCE kann aus einer Liste von Werten oder Spalten der erste Wert ermittelt werden, der ungleich NULL ist. Haben alle Parameter den Wert NULL, so ist auch das Ergebnis von COALESCE gleich NULL. Der Funktion muß mindestens ein Parameter übergeben werden, damit ist COALESCE() nicht zulässig. Leider kann dieser Operator nicht auf Subselects angewandt werden. Uni> SELECT COALESCE(NULL,1,NULL,2,NULL) AS "1", COALESCE(NULL) AS "2"; 1 2 ----------------------------1 NULL (1 row) Abbildung 7.45: Funktion COALESCE 7.6.7 Funktionen für Zeichenketten 7.6.7.1 LIKE 7.6.7.2 Reguläre Ausdrücke 7.7 Online Analytical Processing 88 Marcus Börger Relationale Datenbanken Transactions 8 Transactions Transaktionen fassen Blöcke von SQL Befehlen zu einem Befehl zusammen. Die Befehle werden in einer temporären Kopie der Datenbank oder virtuell ausgeführt. Erst wenn Die Transaktion ohne Fehler als Beendet markiert wird, wirken sich die Befehle auf der Datenbank aus. Dazu wird dann entweder die Datenbank mit der veränderten temporären Kopie überschrieben oder es werden alle virtuellen Änderungen tatsächlich ausgeführt. Marcus Börger 89 Rechteverwaltung Relationale Datenbanken 9 Rechteverwaltung Spätestens dann, wenn mehrere Benutzer mit einer Datenbank arbeiten, stellt sich die Frage, wer auf welche Datenbank zugreifen darf und wer welche Aktionen ausführen darf. Wird ein Datenbank Managementsystem etwa von zwei Anwendungen genutzt, ist es sehr empfehlenswert, den Zugriff auf die Daten der jeweils anderen Anwendung zu verhindern. Aber auch innerhalb einer Anwendung gibt es Szenarios, in denen verschiedene Benutzer oder Benutzergruppen unterschiedliche Rechte haben sollten. In der nachfolgenden Abbildung sind einige oft anzutreffende Rechte und ihr Zusammenspiel dargestellt. Üblicherweise erfolgt die Vergabe von Rechten auf Basis der Informationen der benutzen Verbindung von Anwendung zum DBMS. Zu jeder Verbindung gehört die Angabe eines Benutzernamens und auch die Information von welchem Rechner die Verbindung aufgebaut wurde steht zur Verfügung. Zusätzlich kann meist schon beim Aufbau der Verbindung eine Datenbank ausgewählt werden. Diese drei Informationen werden benutzt, um die Rechte, die in den einzelnen Schemata des DBMS vergeben werden könne gezielt zu Filtern. Verbindungen der Anwendung zur Datenbank • • • Rechte in Abhängigkeit der Verbindung Rechte in Abhängigkeit des Benutzers Rechte in Abhängigkeit der Datenbank Konzeptuelles Schema und Views • • • Tabellen/Views Anlegen, Löschen, Ändern Daten Einfügen, Löschen, Ändern, Abfragen Datenbanken Erzeugen, Löschen, Sichern, Wiederherstellen, Kopieren Physisches Schema • • • Rechte Verwalten Benutzer Verwalten Datenorganisation Verwalten Abbildung 9.1: Rechte eines DBMS Die Rechteverwaltung einer Datenbank ist sehr stark vom eingesetzten Datenbank Managementsystem abhängig, denn jedes DBMS hat seine eigenen Strukturen auf denen die Verwaltung aufsetzt. Nahezu allen gemein ist jedoch, daß die Benutzer des DBMS nichts mit den Benutzern des zugrunde liegenden Betriebssystems haben. 90 Marcus Börger Relationale Datenbanken Rechteverwaltung 9.1 MySQL Das Datenbank Managementsystem MySQL speichert die Daten der Rechteverwaltung in der immer vorhandenen Datenbank mysql. Der Zugriff auf diese Datenbank sollte also nur dem Systembetreuer gewährt werden. Doch dazu muß zunächst einmal geklärt werden, wie das funktioniert. Bevor eine Verbindung mit MySQL zustande kommen kann, werden zunächst Benutzername, Paßwort sowie Hostname und optional die gewünschte Datenbank in der Datenbank mysql gesucht. Erst wenn dort der Zugriff mit mindestens einem Recht gewährt wird, kommt die Verbindung zustande. MySQL bietet selbst zwei Möglichkeiten der Rechteverwaltung. Zum einen können die Tabellen der Datenbank mysql mit den üblichen SQL-DML Befehlen wie INSERT, UPDATE und DELETE bearbeitet werden. Zum anderen können die SQL Befehle GRANT und REVOKE benutzt werden. Neben diesen eingebauten Methoden empfiehlt sich zudem noch der Einsatz von speziellen Werkzeugen wie etwa phpMyAdmin (siehe 9.1.4 phpMyAdmin). 9.1.1 Die Datenbank mysql MySQL kennt 14 verschiedene Rechte, auch Privilegien genannt. Vier Privilegien sind jeweils einem Befehl aus dem SQL-DML Umfang zugeordnet und steuern somit die Möglichkeiten Daten bearbeiten zu können. Fünf Privilegien regeln die Rechte Strukturen, also Datenbanken, Tabellen, Indizes und Referenzen, zu ändern. Ein Privileg legt fest, ob Dateien auf dem Server gelesen oder geschrieben werden. Dieses Recht kann selbstverständlich nur die Rechte des Benutzers freigeben, der den MySQL Server ausführt. Zu letzt gibt es vier Privilegien, die Rechte zur Administration des Servers festlegen. Das umfaßt auch ein Recht die Privilegien anderer zu verändern. MySQL Privilegien Daten Select_priv Insert_priv Update_priv Delete_priv Bedeutung SQL Kommando Daten abfragen Daten eingeben Daten modifizieren Daten löschen SELECT INSERT INTO UPDATE DELETE FROM Tabellen ändern Datenbank und Tabellen erzeugen Datenbanken bzw. Tabellen löschen Indizes erzeugen und löschen Zur Zeit noch nicht in Benutzung ALTER CREATE [ | ] DROP [DATABASE|TABLE] [CREATE|DROP] INDEX Dateien auf Serverlesen und schreiben SELECT ... INTO OUTFILE Struktur Alter_priv Create_priv Drop_priv Index_priv References_priv Dateizugriff File_priv Administration Grant_priv Process_priv Reload_priv Shutdown_priv Rechte verwalten GRANT, REVOKE MySQL Prozesse anzeigen und beenden Administrationskommandos (reload, refresh, flush-xxx) MySQL beenden (Daemon) Tabelle 9.1: MySQL Privilegien Marcus Börger 91 Rechteverwaltung Relationale Datenbanken Diese Privilegien werden in den Tabellen der Datenbank mysql gespeichert: Tabelle user Funktion Speichert zu jedem Benutzer (User) von welchem Rechner (Host) er mit welchem Paßwort (Password) zugreifen kann. Dabei wird der Benutzername mit Berücksichtigung von Klein/Großschreibung gespeichert. db Legt die Rechte eines Benutzers (User) innerhalb einer Datenbank (Db) für den Zugriff von einem Rechner (Host) fest. Hier kann auch festgelegt werden, daß ein Benutzer Rechte vergeben kann. Dabei ist zu beachten, daß ein Benutzer sowohl sich als auch anderen mehr Rechte geben kann, als er selbst zuvor hatte. host Wenn die host Einträge der Tabelle db leer bleiben, kann mit der Tabelle host geregelt werden, welche Rechte zu welcher Datenbank (Db) von welchem Rechner (Host) gewährt werden. tables_priv Gezielt Rechte für einzelne Tabellen festlegen. columns_priv Gezielt Rechte für einzelne Spalten festlegen. Abbildung 9.2: MySQL Datenbank mysql 9.1.1.1 MySQL Tabelle user.user Die Tabelle user verwaltet alle Kombinationen von Benutzer und Rechnername und legt somit alle erlaubten Verbindungen global, also für alle Datenbanken, fest. Es können alle 14 Rechte global vergeben werden. Lediglich, wenn hier für eine Verbindung keine Rechte vergeben werden, muß ein zum Benutzer und Rechner passender Eintrag in einer der anderen Tabellen existieren. Auf diese weise kann in der Tabelle user ein Benutzer festgelegt werden, der keine globalen Rechte hat aber zu einer bestimmten Datenbank Verbindungen aufbauen kann. Feld Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Datentyp char(60) char(16) char(16) enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') NULL NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL Default N N N N N N N N N N N N N N Abbildung 9.3: MySQL Tabelle user.user Die Spalte Host wird entweder der DNS Name oder die TCP/IP Adresse des Rechners gespeichert. Die internen Vergleiche benutzen den LIKE Operator, so daß man das % Zeichen als Platzhalter benutzen kann. Damit kann man zum Beispiel mit den Einträgen '192.168.%' und 92 Marcus Börger Relationale Datenbanken Rechteverwaltung '10.%' die Rechte für alle Computer im Class A bzw. Class C Intranet vergeben. Der Eintrag '%' bezieht sich demnach also auf alle Verbindungen des angegebenen Benutzers mit der Einschränkung, daß der lokale Rechner, also der Rechner, auf dem MySQL installiert ist, mit dem Eintrag 'localhost' und zwar nur diesem identifiziert wird. In der Spalte User wird der Benutzername mit Berücksichtigung von Klein/Großschreibung gespeichert. Das Paßwort wird verschlüsselt in der Spalte password gespeichert. Wenn ein Paßwort geändert werden soll, so muß dazu die Funktion password verwendet werden. 9.1.1.2 MySQL Tabelle user.db Die Tabelle db legt die Rechte eines Benutzers in einer Datenbank fest. Diese Rechte werden auf die Rechte, die sich aus der Tabelle user ergeben, aufaddiert. Damit ist es wie bereits oben angesprochen möglich einem Benutzer nur den Zugriff auf bestimmte Datenbanken zu geben. Auch in dieser Tabelle kann der Platzhalter '%' in der Spalte Host benutzt werden. Feld Host Db User Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References_priv Index_priv Alter_priv NULL Datentyp char(60) char(64) char(16) enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL Default N N N N N N N N N N Abbildung 9.4: MySQL Tabelle user.db 9.1.1.3 MySQL Tabelle user.host Rechte zu Datenbanken können unabhängig vom Benutzer gefiltert werden, wenn für den Benutzer der Eintrag in der Tabelle db einen leeren Wert ('') für Host enthält. Auch hier kann man zwischen verschiedenen Rechner mittels des Host Feldes unterscheiden. Feld Host Db Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References_priv Index_priv Alter_priv Datentyp char(60) char(64) enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') enum('Y','N') NULL NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL Default N N N N N N N N N N Abbildung 9.5: MySQL Tabelle user.db Marcus Börger 93 Rechteverwaltung Relationale Datenbanken 9.1.1.4 MySQL Tabelle user.tables_priv 9.1.1.5 MySQL Tabelle user.columns_priv 9.1.2 Rechte applizieren Bevor MySQL veränderte Rechte berücksichtigt müssen die Tabellen der Datenbank mysql neu geladen werden. Dies kann durch den Befehl FLUSH PRIVILEGES im SQL Interpreter oder durch den Aufruf des Programms mysqladmin mit dem Parameter reload erreicht werden. Beides kann nur ein Benutzer, der über das Reload_priv Recht verfügt, durchgeführt werden. mysqladmin [ -u Benutzername –p ] reload Abbildung 9.6: mysqladmin reload 9.1.3 Verlust des root Paßworts Wenn das root Paßwort nicht mehr bekannt ist und kein Benutzer mit ausreichenden Berechtigungen vorhanden ist, kann man den MySQL Server so starten, daß der die Datenbank mysql nicht einließt und somit alle Rechte zur Verfügung stehen. Zunächst muß der Server beendet werden. Unter Unix ist das der MySQL Daemon, mysqld. Wenn kein Benutzer zur Verfügung steht, der den Daemon beenden kann, muß er auf andere Weise beendet werde (kill o.ä.). Danach wird er mit dem Parameter –-skip-grant-tables neu gestartet. Jetzt kann das Paßwort in der Tabelle user in der Datenbank mysql für den Benutzer root gesetzt werden. Jetzt muß der Daemon unbedingt beendet und ohne Parameter neu gestartet werden. Wenn MySQL unter Windows betrieben wird, kann man den Server mit dem Dienstmanager Beenden bzw. Starten. 94 Marcus Börger Relationale Datenbanken Rechteverwaltung 9.1.4 phpMyAdmin Das Frontend phpMyAdmin ist eine Webbasierte Anwendung zur Verwaltung von MySQL Datenbanken über ein Webinterface. Damit es installiert werden kann, benötigt man einen Rechner, der PHP Dateien in einem Webserver ausführen kann, das kann auch der Rechner sein, auf dem MySQL installiert ist. Der Zugriff auf phpMyAdmin erfolgt dann über einen Webbrowser wie den Microsoft Internet Explorer, Netscape Navigator oder ähnlichen. Bevor man phpMyAdmin jedoch benutzen kann muß es installiert und konfiguriert werden. 1. Es muß ein Rechner mit Webserver und Verbindung zur MySQL Installation existieren, der PHP Dateien im Webserver ausführen kann. 2. Das phpMyAdmin Paket kann von seiner Internetseite unter der Adresse http://phpmyadmin.sourceforge.net/ geladen werden. Es Steht dort als Anwendung mit Dateien der Endung .php sowie .php3, jeweils in verschiedenen Archivtypen, zum Download bereit 3. Das phpMyAdmin Archiv muß im Datenbereich des Webservers entpackt werden. Gegebenenfalls kann man für phpMyAdmin auch einen virtuellen Webserver einrichten. 4. Zum Paket gehört eine Datei mit Namen config.inc.php bzw. config.inc.php3. In dieser Datei wird die Verbindung zu MySQL konfiguriert, ohne die natürlich kein Arbeiten möglich ist. Zur Wahl stehen dabei grundsätzlich zwei Möglichkeiten: • Es wird fest ein Benutzer für eingestellt. Damit verfügt automatisch jeder im Internet/Intranet über die Rechte des dabei eingestellten Benutzers. Hierzu müssen die folgenden Variablen in der Datei geändert werden: $cfgServers[1]['host'] $cfgServers[1]['adv_auth'] $cfgServers[1]['user'] $cfgServers[1]['password'] = = = = '{localhost|host}'; FALSE; 'Benutzername'; 'Paßwort'; Wenn der Webserver und MySQL auf dem gleichen Rechner installiert sind, so kann man für host die Einstellung 'localhost' benutzen, andernfalls muß die TYP/IP Adresse oder der DNS Name des Rechners auf dem MySQL läuft eingetragen werden. Der Wert für adv_auth muß auf FALSE gesetzt werden. In den Variablen user und password müssen schließlich der Benutzername und das Paßwort angegeben werden, über den die Verbindung zwischen MySQL und phpMyAdmin erfolgen. • Die Identifizierung des Benutzers erfolgt über einen Paßwortdialog, jeder der phpMyAdmin benutzen möchte, muß also zunächst einen Benutzernamen und Paß- wort für MySQL eingeben. Dazu müssen folgende Variablen konfiguriert werden: $cfgServers[1]['host'] $cfgServers[1]['adv_auth'] = '{localhost|host}'; = TRUE; Auch bei dieser Betriebsart muß der host angegeben werden. Der Wert für adv_auth wird jedoch auf TRUE gesetzt. Da hierdurch für jede Verbindung Benutzername und Paßwort abgefragt werden, brauchen die beiden Variablen user und password nicht gesetzt werden. 5. phpMyAdmin kann nun benutzt werden. Eine weitergehende Dokumentation ist über die Einstiegsseite der Anwendung oder auf der Homepage verfügbar. Marcus Börger 95 Rechteverwaltung Relationale Datenbanken 9.2 PostgreSQL 9.3 Oracle 96 Marcus Börger Relationale Datenbanken Trigger 10 Trigger Durch den Einsatz von Triggern können Aufgaben, die Ansonsten in einer Applikation ausgeführt werden, vom Datenbank Management System automatisiert werden. Das hat den Vorteil, daß Daten unabhängig von der Applikation konsistent gehalten werden können. Dabei beginnt das Anwendungsspektrum bei Constraints und kann bis zur Implementierung von komplexen Applikationsabläufen selbst reichen, so daß im Extremfall auf den Einsatz eines Applikationsservers verzichtet werden kann. Aus heutiger Sicht ist allerdings der ausgewogene Einsatz beider Techniken der richtige Weg. Trigger ermöglichen es auf Aktionen in der Datenbank mit komplexen Funktionen zu reagieren. Genaugenommen können Trigger auf verändernde DML Aktionen innerhalb einer Datenbank reagieren, also Einfügen, Löschen oder Verändern von Daten. Sie können nicht auf Abfragen oder Befehle aus dem DDL Bereich reagieren wie etwa Erzeugen oder Löschen von Tabellen. Trigger können sowohl vor (BEFORE) als auch nach (AFTER) der Aktion ausgeführt werden. Sie können auf einzelne Befehle (FOR EACH STATEMENT) oder für jeden einzelnen Datensatz (FOR EACH ROW), der von dem Befehl beeinflußt wird, ausgeführt werden. Manche DBMS haben auch INSTEAD OF Trigger implementiert, bei denen der auslösende Befehl durch die Triggerfunktion ersetzt wird.23 Befehl Ausführen INSTEAD OF nein ja BEFORE EACH STATEMENT ja nein Triggerfunktion ausgeführt? nein ja Erster Datensatz nein Datensatz vorhanden? ja BEFORE EACH ROW ja nein AFTER EACH ROW Nächster Datensatz Triggerfunktion ausgeführt? ja nein ja Triggerfunktion ausgeführt? nein ja ja Triggerfunktion ausgeführt? nein ja nein AFTER EACH STATEMENT Triggerfunktion ausgeführt? ja ja Befehl Rückgängig nein Befehl Abgebrochen Befehl Ausgeführt Befehl Abgebrochen Abbildung 10.1: Trigger Ablaufdiagramm 23 PostgreSQL und Oracle haben BEFORE und AFTER Trigger, Microsoft SQL Server nur INSTEAD OF. Marcus Börger 97 Trigger Relationale Datenbanken 10.1 PostgreSQL und PL/PGSQL Zur Implementierung von Triggerfunktionen bietet PostgreSQL insbesondere die Programmiersprache Procedural Language/PostgreSQL an. Damit diese genutzt werden kann muß zunächst mit dem SQL Befehl CREATE LANGUAGE oder dem Konsolenbefehl createlang die Unterstützung in die Datenbank geladen werden. Wenn alle Datenbanken die Sprachunterstützung erhalten sollen, empfiehlt es sich nach der Installation die Spracheunterstützung in der Vorlage template1 zu laden. Jede danach angelegt Datenbank erhält die Sprachunterstützung dann automatisch. Mit dem SQL Befehl DROP LANGUAGE bzw. dem Konsolenbefehl droplang kann die Unterstützung einer Sprache wieder entfernt werden. Da die Konsolenbefehle wesentlich einfacher zu handhaben sind, werden nur sie beschrieben: createlang [ options ] { -l | language } dbname droplang [ options ] language dbname options: -h host -p port -U username -W -l language dbname Datenbankserver festlegen Port des Datenbankserver festlegen Benutzername festlegen (Postgres Superuser Privileg nötig) Paßwortabfrage Installierte Sprachen auflisten Die Unterstützung für die Sprache language laden Die Datenbank in der der Befehl ausgeführt wird Abbildung 10.2: createlang und droplang Neben PL/PGSQL unterstützt PostgreSQL auch andere Sprachen. Neben dem mitgelieferten Interfaces zum Beispiel für C und TCL (PLTCL) können auch eigene Sprachen eingebunden werden. Im folgenden wird jedoch nur auf PL/PGSQL eingegangen. Die Abbildung 10.3: Trigger mit PL/PGSQL zeigt den prinzipiellen Aufbau einer Triggerdeklaration. Zunächst wird eine parameterlose Funktion deklariert, die als Rückgabewert OPAQUE erhält. Auf diese können sich dann mehrere Trigger beziehen. Wenn dabei sowohl BEFORE als auch AFTER Trigger zum Einsatz kommen sollen sind allerdings mehrere CREATE TRIGGER Aufrufe erforderlich. CREATE FUNCTION func() RETURNS OPAQUE AS 'Triggerfunktion' LANGUAGE 'PLPGSQL'; CREATE TRIGGER name { BEFORE | AFTER } { INSERT | DELETE | UPDATE } [ OR { INSERT | DELETE | UPDATE }.] ON table FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE func(); Abbildung 10.3: Trigger mit PL/PGSQL Der Bezeichner OPAQUE, zu Deutsch undurchlässig, ist hier etwas verwirrend, denn eine Triggerfunktion erhält als Parameter die alten bzw. neuen Datensätze und kann den Neuen ggf. verändern, dazu später mehr. Eine weitere Besonderheit ergibt sich aus den Anführungsstrichen, durch die die Funktionsdeklaration eingeschlossen wird, denn daher müssen alle Anführungsstriche innerhalb der eigentlichen Triggerfunktion verdoppelt werden. 98 Marcus Börger Relationale Datenbanken Trigger 10.2 Oracle und PL/SQL Neben der reinen Programmiersprache Procedural Language/SQL, stellt Oracle noch eine sehr große Bibliothek zur Verfügung und bietet überdies noch ein Interface zu Java an [FePr99a] [FePr99b]. 10.3 Microsoft und VBA Wenn der Microsoft SQL Server zum Einsatz kommt ist man zwar einerseits auf die Verwendung von INSTEAD OF Triggern beschränkt hat aber andererseits die flexibelste Sprache zur Implementierung von Triggerfunktionen, namentlich VBA24, zur Verfügung. Wenn VBA als Implementierungssprache noch als Nachteil angesehen werden kann oder muß, so kann davon ausgegangen werden, daß neuere Versionen des MS SQL Servers voll in die .NET Strategie integriert sind und somit alle von Microsoft unterstützen Sprachen inklusive C# unterstützt werden. 24 Visual Basic for Applications stellt nicht nur in sich ein umfangreiches Programmiersystem zur Verfügung, sondern man hat auch Zugriff auf Bibliotheken anderer Sprachen über DLLs (Dynamic Link Library). Marcus Börger 99 Zusammenfassung Relationale Datenbanken 11 Zusammenfassung Relationale Datenbanken stellen eines der am weitesten verbreiteten Werkzeuge zur Verwaltung von Daten dar, auch wenn Sie sich nicht für jede Art von Daten und für jede Anwendung eigenen. Es gibt relationale Datenbanken für verschiedene Einsatzbereiche. Vor der Entwicklung einer Datenbankanwendung sollte also der spätere Einsatz gut überlegt sein, da dies einen großen Einfluß auf die Wahl des Datenbank Managementsystems hat. Es empfiehlt sich jedoch immer, Datenbankanwendungen möglichst allgemeingültig zu halten, so daß einerseits die Anwendung später erweitert werden kann, ohne die Datenbank völlig neu entwickeln zu müssen und andererseits das Datenbank Managementsystem gewechselt werden kann. Für die Entwicklung der einzusetzenden Modelle ist es ratsam geeignete Modellierungswerkzeuge zu verwenden. Das hier vermittelte Wissen zum Vorgehen bei der Modellierung und die Kenntnis der Möglichkeiten des Relationalen Modells sind aber auch beim Einsatz eines solchen Programms unabdingbar. Die Erstellung von Anwendungen verlangt heutzutage fast immer die Fähigkeit mit SQL Daten manipulieren zu können und selbst wenn eine Anwendung mit all ihren SQL Abfragen komplett entwickelt worden ist, wird es trotzdem immer notwendig sein, mit dem Einsatz von SQL Befehlen die Datenbank Pflegen und untersuchen zu können. Letzteres bedeutet also, daß eine fundierte Kenntnis der SQL Befehle und deren Einsatz im eingesetzten Datenbank Managementsystem für den Betrieb einer Datenbank gestützten Anwendung Vorraussetzung ist. 100 Marcus Börger Relationale Datenbanken EBNF A EBNF Die Extended Backus Naur Form EBNF dient der Definition der Syntax einer Sprache. Dieser Text nutzt die EBNF um die Sprache SQL zu erklären. Hier wird nur ein kleiner Teil der EBNF benutz. Dabei werden Elemente die kursiv dargestellt werden an einer andern Stelle exakt definiert. Elemente die nicht kursiv dargestellt werden, sind hingegen 1 zu 1 zu übernehmen: • ABC Steht für den Text ABC • ABC Wenn ABC als Text Hallo definiert wird, steht ABC für Hallo. Das wird an vielen Stellen benutzt, um Elemente einer Deklaration in einer getrennten EBNF Deklaration zu erklären. Abbildung 11.1: EBNF Definitionen Optionale Elemente können durch die eckigen Klammern „[“ und „]“ dargestellt werden: • A [ B ] C Steht für AC oder ABC. Mehrfaches Auftreten von B (etwa ABBC) ist nicht möglich. • A [ B ] [ C ] D Läßt die Zeichenketten AD, ABD, ACD sowie ABCD zu. Eine Vertauschung wie in ACBD ist nicht möglich. Abbildung 11.2: EBNF Option Eine Auswahl kann durch geschweifte Klammern „{“, „}“ und Trennstriche „|“ definiert sein: • A { B | C | D } E Erlaubt ABE, ACE und ADE. Die Folgen AE, ABCDE, ACDE, ABDE und ABCE sind nicht zugelassen. Abbildung 11.3: EBNF Auswahl Eine Auswahl kann innerhalb einer Option definiert werden: • A [ B | C ] D Ermöglicht AD, ABD oder ACD. Die Folge ABCD ist nicht zugelassen. • A [ { B | C } D | E ] F Ermöglicht AF, ABDF, ACDF und AEF. Nicht erlaubt sind ABF, ABCF, ACF, ABCDF, ABCDEF, ADF sowie ADEF. Abbildung 11.4: EBNF Auswahloption Marcus Börger 101 Lösungen Relationale Datenbanken B Lösungen 2 Datenbank Schemata 2.1 Der Name besteht im allgemeinen aus Vor- und Nachname. Zusätzlich gibt es noch die Anrede (Herr, Frau) und ggf. Titel (Prof., Dr., Ing.) sowie Namenserweiterungen. Namenserweiterungen sind etwa das Deutsche "von" oder das Holländische "van". In einigen Ländern sind zudem Zusätze wie "jr." für Junior üblich. In Manchen Anwendungen ist es zudem durchaus sinnvoll alle Vornamen zu speichern, wobei man zur Vereinfachung eine Spalte für den Hauptvornamen und eine Zweite für die weiteren Vornamen. Es gibt sich also Anrede, Titel, Vorname, Weitere Vornamen, Adelprädikat, Nachname, Namenszusatz. 2.2 Da die Anrede vom Kontext der Verwendung abhängt und in jeder Sprache anders lautet empfiehlt es sich nicht die Anrede selbst sondern lediglich das Geschlecht zu speichern. Aus den gespeicherten Informationen kann die Anwendung dann Anrede und Name im Kontext der Anwendung korrekt zusammenstellen. Dieses Vorgehen ist zudem hilfreich, da man aus dem Vornamen nicht immer auf das Geschlecht schließen kann, so ist Rene in Deutschland ein männlicher und in Frankreich ein weiblicher. PNr PTyp 1 Personen Vorname Adelrädikat Nachname TNr Zusatz … n = Titel Anrede Titel TNr … Geschlecht Abbildung 11.5: Lösungsvorschlag 2.2 Soll die Anrede dennoch gespeichert werden, so empfiehlt es sich eine Liste oder Tabelle für die Möglichkeiten vor zu sehen. Ansonsten besteht Gefahr, daß verschiedene Anwender unterschiedliche Formen und Schreibweisen der Anreden benutzen (Herr, Hr., herr). 2.3 Wenn mit der Dauer gearbeitet wird, braucht man sich keine Gedanken um Sommer/Winterzeit oder womöglich Schaltsekunden machen. Wird hingegen mit der Endzeit gearbeitet, so entfallen aufwendige Berechnungen der Endzeit, allerdings muß die Dauer berechnet werden. Oder war die Begründung umgekehrt? 2.4 Im Normalfall reicht es in solchen Anwendungen Anfangs- und Endtermin als Datum zu speichern. Wenn es jedoch vorkommt, daß Veranstaltungen zu verschiedenen Zeiten an einem Tag stattfinden, so ist neben dem Datum auch die Zeit wichtig. 2.5 Bei Beschränkung der maximalen Anzahl, können einfach alle notwendigen Felder durchnumeriert werden (Ort1, Zeit1, … Ortn, Zeitn). Andernfalls wird eine weitere Tabelle benötigt. Beachten Sie im Beispiel unten, daß nur TNr Primary Key der Tabelle Termine ist. Die erste Lösung ist schneller aber unflexibel und führt zu Platzverschwendung, wenn nur selten mehrere Felder benötigt werden (2.2.5.2.1 Relationstyp 1 zu c, c klein). Personen Name PNr 1 besuchen PNr VNr = n n 1 n = Veranstaltungen VNr PNr VName = 1 1 Termine TNr VNr Ort = Zeit n Abbildung 11.6: Lösungsvorschlag 2.5 102 Marcus Börger Relationale Datenbanken 2.6 Lösungen Da es nicht gefordert ist die Information über die Lehrstühle zu speichern, reicht es aus jeder Person eine übergeordnete Person zu zuordnen (Tutor, Lehrstuhlinhaber, Dekan). Diese übergeordnete Person wird im Feld CNr gespeichert und stellt somit eine rekursive 1 zu n Relation dar. In der Abbildung unten sind nur dir wichtigsten Spalten dargestellt: Personen CNr Name PNr n = besuchen PNr VNr 1 1 = n Veranstaltungen VNr PNr VName n 1 n = = 1 Abbildung 11.7: Lösungsvorschlag 2.6 2.7 Wenn alle Relationen mit CASCADE definiert sind, so wird die Datenbank durch Löschen des Datensatzes Ebert K. vollständig geleert. Die Abbildung unten greift Aufgabe 2.6 auf und zeigt zunächst die gefüllten Tabellen. In vier Schritten wird dann das Leeren der Datenbank gezeigt. Dazu werden jeweils die betroffenen Datensätze und die zugehörigen Relationen, beginnend beim Datensatz des Dozenten Ebert K., markiert: 1 Personen CNr Name PNr NULL Ebert K. 100000 100000 Zucker G. 100001 100001 Meier A. 100002 100001 Kühn H. 100003 100001 Muster M. 100004 2 Personen CNr Name PNr NULL Ebert K. 100000 Zucker G. 100001 Meier A. 100001 Kühn H. 100001 Muster M. 3 Personen CNr Name PNr NULL 100000 100001 100001 100001 4 100000 100001 100002 100003 100004 Ebert K. Zucker G. Meier A. Kühn H. Muster M. 100000 100001 100002 100003 100004 Personen CNr Name PNr NULL 100000 100001 100001 100001 Ebert K. Zucker G. Meier A. Kühn H. Muster M. 100000 100001 100002 100003 100004 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 besuchen PNr VNr 100002 100002 100004 100003 100004 100002 2 3 2 1 1 4 Veranstaltungen VNr PNr VName 1 2 3 4 100000 100000 100001 100001 Einführung Modellierung SQL-DDL SQL-DML Veranstaltungen VNr PNr VName 1 2 3 4 100000 100000 100001 100001 Einführung Modellierung SQL-DDL SQL-DML Veranstaltungen VNr PNr VName 1 2 3 4 100000 100000 100001 100001 Einführung Modellierung SQL-DDL SQL-DML Veranstaltungen VNr PNr VName 1 2 3 4 100000 100000 100001 100001 Einführung Modellierung SQL-DDL SQL-DML Abbildung 11.8: Lösungsvorschlag 2.7 Marcus Börger 103 Lösungen Relationale Datenbanken 2.8 3 Modellierung 3.1 3.2 3.3 3.4 3.5 3.6 3.7 104 Marcus Börger Relationale Datenbanken Verzeichnis der Abbildungen und Tabellen C Verzeichnis der Abbildungen und Tabellen Abbildung 2.1: Datenbank Schemata ..........................................................................................................................10 Abbildung 2.2: Tabellendarstellung ............................................................................................................................12 Abbildung 2.3: Tabelle Personen ................................................................................................................................13 Abbildung 2.4: Tabelle Veranstaltungen.....................................................................................................................13 Abbildung 2.5: Tabelle besuchen ................................................................................................................................13 Abbildung 2.6: full-table-scan.....................................................................................................................................15 Abbildung 2.7: Relationstyp 1 zu 1 .............................................................................................................................16 Abbildung 2.8: Relationstyp 1 zu 0/1 vs. Strukturgleichheit.......................................................................................17 Abbildung 2.9: Relationstyp 1 zu 0/1..........................................................................................................................17 Abbildung 2.10: Relationstyp 1 zu n ...........................................................................................................................18 Abbildung 2.11: Mehrfache Felder vs. Relation..........................................................................................................18 Abbildung 2.12: Relation umgekehrt ..........................................................................................................................19 Abbildung 2.13: Relationen zu verschiedenen Tabellen .............................................................................................19 Abbildung 2.14: Relationstyp 1 zu n mit Rekursion ...................................................................................................20 Abbildung 2.15: Relationstyp n zu m..........................................................................................................................20 Abbildung 2.16: Doppelte n zu m Relation .................................................................................................................21 Abbildung 2.17: Parallele n zu m Relationen..............................................................................................................21 Abbildung 2.18: Primary Key .....................................................................................................................................23 Abbildung 2.19: Primary Key bei ungeordneter Tabelle.............................................................................................23 Abbildung 2.20: Primary Key und Index (VZeit, VOrt) .............................................................................................23 Abbildung 2.21: Einfaches Datenmodell der Universität ............................................................................................25 Abbildung 2.22: Ausgangssituation ............................................................................................................................25 Abbildung 2.23: Relationen und Ändern mit CASCADE ...........................................................................................25 Abbildung 2.24: Löschen mit CASCADE...................................................................................................................26 Abbildung 2.25: Relationen und Set NULL ................................................................................................................26 Abbildung 2.26: Relationen und Set DEFAULT ........................................................................................................27 Abbildung 2.27: Relationen und Löschen bei Änderung.............................................................................................27 Abbildung 2.28: View als Filter ..................................................................................................................................28 Abbildung 2.29: View über Join..................................................................................................................................28 Abbildung 3.1: Die UNI in einer Textdatei .................................................................................................................30 Abbildung 3.2: Erste Normalform...............................................................................................................................31 Abbildung 3.3: Zweite Normalform, Personen ...........................................................................................................32 Abbildung 3.4: Zweite Normalform, Veranstaltungen................................................................................................32 Abbildung 3.5: Personen und Lehrstühle ....................................................................................................................33 Abbildung 3.6: Dritte Normalform, Personen und LNr ..............................................................................................33 Abbildung 3.7: Dritte Normalform, Lehrstühle...........................................................................................................33 Abbildung 3.8: Dritte Normalform, Personen .............................................................................................................34 Abbildung 3.9: Dritte Normalform, lesen/besuchen....................................................................................................34 Abbildung 3.10: Dritte Normalform, Veranstaltungen................................................................................................34 Abbildung 3.11: Besucher, Dozent und Vorlesung .....................................................................................................35 Abbildung 3.12: Vierte Normalform, Besucher und Vorlesung..................................................................................35 Abbildung 3.13: Vierte Normalform, Dozent und Vorlesung .....................................................................................35 Abbildung 3.14: Einfaches ER Diagramm der Universität .........................................................................................37 Abbildung 4.1: Mainframe ..........................................................................................................................................39 Abbildung 4.2: Internet 3-tier Modell .........................................................................................................................40 Abbildung 5.1: MySQL Installation unter Windows...................................................................................................41 Abbildung 5.2: Cygwin Download..............................................................................................................................42 Abbildung 5.3: Cygwin Download, Paketauswahl......................................................................................................42 Abbildung 5.4: Cygwin Installation ............................................................................................................................43 Abbildung 5.5: Cygwin32 IPC Installation .................................................................................................................43 Abbildung 5.6: Postgres Initialisierung .......................................................................................................................44 Abbildung 5.7: Postgres als Windows Service einrichten ...........................................................................................45 Abbildung 5.8: Oracle System Struktur.......................................................................................................................46 Tabelle 5.1: Oracle, Tablespace Parameter .................................................................................................................49 Abbildung 5.9: Oracle, Net8 Assistant........................................................................................................................49 Abbildung 5.10: Oracle, Anmelden bei Oracle Enterprise Manager...........................................................................50 Abbildung 5.11: Oracle, Datenbank-Anmeldung als SYSDBA..................................................................................50 Tabelle 5.2: Oracle, Standardbenutzer.........................................................................................................................50 Abbildung 5.12: Oracle, Datenbank hinzufügen .........................................................................................................51 Abbildung 5.13: Oracle, Tablespace erstellen .............................................................................................................51 Marcus Börger 105 Verzeichnis der Abbildungen und Tabellen Relationale Datenbanken Abbildung 5.14: Oracle, Datendatei bearbeiten...........................................................................................................52 Abbildung 5.15: Oracle, Benutzer bearbeiten .............................................................................................................52 Abbildung 5.16: Oracle, Anmeldung als Normal ........................................................................................................53 Abbildung 5.17: Oracle, SQL*Plus Worksheet...........................................................................................................53 Abbildung 5.18: Oracle, SQL PROMPT ......................................................................................................................53 Abbildung 6.1: Aufbau des Befehles CREATE DATABASE ......................................................................................54 Abbildung 6.2: Verbinden mit der Datenbank ............................................................................................................54 Abbildung 6.3:Anlegen der Datenbank Uni ................................................................................................................54 Abbildung 6.4: Aufbau des CREATE TABLE Befehles ............................................................................................55 Abbildung 6.5: CREATE TABLE für MySQL............................................................................................................55 Tabelle 6.1: MySQL Tabellentypen ............................................................................................................................55 Abbildung 6.6: Einfache Spaltendefinitionen..............................................................................................................56 Abbildung 6.7: Spaltendefinitionen.............................................................................................................................56 Tabelle 6.2: Alphanumerische Datentypen..................................................................................................................57 Tabelle 6.3: Numerische Datentypen ..........................................................................................................................58 Abbildung 6.8: Check Constraint ................................................................................................................................59 Abbildung 6.9: Check Constraints...............................................................................................................................59 Abbildung 6.10: Primary Key Constraint....................................................................................................................60 Abbildung 6.11: Alternate Key Constraint..................................................................................................................60 Abbildung 6.12: Foreign Key Constraint ....................................................................................................................60 Abbildung 6.13: Constraint Deferrment ......................................................................................................................60 Abbildung 6.14: CREATE TABLE SELECT, MySQL..............................................................................................61 Abbildung 6.15: CREATE TABLE SELECT, PostgreSQL & Oracle........................................................................61 Abbildung 6.16: SELECT INTO FROM, PostgreSQL ..............................................................................................61 Abbildung 6.17: Erzeugen der Tabelle Personen ........................................................................................................62 Abbildung 6.18: Erzeugen der Tabelle Veranstaltungen.............................................................................................62 Abbildung 6.19: Erzeugen der Tabelle besuchen ........................................................................................................62 Abbildung 6.20: Aufbau des CREATE INDEX Befehles ...........................................................................................63 Abbildung 6.21: Anlegen der Indizes für die Datenbank Uni .....................................................................................63 Abbildung 6.22: Aufbau des CREATE VIEW Befehles..............................................................................................63 Abbildung 6.23: Aufbau des DROP Befehles ..............................................................................................................65 Abbildung 6.24: Löschen der Tabelle besuchen..........................................................................................................65 Abbildung 6.25: Aufbau des TRUNCATE TABLE Befehles ......................................................................................65 Abbildung 7.1: Aufbau des INSERT INTO Befehles................................................................................................66 Abbildung 7.2: Aufbau des INSERT INTO SELECT Befehles .............................................................................66 Abbildung 7.3: INSERT INTO SELECT Beispiel...................................................................................................66 Abbildung 7.4: Belegen der Tabelle Personen ............................................................................................................67 Abbildung 7.5: Belegen der Tabelle Veranstaltungen.................................................................................................67 Abbildung 7.6: Belegen der Tabelle besuchen ............................................................................................................67 Abbildung 7.7: Aufbau des SELECT Befehls .............................................................................................................68 Abbildung 7.8: Einfaches SELECT.............................................................................................................................68 Abbildung 7.9: SELECT mit mehreren Spalten ..........................................................................................................68 Abbildung 7.10: SELECT *.......................................................................................................................................68 Abbildung 7.11: WHERE in SELECT...........................................................................................................................69 Abbildung 7.12: Aliasnamen.......................................................................................................................................69 Abbildung 7.13: SELECT über einer n zu m Relation ................................................................................................69 Abbildung 7.14: Mehrfachverwendung einer Tabelle in einer Abfrage ......................................................................70 Abbildung 7.15: SELECT mit indirekten Tabellen .....................................................................................................70 Abbildung 7.16: GROUP BY Abfrage.........................................................................................................................71 Abbildung 7.17: HAVING Abfrage .............................................................................................................................72 Abbildung 7.18: Sortierte Abfrage ..............................................................................................................................72 Abbildung 7.19: Mehrfachsortierung ..........................................................................................................................72 Abbildung 7.20: UNION..............................................................................................................................................73 Abbildung 7.21: VIEW Anzahl....................................................................................................................................73 Abbildung 7.22: Abfrage mit EXCEPT .......................................................................................................................74 Abbildung 7.23: UNION, EXCEPT, INTERSECT.................................................................................................74 Abbildung 7.24: Subselect ersetzt Konstante ..............................................................................................................75 Abbildung 7.25: Subselect mit Korrelation .................................................................................................................76 Abbildung 7.26: Korrelation auf gleicher Ebene ist unzulässig ..................................................................................76 Abbildung 7.27: Zulässige Korrelationsformen ..........................................................................................................76 Abbildung 7.28: Abfrage mit zwei Tabellen ...............................................................................................................77 Abbildung 7.29: Subselect als unabhängige Spalten ...................................................................................................77 Abbildung 7.30: Abfrage mit unabhängigen Subselects .............................................................................................77 106 Marcus Börger Relationale Datenbanken Verzeichnis der Abbildungen und Tabellen Abbildung 7.31: Subselect und EXISTS ....................................................................................................................79 Abbildung 7.32: Subselect und ANY ...........................................................................................................................79 Abbildung 7.33: SELECT ohne FROM ........................................................................................................................81 Abbildung 7.34: Aufbau des UPDATE Befehles .........................................................................................................82 Abbildung 7.35: UPDATE Beispiel .............................................................................................................................82 Abbildung 7.36: Aufbau des REPLACE INTO Befehles ...........................................................................................83 Abbildung 7.37: REPLACE INTO ersetzen ...............................................................................................................83 Tabelle 7.1: REPLACE INTO Verhalten....................................................................................................................83 Abbildung 7.38: Aufbau des DELETE FROM Befehles..............................................................................................84 Abbildung 7.39: Top-Level DELETE mit PostgreSQL ...............................................................................................84 Abbildung 7.40: Löschen doppelter Datensätze mit PostgreSQL ...............................................................................84 Abbildung 7.41: MySQL mit IF und <, = bei Zeichenketten.....................................................................................86 Abbildung 7.42: Operator IS NULL ..........................................................................................................................87 Abbildung 7.43: Funktion NULLIF ............................................................................................................................87 Abbildung 7.44: Funktion IFNULL ............................................................................................................................87 Abbildung 7.45: Funktion COALESCE .......................................................................................................................88 Abbildung 9.1: Rechte eines DBMS ...........................................................................................................................90 Tabelle 9.1: MySQL Privilegien .................................................................................................................................91 Abbildung 9.2: MySQL Datenbank mysql................................................................................................................92 Abbildung 9.3: MySQL Tabelle user.user...................................................................................................................92 Abbildung 9.4: MySQL Tabelle user.db .....................................................................................................................93 Abbildung 9.5: MySQL Tabelle user.db .....................................................................................................................93 Abbildung 9.6: mysqladmin reload ...................................................................................................................94 Abbildung 10.1: Trigger Ablaufdiagramm..................................................................................................................97 Abbildung 10.2: createlang und droplang ....................................................................................................98 Abbildung 10.3: Trigger mit PL/PGSQL ....................................................................................................................98 Abbildung 11.1: EBNF Definitionen......................................................................................................................... 101 Abbildung 11.2: EBNF Option.................................................................................................................................. 101 Abbildung 11.3: EBNF Auswahl............................................................................................................................... 101 Abbildung 11.4: EBNF Auswahloption .................................................................................................................... 101 Abbildung 11.5: Lösungsvorschlag 2.2 ..................................................................................................................... 102 Abbildung 11.6: Lösungsvorschlag 2.5 ..................................................................................................................... 102 Abbildung 11.7: Lösungsvorschlag 2.6 ..................................................................................................................... 103 Abbildung 11.8: Lösungsvorschlag 2.7 ..................................................................................................................... 103 Marcus Börger 107 Literaturverzeichnis Relationale Datenbanken D Literaturverzeichnis [BeMi00] XML in der Praxis Professionelles Web-Publishing mit der Extensible Markup Language Henning Behme, Stefan Mintert Addison Wesley, 2000, ISBN: 3-8273-1636-7 [Boe00] Marcus Börger Internet-Informationssysteme mit XML, XML-Views RWTH-Aachen, 2000 http://www-users.rwth-aachen.de/Marcus.Boerger/SemXML/SemXML.pdf [CHRS00] Andreas Christiansen, Michael Höding, Claus Rautenstrauch, Gunter Saake Oracle 8 effizient einsetzen Addison-Wesley, 2000, ISBN 3-8273-1347-3 [dtec97] 3- und n-schichtige Architekturen Copyright d-tec Distributed Technologies GmbH, 1997 http://www.corba.ch/3tier.html [FePr99a] Oracle PL/SQLP Grundlagen O'Reilly, 1999, ISBN: 3-89721-180-7 [FePr99b] Oracle PL/SQL Erweiterungen O'Reilly, 1999, ISBN: 3-89721-181-5 [FNA99] Peter Fankhauser, Erich J. Neuhold, Karl Aberer Grundlagen des Datenmanagements im World Wide Web GMD – IPSI, TU Darmstadt, 1998 http://www.darmstadt.gmd.de/~fankhaus/wwwdb.html Zugang auf Anfrage: mailto://[email protected] [Genn99] Oracle SQL*Plus The Definite Guide O'Reilly, 1999, ISBN: 1-56592-578-5 [HeSa00] Andres Heuer, Gunter Saake Datenbanken: Konzepte und Sprachen MITP, 2000, ISBN: 3-8266-0619-1 [HLU98] Uwe Herrmann, Dierk Lenz, Günter Unbescheid Oracle 8 für den DBA Addison-Wesley, 1998, ISBN: 3-8273-1310-4 [HSG98] Understanding and deploying LDAP Directory Services Timothy A. Howes, Ph.D., Mark C. Smith, Gordon S. Good New Riders, 1998, ISBN: 1-57870-070-1 [ISO3166] ISO 3166 Maintenance Agency (ISO 3166/MA) ISO 3166-1: The Code List International Organization for Standards, 2001 http://www.din.de/gremien/nas/nabd/iso3166ma/ [Kof01] Michael Kofler MySQL, Einführung, Programmierung, Referenz Addison-Wesley, 2001, ISBN: 3-8273-1762-2 [Mom00] Bruce Momjian PostgreSQL: Introduction and Concepts Addison-Wesley, 2000, ISBN: 0-201-70331-9 [NWB00] Ann Navarro, Chuck White, Linda Burman Mastering XML Sybex, 2000, ISBN: 0-7821-266-3 108 Marcus Börger Relationale Datenbanken Literaturverzeichnis [Pet01] Dušan Petković MS SQL Server 2000 Addison-Wesley, 2001, ISBN: 3-8273-1723-1 Auf CD: Bestellmöglichkeit für 120-Tage-Trialversion von MS SQL Server 2000 [SAG00] Software AG Tamino XML Database http://www.softwareag.com/tamino/ [SKS97] Abraham Silberschatz, Henry F. Korth, S. Sudashan Database system concepts; 3rd Edition McGraw-Hill, 1997, ISBN: 0-07-114810-8 [Wie01] Thomas Wiedmann DB2 – SQL, Programmierung und Tuning C&L Computer- und Literaturverlag, 2001, ISBN: 3-932311-80-9 Auf CD: DB2 Universal Database Personal Edition 7.1 (Windows) für 90 Tage Marcus Börger 109 Notizen Relationale Datenbanken Notizen: 110 Marcus Börger Relationale Datenbanken Marcus Börger Notizen 111 Relationale Datenbanken Relationale Datenbanken, Modellierung und SQL, richtet sich an alle, die sich in das Thema Relationale Datenbanken einarbeiten wollen. Es bietet dazu eine praktisch orientierte Einführung in die Konzepte Relationaler Datenbanken sowie einen Einstieg in die drei verbreiteten Datenbank Managementsysteme MySQL, PostgreSQL und Oracle. Notizen