Themen (2) 1 Grundlagen Datenbanksysteme Definition und Bedeutung von DB’s Klassifikation von DB-Systemen Relationale Datenbanken Einführung in SQL Clientseitige Programmierung Prof. Dr. Christoph Dalitz Sommersemester 2012 2 Datenmodelle Drei Schichten Modell und Entwurfsmethodik Relationales Modell Abhängigkeiten und Normalformen relationale Algebra Semantische Modelle (z.B. Entity-Relationship) Vorlesung an der Hochschule Niederrhein 1 Themen (1) Themen (3) 3 Fortgeschrittene Themen Praxis− Anforderungen Anwendungs− programm 3 Weitere Datenobjekte (Sequence, View...) Serverseitige Programmierung (PL/SQL, Trigger) Datenbank Tuning Datensicherheit und Transaktionen Verwal− tung Speich− erung Nicht behandelte Themen: DBS 1) Datenbankpraxis Was bietet ein DBS? Wie nutzt man es? 2) Datenmodellierung Umsetzung realer Datenstruktur in relationale DB 3) DBS-Implementierung Wie ist ein DBS intern implementiert? Interne Implementierung von Datenbanksystemen Speicherstrukturen und Indizes Recovery bei Systemabsturz Abfrageverarbeitung verteilte Datenbanken objektorientierte Datenbanken 2 4 Dalitz DBS Kap1.1-3 Literatur 1.1 Definition, Bedeutung (2) Vorlesung: DBS−Architektur Elmasri, Navathe: Grundlagen von Datenbanksystemen. Pearson Studium 2005 (3. Auflage, Grundstudiumsausgabe) Garcia-Molina, Ullman, Widom: Database Systems The Complete Book. Prentice Hall 2002 Abfrage, Manipulation Struktur− definition DML Prozessor DDL Prozessor Optimizer D B S Praktikum: PostgreSQL Online-Dokumentation: http://www.postgresql.org/docs/ Datenbank Manager Mehrbenutzer Synchronisation RDBMS Matthew, Stones: Beginning Databases with PostgreSQL. Apress 2005 Logbuch Indizes Daten− basis System Katalog Speicher 5 1.1 Definition, Bedeutung (1) 7 1.2 Klassifikation (1) Aufgaben eines DBS: Einteilung von "Datenbank-Systemen" nach verschiedenen Kriterien Datendefinition Data Definition Laguage (DDL) System Catalog (Data Dictionary) Leistungsumfang Datenmanipulation Welche Aufgaben eines DBS sind implementiert? => Desktop, Client-Server, verteilte Datenbank Data Manipulation Language (DML) Abfrageoptimierung Datenschutz logische Datensicht ("Datenmodell") Benutzerrechte und Zugriffsbeschränkung Wie präsentieren sich Daten aus Sicht des Anwenders? => hierarchisch, relational, objektorientiert Datensicherheit Konsistenzprüfung, Integrity Constraints Transaktionen Concurrency Control Recovery bei Systemfehlern 6 8 Dalitz DBS Kap1.1-3 1.2 Klassifikation (2) 1.2 Klassifikation (4) KD# Kunde Pgm2 Pgm1 BSD Sockets Client 1 Domain Sockets VS# Versicherg. BK# Bankverb. DBMS KS# Klausel BSD Sockets Pgm1 Hierarchisches Modell DB 1969 von IBM mit IMS eingeführt Datensätze in geordnetem Baum gespeichert Zugriff durch Direktzugriff über Schlüssel und Manövrieren in Baumhierarchie Server Client 2 Client-Server DBS DBS eigenständiger Prozess Zugriff über IPC-Mechanismen Multi-User Systeme => Abhängigkeit von physischer Datenstruktur 9 1.2 Klassifikation (3) 1.2 Klassifikation (5) Pgm Pgm KD# Kunde Pgm DB−Lib DB−Lib 11 DB−Lib VS# KD# Versicherg. BK# KD# Bankverb. KD# Kunde Client 1 DB Desktop Rechner Client 2 VS# KD# Versicherg. KS# VS# Klausel DB Fileserver VS# KD# Versicherg. Kunde Relationales Modell Desktop Datenbank 1970 von Codd vorgeschlagen Daten in Tabellen gespeichert Zugriff durch Erzeugung von neuen Tabellen aus alten Direktzugriff auf Daten über dazugelinkte Library-Routinenen Mehrbenutzersynchronisation nur über primitives Filelocking Single-User Systeme 10 => physische Datenunabhängigkeit 12 Dalitz DBS Kap1.1-3 1.2 Klassifikation (6) 1.3 Relationale Datenbanken Objektorientierte Datenbanken Aspekte des relationalen Modells seit 1985 für komplexe Anforderungen (z.B. CAD) entwickelt Daten in benutzerdefinierten Strukturen gespeichert Zugriff über benutzerdefinierte Funktionen DBS ist "Bausatz" für eigene DB-Implementierung Daten-Struktur: Anwender sieht Daten als Tabellen => Abhängigkeit von Klassenimplementierung Daten-Integrität: Tabellen erfüllen Integritätsbedingungen Objekt-Relationale Datenbanken relationales Modell objektorientierte Erweiterungen: benutzerdefinierte Datentypen + Operatoren, Vererbung Daten-Manipulation: Operatoren werden auf Tabellen angewendet Output ist wieder eine Tabelle => beide Welten vereinigt 13 1.2 Klassifikation (7) Name Oracle Hersteller Oracle Informix DB2 Interbase Sybase Access (Informix) IBM Borland Sybase Microsoft MS SQL-Server mySQL Microsoft freie Software PostgreSQL SQLite freie Software freie Software 1.3.1 Struktur (1) Bemerkung Marktführer, sehr teuer, viele Highend-Features, alle Plattformen (AS400, Unix, Win32) von IBM gekauft Das relationale Modell Aus Benutzersicht besteht DB aus Tabellen (logische Struktur). Physische Struktur bleibt dem Benutzer verborgen. jetzt als “Firebird” OpenSource Desktop-Datenbank mit umfangreicher Benutzeroberfläche nur Win32 Teilfunktionalität, speziell für manche Web-DB’s hinreichend verbreitet als embedded SQL Datenbank 15 Kompletter Informationsgehalt dargestellt in einer Form: als Feldwerte in Tabellenzeilen. (Date: "The Information Principle") 14 16 Dalitz DBS Kap1.1-3 1.3.1 Struktur (2) 1.3.3 Manipulation nr# :int4 name :char(30) stadt :char(30) 11 Thyssen Duisburg 12 Siemens München Erfolgt in relationaler Datenbanksprache Internationaler Standard ist SQL Daten-Auswertung erzeugt aus bestehenden Tabellen neue Tabellen => Ausgabe kann wieder Input für weitere Auswertung sein SQL-Befehl: select Eigenschaften einer Tabelle: alle Spalten haben skalaren Typ alle Spaltenbezeichner sind verschieden jede Zeile hat eindeutigen Primary Key Felder können leer (NULL) sein (Ausnahme: Primary Key) Daten-Änderung weist bestehenden Tabellen neue Werte zu SQL-Befehle: insert, update, delete 17 19 1.3.2 Integrität 1.3.4 weitere Objekte (1) Integrity Constraints weitere Datenbankobjekte zur Verwaltung Bedingungen, die unzulässige Einträge verhindern Objekt index sequence trigger user group Primary Key eindeutiges Zeilenmerkmal; verhindert doppelte Zeilen Foreign Key Verweis auf andere Tabelle; verhindert Verweis ins Leere Hersteller Produkt nr# nr# name name database schema herstellernr 18 Bedeutung beschleunigter Zugriff automatische Schlüsselgenerierung Callback Mechanismus Datenbankbenutzer Benutzergruppe (vereinfacht Rechteverwaltung) logische Speichereinheit Namespace Die verfügbaren Objekttypen können je DBS variieren. Z.B. unterstützt Postgres schema erst in Version 7.3 20 Dalitz DBS Kap1.1-3 1.3.4 weitere Objekte (2) 1.3.5 System Catalog (2) Index System Catalog PostgreSQL: ermöglicht Direktzugriff über Spaltenwert(e) beschleunigt Zugriff, aber verlangsamt Änderungen sinnvoll insbesondere bei Foreign Keys (häufige Joins) Produkt pnr# Catalog Name pg attribute pg class pg database pg group pg index pg relcheck pg trigger pg type pg user automatischer Index durch Primary Key name preis hnr zusätzlicher Index auf hnr sinnvoll Bemerkung: Zugriff über Index nicht notwendig schneller als sequentiell. Bei Postgres Statistikauswertung mit (vacuum) analyze nötig. 21 1.3.5 System Catalog (1) statt Tabellen Views, die Benutzerrechte berücksichtigen Präfix USER_ => eigene Objekte Präfix ALL_ => alle Objekte auf die User zugreifen darf Präfix DBA_ => alle Objekte pg attribute: PostgreSQL column meta data attname atttypid ... 23 Data Dictionary Oracle: Beispiel: The table this column belongs to (references pg class.oid) Column name The data type of this column (references pg type.oid) ... In psql können Beschreibungen mit \d abgefragt werden. \set ECHO_HIDDEN (oder psql -E) gibt Abfragen mit aus. 1.3.5 System Catalog (3) Strukturinformationen werden vom DBS in Tabellen gespeichert Sammlung dieser Tabellen heißt System Catalog oder Data Dictionary attrelid Purpose table columns (“attributes”, “fields”) tables, indexes, sequences (“relations”) databases within this database cluster groups of database users additional index information check constraints triggers data types database users 22 View * tables * tab columns * sequences * indexes * ind columns * users * role privs Purpose Shows all relational tables Shows all table and view columns Lists all sequences in the database Lists all indexes Lists all indexed columns Lists all users Lists all roles granted to users and other roles 24 Dalitz DBS Kap1.1-3 1.4 SQL Einführung (1) 1.4 SQL Einführung (3) Relationale Datenbanksprachen: SQL est omnis divisa in partes tres: SQL - Structured Query Language Als SEQUEL 1974-77 bei IBM für System R entwickelt ANSI/ISO Standards: SQL (1986), SQL2 (1992), SQL3 (1999) die meisten heutigen DBS unterstützen eine Obermenge einer Untermenge von SQL2 DDL - Data Definition Language Definieren und Ändern von Strukturen Kommandos: create, alter, drop QUEL - Query Language DML - Data Manipulation Language zeitgleich zu SQL für Ingres an Berkeley University entwickelt trotz "Überlegenheit zu SQL in vielen Bereichen" (Date) keine Marktdurchdringung Abfrage und Manipulation der Daten Kommandos: select, insert, update, delete DCL - Data Control Language QBE - Query by Example Steuerung Datenzugriff und Datensicherheit Kommandos: grant, revoke, begin, commit, rollback intuitiver grafischer Zugriff in Frontends für "Joe User" realisiert (z.B. MS Access) 1 3 1.4 SQL Einführung (2) 1.4 SQL Einführung (4) SQL rein sequentielle Sprache Kommandos werden sequentiell abgearbeitet keine Programmiersprache. Insbesondere fehlen Variablen, Kontrollflusssteuerung, Prozeduren SQL muss in im allgemeinen in "Host-Language" eingebettet werden SQL Syntax: Kommandos durch Semikolon (;) getrennt (nicht immer: in SQL-Interpreter ja, in ESQL nicht) Key words und Identifier nicht case sensitive Ausnahme: quoted Identifier (z.B. "Bla" ≠ bla) Zulässige Identifier: [_a-z][_a-z0-9]* String Konstanten in single quotes (’bla bla’) Single quotes in Strings escaped durch verdoppeln (’Peter’’s house’) Es gibt prozedurale Erweiterungen PL/SQL (Oracle) und PL/PgSQL (PostgreSQL) Persistend Stored Modules (PSM) in ANSI SQL3 einzeilige Kommentare durch Doppelminus (-- Kommentar) mehrzeilige Kommentare wie in C (/*Kommentar*/) SQL3 erlaubt geschachtelte Kommentare (/*/*bla*/*/) PL/SQL werden wir im Zusammenhang mit Stored Procedures und Triggern behandeln 2 4 Dalitz DBS Kap1.4 1.4 SQL Einführung (5) 1.4.1 SQL-DDL (2) Laufendes Beispiel: Hersteller hnr# name stadt H1 H2 H3 Henkel Pelikan Brause Düsseldorf Hannover Iserlohn pnr# name preis hnr P1 P2 P3 P4 Pritt Uhu Tinte Füller 2.50 2.70 3.20 12.98 H1 H1 H2 H2 Produkt 5 1.4.1 SQL-DDL (1) Datentyp Beschreibung character(n) char(n) String der Länge n, am Ende ggf. mit Blanks aufgefüllt char varying(n) varchar(n) String variabler Länge (maximal n) im allg. gegenüber char vorzuziehen integer int Ganzzahl mit Vorzeichen Postgres unterscheidet int2, int4, int8 numeric(n,m) numeric(n) Dezimalzahl mit n Stellen, davon m nach dem Komma; numeric(n) = numeric(n,0) bool true, false oder unknown (NULL) date Datum (4 Bytes, tagesgenau) time Uhrzeit (8 Bytes, mikrosekundengenau) timestamp Datum und Uhrzeit 1.4.1 SQL-DDL (3) Constraints Anlegen einer Tabelle Constraints werden nach den Felddefinitionen angegeben Constraints, die sich nur auf ein Feld beziehen, können direkt bei der Felddefinition angegeben werden optional können Constraints mit Namen versehen werden CREATE TABLE tabellenname ( feld1 datentyp1, feld2 datentyp2, ... ..., CREATE TABLE example1 ( a integer, b integer, c varchar(2) REFERENCES example2(a), PRIMARY KEY (feldn, ...), weitere_constraints ); Mögliche Datentypen hängen vom konkreten DBS ab 7 PRIMARY KEY (a,b), CONSTRAINT check_b CHECK (b > 0) ); 6 8 Dalitz DBS Kap1.4 1.4.1 SQL-DDL (4) 1.4.1 SQL-DDL (6) Anlegen des Beispiels hersteller, produkt: Mögliche Constraints (1): NOT NULL Feld darf nicht leer (NULL) sein Angabe nur möglich in Spaltendefinition UNIQUE Feldwert muss eindeutig sein mehrfache Nullwerte sind aber zulässig CHECK (bedingung) Bedingungen für Feldwerte alle Felder in Bedingung müssen aus der Tabelle stammen 9 11 1.4.1 SQL-DDL (5) 1.4.1 SQL-DDL (7) Mögliche Constraints (2): Auch andere Datenbankobjekte (z.B. index) werden mit create angelegt PRIMARY KEY (felder) formal identisch zu Unique + Not Null pro Tabelle nur maximal ein Primary Key möglich FOREIGN KEY (felder) REFERENCES Beispiel: tabelle (felder) CREATE INDEX produkt_i1 ON produkt (hnr); referenziert Primary Key anderer Tabelle Wert darf aber NULL sein Verhalten bei Änderung in Referenztabelle spezifizierbar (z.B. on update cascade, on delete set null) Eindeutiger Index: Ausführliche Dokumentation siehe ddl-constraints.ps.gz (Homepage zur Vorlesung) CREATE UNIQUE INDEX ... 10 12 Dalitz DBS Kap1.4 1.4.1 SQL-DDL (8) 1.4.2 SQL-DML (2) Ändern von Strukturen Einfügen von Datensätzen Löschen mit drop INSERT INTO hersteller ( hnr, name, stadt ) VALUES ( ’H1’, ’Henkel’, ’Düsseldorf’ ); DROP INDEX produkt_i1; DROP TABLE produkt; Ändern mit alter table ALTER TABLE produkt ADD FOREIGN KEY (hnr) REFERENCES hersteller(hnr); Die Attributliste kann weggelassen werden. Nicht zu empfehlen! (Warum?) ALTER TABLE hersteller ADD COLUMN strasse VARCHAR(30); 13 1.4.2 SQL-DML (1) 15 1.4.2 SQL-DML (3) Kommandos zur Datenmanipulation: Es müssen nicht alle Spalten angegeben werden: insert Einfügen eines neuen Datensatzes INSERT INTO produkt (pnr, name) VALUES (’P5’, ’Papier’); update Änderung von Feldwerten Ergebnis: delete Löschen von Datensätzen komplette Tabelle auch mit truncate select Auswahl von Daten. Ausgabe ist wieder Tabelle 14 pnr# name preis hnr P1 P2 P3 P4 P5 Pritt Uhu Tinte Füller Papier 2.50 2.70 3.20 12.98 NULL H1 H1 H2 H2 NULL 16 Dalitz DBS Kap1.4 1.4.2 SQL-DML (4) 1.4.2 SQL-DML (6) Anstelle der values-Klausel kann auch select stehen: Where-Klausel Weglassen where-Klausel => alle Sätze betroffen INSERT INTO produkt (pnr, name) SELECT a, b FROM other_table; UPDATE produkt SET preis = preis * 2; Bemerkungen: Beschreibung von select siehe unten Zulässige Vergleichsoperatoren und Behandlung von NULL-Werten später bei select Datentypen von a,b und pnr,name müssen zusammenpassen Ermöglicht Einlesen von Daten aus anderer Tabelle, nicht jedoch aus einer Datei. Dafür gibt es Datenbankspezifische Tools, z.B. sqlldr (Oracle) oder den \copy-Befehl in psql (PostgreSQL) Zugewiesener Wert kann auch Ergebnis eines select sein ("Subselect") 17 19 1.4.2 SQL-DML (5) 1.4.2 SQL-DML (7) Ändern von Datensätzen Löschen von Datensätzen DELETE FROM produkt WHERE preis > 3; UPDATE hersteller SET name = ’Soennecken’, stadt = NULL WHERE hnr = ’H3’; Ergebnis: pnr# name P1 P2 Pritt Uhu preis 2.50 2.70 hnr H1 H1 Ergebnis: hnr# name stadt H1 H2 H3 Henkel Pelikan Soennecken Düsseldorf Hannover NULL Löschen aller Datensätze DELETE FROM produkt; TRUNCATE TABLE produkt; 18 Unterschied: truncate nicht in Transaktion 20 Dalitz DBS Kap1.4 1.4.2 SQL-DML (8) 1.4.2 SQL-DML (10) Selektion von Daten Demonstrationsbeispiele SELECT name, preis FROM produkt where preis > 3; SELECT * FROM produkt; SELECT name AS "Name", preis AS Brutto FROM produkt; Project pnr# P1 P2 P3 Restrict P4 name preis hnr Pritt Uhu Tinte Füller 2.50 2.70 3.20 12.98 H1 H1 H2 H2 SELECT ’bla’, name FROM produkt WHERE name > ’S’; SELECT ’bla’ FROM produkt; 21 23 1.4.2 SQL-DML (9) 1.4.2 SQL-DML (11) Die Spaltenauswahl Operatoren in where-Klausel Stern (*) ist Abkürzung für alle Spalten SELECT * FROM produkt; Operator Beschreibung =,>,<,>=,<= gleich, größer, kleiner Umbenennung Spalten des Ergebnisses möglich SELECT name AS "Name", preis AS "Brutto" FROM produkt; <> ungleich, Postgres: auch != BETWEEN x AND y Bereichsprüfung LIKE Pattern matching mit Wildcards _ (ein Zeichen), % (beliebig viele) SIMILAR TO Pattern matching mit Posix 1003.2 regulären Ausdrücken (SQL3) Auch Konstanten können selektiert werden SELECT ’bla’, name FROM produkt; IS (NOT) NULL Prüfung, ob Feld (nicht) leer ist 22 Verknüpfung von Bedingungen mit AND und OR Negation mit NOT 24 Dalitz DBS Kap1.4 1.4.2 SQL-DML (12) 1.4.2 SQL-DML (14) Behandlung von NULL-Werten normale SQL-Funktionen NULL-Werte werden weder durch "=" noch durch "<>" oder "!=" erwischt Typumwandlung kompatibler Datentypen mit cast : explizites Prüfen mit "IS NULL" nötig CAST (preis AS FLOAT) dreiwertige Logik: true, false, unknown Bemerkungen: Insbesondere ist z.B. das Gegenteil von feld1 > 2 nicht "feld1 <= 2", sondern (feld1 <= 2) OR (feld1 IS NULL) bitte absurde Syntax beachten: "AS" statt "," Beispiel für Unstrukturiertheit von "S"QL die meisten DBS führen auch implizite Casts durch z.B. castet Postgres ’...’ - Konstanten nach Bedarf Empfehlung: keine optimistischen Annahmen machen! 25 27 1.4.2 SQL-DML (13) 1.4.2 SQL-DML (15) SQL-Funktionen Cast kann mehrdeutig sein: SQL kennt zwei Klassen von Funktionen: CAST (’01.02.02’ AS DATE) Ergebnis abhängig vom eingestellten Datumsformat (Parameter des Servers oder der Client-Session): 01. Februar 2002 02. Januar 2002 02. Februar 2001 "normale" Funktionen werden auf einzelne Argumente angewandt Typumwandlung, binäre Operatoren, Stringfunktionen, Datumsfunktionen, ... Aggregatfunktionen werden auf komplette Spalte einer Query angewandt Maximum, Summe, Mittelwert, Anzahl, Auswahl verschiedener Werte (distinct), ... Lösung: Formatierte Umwandlung mit to_date Analog: to_char, to_number, to_time(stamp) 26 28 Dalitz DBS Kap1.4 1.4.2 SQL-DML (16) 1.4.2 SQL-DML (18) Datumsformatierung Zahlenformatierung to_date (’01.02.02’, ’DD.MM.YY’) to_char (einfuehrung, ’DD.MM.YYYY’) to_number (’11-’, ’99S’) to_char (preis, ’099.99’) Formatkennzeichen Beschreibung Formatkennzeichen Beschreibung YYYY, YY MM Month, Mon DD, DDD D HH24, HH am MI, SS Jahr vierstellig, zweistellig Monat (01-12) Monat als Text (”Januar”, ”Jan”) Tag des Monats (01-31), Jahres (001-366) Tag der Woche (1-7, Sonntag=1) Stunde (00-23), (01-12) mit am/pm Minute (00-59), Sekunde (00-59) 29 9 0 S PL . , D G Ziffer ohne führende Nullen Ziffer mit führender Null Minus-Zeichen bei negativen Zahlen Minus- oder Plus-Zeichen Dezimalpunkt und Tausendergruppe Dezimalpunkt und Tausendergruppe unter Berücksichtigung von locale 1.4.2 SQL-DML (17) 1.4.2 SQL-DML (19) Beispielabfrage: Überblick aller seit 1982 eingeführten Produkte Stringfunktionen 30 31 Funktion Beschreibung str1 || str2 lower(str), upper(str) substr(str, pos, len) substring(str FROM pos FOR len) trim(str [, chars]) trim([chars] FROM str) translate(str, from, to) String Concatenation Conversion to lower, upper case Extraktion Teilstring (pos0=1) abstruse SQL2 Syntax vorn und hinten abschneiden SQL2 Syntax Character Translation Beispiel: SELECT upper(name) || ’ kostet ’ || trim(to_char(preis,’99D99’)) || ’ EUR.’ AS "Preisliste" FROM produkt; 32 Dalitz DBS Kap1.4 1.4.2 SQL-DML (20) 1.4.2 SQL-DML (22) Mathematische Funktionen Überblick Aggregatfunktionen Funktion Beschreibung Aggregatfunktion Beschreibung + - * / abs(x) trunc(x [, n]) round(x [, n]) arithmetische Operatoren Absolutwert abschneiden auf n Nachkommastellen runden auf n Nachkommastellen count() min(), max() sum(), avg() Anzahl Minimum, Maximum Summe, Mitelwert Bemerkungen: Datumsfunktionen Funktion Beschreibung current_date current_timestamp age([ts1,] ts2) extract(feld FROM ts) Aktuelles Datum oder Uhrzeit SQL3: keine Klammern! Intervall ts1 - ts2 Feldextraktion (z.B. year) Bei "Stern" Aufrufmodus wird keine Spalte angegeben => nur bei count sinnvoll Außer bei count wird NULL zurückgegeben, wenn nichts selektiert wurde Insbesondere gibt sum dann nicht 0 zurück, sondern NULL (kann bei Bedarf mit case umgangen werden) 33 35 1.4.2 SQL-DML (21) 1.4.2 SQL-DML (23) Aggregatfunktionen Sortieren und Gruppieren Sortierung mittels order by: Berechenen einen Wert aus kompletter Spalte eines Abfrageergebnisses (z.B. Maximum) SELECT name, preis FROM produkt ORDER BY name ASC; Aufrufmodi Berücksichtigung aller not null Werte aggregate_func (expression) aggregate_func (ALL expression) Berücksichtigung verschiedener not null Werte aggregate_func (DISTINCT expression) Berücksichtigung sämtlicher (incl. NULL) Werte aggregate_func ( * ) Bemerkungen: Modifier asc (default) oder desc für Sortierreihenfolge Sortierspalte muss in Spaltenliste vorkommen mehrere Spalten in order by durch Komma trennen statt Spaltenname kann auch Index in vorheriger Spaltenliste verwendet werden (order by 1) 34 36 Dalitz DBS Kap1.4 1.4.2 SQL-DML (24) 1.4.2 SQL-DML (26) Gruppierung mittels group by Demonstration where versus having: Frage: Welcher Hersteller stellt wieviele Produkte her? SELECT hnr, count(*), max(preis) FROM produkt WHERE preis > 5 GROUP BY hnr; Antwort: SELECT hnr, count(pnr) FROM produkt GROUP BY hnr; SELECT hnr, count(*), max(preis) FROM produkt GROUP BY hnr HAVING max(preis) > 5; Bemerkungen: ohne group by ist Abfrage fehlerhaft (Warum?) pnr muss aggregiert werden, da verschiedene Werte innerhalb einer Gruppe auftreten können Gruppierspalte muss in Spaltenliste auftauchen 37 39 1.4.2 SQL-DML (25) 1.4.2 SQL-DML (27) Ergebniseinschränkung mittels having: Joins Frage: Welche Hersteller haben höchstens zwei Produkte? Wunsch: Produktliste mit Herstellername statt hnr Antwort: SELECT hnr, count(*) FROM produkt GROUP BY hnr HAVING count(*)<=2; Naiver Ansatz Bemerkung: Bedingung in where-Klausel nicht möglich liefert nicht gewünschtes Ergebnis (Warum?) SELECT hersteller.name, produkt.name FROM produkt, hersteller ORDER BY 1,2; Lösung: Join über gemeinsame Spalte hnr where-Bedingung wird vor Gruppenbildung angewandt Aggregatfunktionen in where-Klausel sinnlos 38 40 Dalitz DBS Kap1.4 1.4.2 SQL-DML (28) 1.4.2 SQL-DML (30) Union, Intersect, Except SELECT hersteller.name, produkt.name FROM produkt, hersteller WHERE produkt.hnr = hersteller.hnr ORDER BY 1,2; Kombination von Abfragen mit selben Ergebnisspalten durch Mengenoperationen Union - Vereinigungsmenge Intersect - Schnittmenge Except - Differenzmenge Bemerkungen: Verbundspalte muss selben Typ haben (ggf. casten) Tabellen können über Aliasnamen referenziert werden SELECT a.name, b.name FROM hersteller a, produkt b ... keine Doubletten im Ergebnis mittels select distinct ... Hierbei handelt es sich um einen Inner Join: Ergebnis enthält nur Sätze, die in beiden Tabellen vorkommen. Im Beispiel fehlt also "Brause". Achtung: Tatsächlich Mengenoperationen, dh. Doubletten werden entfernt! Wenn unerwünscht, Modifier ALL verwenden 41 1.4.2 SQL-DML (29) 43 1.4.2 SQL-DML (31) Beispiel Outer Join SELECT ’Max’ AS max(preis) AS FROM produkt UNION SELECT ’Min’ AS min(preis) AS FROM produkt; SELECT hersteller.name, produkt.name FROM hersteller /* statt Komma: */ LEFT OUTER JOIN produkt ON hersteller.hnr = produkt.hnr; Bemerkungen: Schlüsselwort OUTER ist optional Modifier LEFT, RIGHT oder FULL bestimmt, welche Tabelle vollständig ausgewertet werden soll Mehrere Join-Spalten durch AND in ON-Klausel kombinieren Zusätzliche WHERE-Klausel kann nach ON-Klausel folgen " ", "Wert" " ", "Wert" Bemerkungen: Selektierte Spalten müssen selben Typ haben Spaltenalias ist nicht zwingend erforderlich, aber für Überschrift sinnvoll 42 44 Dalitz DBS Kap1.4 1.4.2 SQL-DML (32) 1.4.2 SQL-DML (34) Subqueries Verwendung Subquery in where-Klausel: Vergleich mit "=", wenn Subquery genau einen Wert zurückliefert Ergebnis einer Abfrage kann als Unterabfrage (engl. subquery) anstelle einer Tabelle verwendet werden Vergleich mit "IN", wenn Subquery mehrere Werte zurückliefern kann SELECT x.nr FROM ( SELECT nr, name FROM produkt WHERE preis > 5.0 ) x; Alternative zu "IN" ist Formulierung über "EXISTS" als correlated Subquery Bemerkungen: x ist Bezeichner für die von Subquery zurückgegebene Tabelle die Klammern (...) und der Name x um die select-Anweisung wirken als Tabellenkonstruktor einer neuen Tabelle x Bemerkung: Die exists Variante ist oft dramatisch schneller 45 47 1.4.2 SQL-DML (33) 1.4.2 SQL-DML (35) Wenn die Subquery nur eine Spalte selektiert, kann das Ergebnis einer Abfrage auch innerhalb einer where-Bedingung verwendet werden: IN versus EXISTS SELECT * FROM hersteller WHERE hnr IN ( SELECT hnr FROM produkt WHERE preis > ’3.0’ ); SELECT * FROM produkt WHERE preis = (SELECT max(preis) FROM produkt); Bemerkungen: Abfrage select *, max(preis) from produkt; nicht möglich (Warum?) hier kein Tabellenkonstruktor, weil Ergebnis nicht als Tabelle verwendet wird Verwendung in where-Klausel von update, delete genauso 46 SELECT * FROM hersteller WHERE EXISTS ( SELECT hnr FROM produkt WHERE preis > ’3.0’ AND produkt.hnr = hersteller.hnr ); 48 Dalitz DBS Kap1.4 1.4.2 SQL-DML (36) 1.4.3 SQL-DCL (1) Data Control Language für Datenschutz/-sicherheit: SELECT * FROM hersteller WHERE EXISTS ( SELECT hnr FROM produkt WHERE preis > ’3.0’ AND produkt.hnr = hersteller.hnr ); Sicherheit vor fehlerhaften Zugriffen Stichwort "Transaktionen" SQL-Kommandos: begin, commit, rollback Bemerkungen: Schutz vor unberechtigten Zugriffen exists-Bedingung ist wahr, wenn Subquery irgendein Ergebnis liefert. Was die Subquery selektiert, ist egal. Insbesondere könnte innere Abfrage auch lauten: (select ’ ’ from produkt ...) Stichwort "Benutzerrechte" SQL-Kommandos: grant, revoke Vor allem wichtig im Mehrbenutzerbetrieb dh. bei Client-Server Datenbanken Correlated Subquery: Innerhalb der Subquery wird eine Tabelle der äußeren Abfrage referenziert (im Beispiel: hersteller) 49 51 1.4.2 SQL-DML (37) 1.4.3 SQL-DCL (2) ALL und ANY Transaktionen Vergleichsoperationen wenn Subquery mehrere Tupel zurückgibt Stand Konto A x Bedingung muss auf alle Treffer passen: SELECT * FROM produkt WHERE preis >= ALL ( SELECT preis FROM produkt ); Bedingung muss auf mindestens einen Treffer passen: SELECT * FROM produkt WHERE preis > ANY ( SELECT preis FROM produkt ); Stand Konto B y UPDATE konto SET stand=stand−500 WHERE nr=’A’ x − 500 Inkonsistenter Zustand y UPDATE konto SET stand=stand+500 WHERE nr=’B’ 50 x − 500 y + 500 52 Dalitz DBS Kap1.4 1.4.3 SQL-DCL (3) 1.4.3 SQL-DCL (5) Transaktionen erfüllen ACID-Prinzip Benutzerrechte Atomicity DBS hat eigene Benutzerverwaltung Transaktion ist Einheit: Alles oder Nichts. Consistency Anlage mit CREATE USER ... Ändern mit ALTER USER ... Transaktion überführt kosistenten Zustand in konsistenten Zustand. Innerhalb Transaktion Inkonsistenz möglich. Isolation Kommandos sind nicht standardisiert. Beispiel Passwortänderung: Änderungen in einer Transaktion sind bis zum Abschluss unsichtbar für andere Transaktionen. Oracle: ALTER USER usr IDENTIFIED BY ’pwd’; PostgreSQL: ALTER USER usr WITH PASSWORD ’pwd’; Durability Nach Abschluss Transaktion bleiben Änderungen bestehen, auch im Fall eines folgenden Systemabsturzes Auch Zuweisung Admin-Recht (DBA) systemspezifisch 53 55 1.4.3 SQL-DCL (4) 1.4.3 SQL-DCL (6) SQL-Kommandos für Transaktionen Der Anleger einer Tabelle ist ihr Owner. Sonst kann keiner auf die Tabelle zugreifen. BEGIN [WORK] BEGIN [TRANSACTION] COMMIT ROLLBACK Start einer Transaktion Achtung: ggf. implizit (Oracle) Abschluss Transaktion mit Übernahme der Änderungen Abschluss Transaktion ohne Übernahme der Änderungen Wenn auch andere User die Tabelle nutzen sollen, muss der Owner ihnen Privileges erteilen: GRANT SELECT ON produkt TO PUBLIC; GRANT UPDATE ON produkt TO peter; Bemerkung: In Oracle und SQL2 beginnt Transaktion implizit mit jedem "transaction-initiating" Kommando Die meisten anderen DBS (auch PostgreSQL) machen dagegen ein auto-commit nach jedem Statement, wenn nicht explizit eine längere Transaktion mit BEGIN gestartet wird Privileges werden erteilt mit GRANT ... TO ... und entzogen mit REVOKE ... FROM ... 54 56 Dalitz DBS Kap1.4 1.4.3 SQL-DCL (7) Ausblick Überblick Privilegien: SQL-Befehle können interaktiv über SQL-Interpreter eingegeben werden (Oracle: sqlplus, Postgres: psql) Privileg Berechtigung SELECT INSERT UPDATE DELETE ... Lesen Einfügen neuer Sätze Ändern bestehender Sätze Löschen weitere Rechte je nach DBS z.B. rule, references, trigger Metakommandos Befehle an den Interpreter In psql durch Backslash gekennzeichnet, z.B \d (describe), \i (import script), \set (set psql option) Liste aller Metakommandos: man psql SQL-Kommandos werden an den Datenbankserver weitergereicht Vereinfachungen: ALL kann für alle Privilegien verwendet werden PUBLIC kann für alle User verwendet werden 57 Wie greift man aus einem Programm auf DB zu? => nächstes Kapitel 59 1.4.3 SQL-DCL (8) Einfachere Rechteverwaltung mit Groups Anlegen Gruppe mit CREATE GROUP grp; Privilegien dieser Gruppe zuweisen mit GRANT ... TO GROUP grp; User in die Gruppe aufnehmen mit ALTER GROUP grp ADD USER usr; User können aus Gruppe entfernt werden mit ALTER GROUP grp DROP USER usr; 58 Dalitz DBS Kap1.4 1.5 Client Programmierung (1) 1.5 Client Programmierung (3) Interaktive Eingabe von SQL Clientseitige Programmierung DBS liefern SQL-Interpreter mit (Oracle: sqlplus, PostgreSQL: psql) Nicht praktikabel für Endanwender vorherrschende Form der DB-Programmierung Anwendungsprogramm führt nur elementare SQL-Kommandos durch Frage: Wie DB-Zugriffe automatisieren (programmieren)? Ablauflogik wird in anderer Sprache (Host Language, z.B. C++) programmiert Serverseitige Programmierung Frage: Wie können aus Host Language heraus SQL-Kommandos ausgeführt werden? Im DB-Server hinterlegt und von allen Anwendungen genutzt Clientseitige Programmierung SQL-Kommandos werden aus Anwendungsprogramm aufgerufen 1 3 1.5 Client Programmierung (2) 1.5 Client Programmierung (4) Serverseitige Programmierung SQL und Host Language Anwendg. SELECT proc() FROM ... DB DBMS DBS Hauptanwendungsgebiet: Trigger Vorteil: greift unabhängig davon, wie auf die Daten zugegriffen wird (z.B. auch SQL-Interpreter) Beschreibung SQL-Script Batch Aufruf SQL-Interpreter. Keine Einbindung in Host Language. Mischen von SQL und Host Language. Präprozessor übersetzt exec sql Statements. Routinen in Host Language, SQL-Kommando ggf. als Parameter. Natives CLI: auf konkretes DBS zugeschnittene Bibliothek, z.B. oci (Oracle), libpq (Postgres) Abstraktes CLI: DBS-unabhängige abstrakte Bibliothek. Für konkretes DBS “Treiber” nötig. Beipiele: odbc, bde, perl-dbi embedded SQL (ESQL) Call Level Interface (CLI) proc() stored Procedure Methode 2 4 Dalitz DBS Kap1.5 1.5 Client Programmierung (5) 1.5.1 SQL-Script (2) Typische Einsatzgebiete Alternative: "Fernsteuerung" des SQL-Interpreters durch Umlenkung von stdin Schnittstelle Einsatzgebiet SQL-Script Einfache Administrative Aufgaben, z.B. User anlegen, DB-Schema einspielen DB-unabhängige Massensoftware, z.B. Office-Pakete cron-gesteuerte Serverprozesse, als CGI-Script in Web-Programmierung Implementierung eigener abstrakter Interfaces, DBS-spezifische Tools, Individualsoftware, Programmierung Treiber für abstrakte CLI’s ODBC Perl-DBI ESQL native CLI’s In der Shell: #!/bin/sh psql <<EOF /* SQL-Kommandos */ EOF Im C-Programm: unter Unix mit popen() (Einweg-Pipe) oder pipe() + fork() + dup2() + exec() (Zweiwege-Pipe) unter Windows NT/2000/XP mit CreatePipe() + DuplicateHandle() + CreateProcess() + CreateThread() 5 7 1.5.1 SQL-Script (1) 1.5.1 SQL-Script (3) SQL-Interpreter wie psql können nicht nur interaktiv verwendet werden: Nachteile keine Kontrollflusssteuerung (nur SQL) Fehlerbehandlung schwierig Ausführen einer externen Datei (z.B. script.sql) mit SQL-Kommandos Kann umgangen werden bei psql -c Kontrollfluss durch Shell-Befehle Abfragen des Exit-Codes möglich Aber: großer Overhead, da pro SQL-Befehl ein Aufruf von psql innerhalb psql-Session mit Metakommando: \i script.sql mit entsprechender Aufrufoption: psql -f script.sql script.sql kann auch Metakommandos enthalten Übergabe eines SQL-Kommandos als Kommandozeilenparameter => Einsatz begrenzt auf einfache Aufgaben Beispiel: psql -c "truncate table produkt;" 6 8 Dalitz DBS Kap1.5 1.5.1 SQL-Script (4) 1.5.2 natives CLI (2) Beispiel: dropuser von PostgreSQL Erzeugung Clientprogramm: #!/bin/sh Source Code # (...) # Commandline Parsing schaufelt # zu löschenden User in Variable $DelUser psql $PSQLOPT -d template1 -c "DROP USER $DelUser" pgm.c #include Object Code pgm.o Linker exit 0 pgm 9 1.5.2 natives CLI (1) 1.5.2 natives CLI (3) Call Level Interface Konkrete Schritte der Programmierung: Zugriff über vom DBS-Hersteller bereitgestellte Bibliotheksroutinen (Oracle: oci, Postgres: libpq) Executable 11 Source Code in Editor erstellen Funktionsprototypen mit #include <libpq-fe.h> einbinden Zu Object Code compilieren Client− programm PQconnectdb PQexec Header libpq.a oder libpq.so Library Compiler # Abfragen Exitcode if [ "$?" -ne 0 ]; then echo "deletion of user \"$DelUser\" failed" 1>&2 exit 1 fi libpq−fe.h PostgreSQL Serverprozess gcc -c -I/usr/include/pgsql pgm.c "/usr/inlude/pgsql" ist Verzeichnis mit Postgres-Headern ... Mit libpq linken gcc -o pgm pgm.o -L/usr/lib/pgsql -lpq "/usr/lib/pgsql" ist Verzeichnis mit Postgres-Libraries libpq 10 12 Dalitz DBS Kap1.5 1.5.2 natives CLI (4) 1.5.2 natives CLI (6) Klassifikation libpq-Routinen: Beispiel Verbindungsaufbau, -abbau Verbindungsaufbau, -abbau PQconnectdb(), PQfinish(), PQstatus() PGconn* conn; Ausführen von SQL-Statements PQexec(), PQresultStatus(), PQcmdTuples(), PQclear() /* Login */ conn = PQconnectdb("dbname=db user=usr ..."); Verarbeiten von Abfrageergebnissen PQntuples(), PQgetvalue(), PQgetlength() /* Fehlerprüfung */ if (PQstatus(conn) == CONNECTION_BAD) { /* ... */ } Wie die ANSI C stdio-Bibliothek ist libpq eine mit C-Mittlen realisierte objektorientierte Bibliothek /* (...) */ Funktionsparameter zuvor konstruierte Strukturen Destruktoren müssen selbst aufgerufen werden /* Logout */ PQfinish(conn); 13 15 1.5.2 natives CLI (5) 1.5.2 natives CLI (7) Hauptobjekte in libpq: Beispiel Non-Select Datentyp PGconn PGresult Konstruktor PQconnectdb() PQexec() Destruktor PQfinish() PQclear() PGconn *conn; PGresult *res; /* Absetzen SQL-Statement */ res = PQexec(conn, "DELETE FROM produkt WHERE preis>’3.0’"); PGconn PQconnectdb() PGresult PQexec() PQgetvalue() pgm SQL Variable if (PQresultStatus(res) == PGRES_COMMAND_OK) { /* Rückmeldung Auswirkungen */ printf("%s Sätze gelöscht\n", PQcmdTuples(res)); } else { /* Fehlerbehandlung */ } PQfinish() PQclear() 14 /* Speicher freigeben nicht vergessen! */ PQclear(res); 16 Dalitz DBS Kap1.5 1.5.2 natives CLI (8) 1.5.3 abstraktes CLI (1) Beispiel Select abstraktes Call Level Interface Zugriff über DBS-unabhängige Bibliotheksroutinen passender "Treiber" wird zur Laufzeit vom "Treiber-Manager" geladen PGconn *conn; PGresult *res; /* Absetzen SQL-Statement */ res = PQexec(conn, "SELECT usename FROM pg_user"); Clientprogramm if (PQresultStatus(res) == PGRES_TUPLES_OK) { /* Ausgabe Ergebnisse */ for (i = 0; i < PQntuples(res); i++) printf("%2d. %s\n", i+1, PQgetvalue(res,i,0)); } else { /* Fehlerbehandlung */ } /* Speicher freigeben nicht vergessen! */ PQclear(res); SQLFetch SQLGetData DB−Server ... odbc−lib Treiber Manager 17 ODBC Treiber 1.5.2 natives CLI (9) 1.5.3 abstraktes CLI (2) weiterführende Literatur zu libpq: Vorteile natives CLI 19 Programm läuft (im Prinzip) mit beliebigem DBS Aber: ggf. abhängig vom SQL-Dialekt keine Bindung an konkretes DBS zur Compilezeit => geeignet für Massensoftware (z.B. Office-Pakete) kann auch ohne DBS verwendet werden: z.B. gibt es Perl-DBI Treiber für Text Files Hartwig: PostgreSQL - Professionell und praxisnah Kapitel 9.1 (Semesterapparat TWY Hart) PostgreSQL Programmer’s Guide: Client Interfaces - libpq. Im PG-Paket enthalten. Online verfügbar unter http://www.postgresql.org/docs/ Nachteile kleinster gemeinsamer Nenner fortgeschrittene DBS-Features nicht nutzbar langsamer als direkt natives CLI erfordert Infrastruktur und Konfiguration im Einzelfall doch Fallunterscheidung DBS nötig Beispiel: implizite Transaktionen in Oracle Hartwig beschreibt auch die C++ Bibliothek libpq++. Achtung: Informationen sind veraltet! 18 20 Dalitz DBS Kap1.5 1.5.3 abstraktes CLI (3) 1.5.3 abstraktes CLI (5) Überblick Abstraktion Open Database Connectivity (ODBC) Java Database Connectivity (JDBC) Borland Database Engine (BDE) Perl Database Interface (DBI) Host Language C Visual Basic Java Object Pascal C++ Perl Single Tier Hersteller Microsoft offener Standard Sun offener Standard Borland Multiple Tier Programm SQL SQL ODBC Treiber ODBC Treiber SQL Imple− mentierung Tim Bunce offener Standard Wir schauen uns konkret an: ODBC (prinzipieller Aufbau) Perl-DBI (Praktikumsaufgabe) Programm SQL DBMS DB DB 21 1.5.3 abstraktes CLI (4) DBS 23 1.5.3 abstraktes CLI (6) verbreitete ODBC-Irrtümer ODBC Data Sources ODBC ist nur für Windows-Programme Abstraktion Verbindungsparameter Infrastruktur gibt es für Win32, Unix, MacOS, OS/2 ODBC-Treiber aber oft vom DBS-Hersteller nur für Win32 mitgeliefert => Treiber von Drittanbieter beziehen zu verwendender ODBC-Treiber Treiber-spezifische Parameter (z.B. pghost, pgdatabase, ...) einem Satz Verbindungsparameter wird ein Data Source Name (DSN) zugewiesen ODBC ist langsam unzulässige Verallgemeinerung der Erfahrungen mit Access + VisualBasic (historisch erste ODBC-Umgebung) nicht gültig für "Multiple-Tier" Treiber, da dabei die ODBC-Abstraktionsschicht nur geringer Overhead ist statt Parameter beim Login zu übergeben, gibt das Anwendungsprogramm den DSN an Zuordnung DSN zu Parametern: Single Tier: Treiber implementiert SQL-Abfragen Multiple Tier: Treiber reicht SQL an DBS weiter hinterlegt in Datei (Unix) oder Registry (Win32) ODBC-Infrastruktur stellt Config-Tool(s) bereit 22 24 Dalitz DBS Kap1.5 1.5.3 abstraktes CLI (7) 1.5.3 abstraktes CLI (9) Vereinfachtes Beispiel ODBC-Connection: DSN-Konfiguration SQLHENV long SQLHDBC sqlenv; rc; sqlconn; /* Handle ODBC environment */ /* result of functions */ /* Handle connection */ /* 1. Allocate Environment Handle and register Version */ rc = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&sqlenv); rc = SQLSetEnvAttr(sqlenv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); /* 2. Allocate Connection Handle, set Timeout */ rc = SQLAllocHandle(SQL_HANDLE_DBC, sqlenv, &sqlconn); SQLSetConnectAttr(sqlconn, SQL_LOGIN_TIMEOUT, (SQLPOINTER*)5, 0); /* 3. Connect to the Datasource "web" */ rc = SQLConnect(sqlconn, (SQLCHAR*) "web", SQL_NTS, (SQLCHAR*) "christa", SQL_NTS, (SQLCHAR*) "", SQL_NTS); /* Typical Errorcheck */ if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO)) { /* Error Handling */ } 25 1.5.3 abstraktes CLI (8) DBS Treiber Manager Treiber Weitergehende ODBC-Features: Anfragen an die Fähigkeiten des Treibers Anfragen an den System Catalog Anfragen über verfügbare Datenquellen und gesetzte Optionen ODBC verwendet eigenen SQL-Dialekt, der in SQL-Dialekt des DBS übersetzt wird kompliziertere SQL-Statements können an DBS "durchgereicht" werden (=> Abhängigkeit von SQL-Dialekt) DSN Konfiguration ODBC Referenzen: System User ODBC Infrastruktur 27 1.5.3 abstraktes CLI (10) Applikation Config Tool(s) /* Free Resources */ SQLFreeHandle(SQL_HANDLE_DBC, sqlconn); SQLFreeHandle(SQL_HANDLE_ENV, sqlenv); Kyle Geiger: Inside ODBC. Microsoft Press 1995 ODBC Infrastruktur für Unix: http://www.unixodbc.org/ Microsoft ODBC Seite: http://www.microsoft.com/data/odbc/ 26 28 Dalitz DBS Kap1.5 1.5.3 abstraktes CLI (11) 1.5.3 abstraktes CLI (13) Was ist Perl? portable Scriptsprache von Larry Wall Mischung aus C, awk und sh Hauptsächlich C mit zahlreichen abkürzenden Notationen zur Emulation von awk => leicht zu schreiben, aber evtl. schwer zu lesen Perl "Crash-Kurs" später => Praktikumsaufgabe An dieser Stelle nur Kurzüberblick: Kommentare von ’#’ bis Zeilenende Variablen haben als erstes Zeichen Typkennung: $bla - skalare Variable @bla - Array Variable %bla - Hash Variable (Array mit Key statt Index) keine weitergehende explizite Typunterscheidung (insbesondere kein int, float, char) ansonsten sehr C-ähnlich: Kommandoabschluss mit ’;’ Blockbildung mit ’{ ... }’ Kontrollflusssteuerung mit if, for, while Meinungen zu Perl: "Practical Extracting and Report Language" "Perl is awk with skin cancer." "Perl wird nicht mehr weiterentwickelt, weil alle Sonderzeichen aufgebraucht sind." 29 31 1.5.3 abstraktes CLI (12) 1.5.3 abstraktes CLI (14) Programme in Scriptsprachen können nicht direkt vom OS ausgeführt werden, sondern brauchen eine Laufzeitumgebung, den Script-Interpreter. Beispiel für Perl Code: # erstelle %list mit Usern und Passwörtern srand(); Aufruf des Perlscripts script: perl script arg1 arg2 ... arg1, ... sind Kommandozeilenargumente für script for ($nr = 1; $nr <= 35; $nr++) { # Username: Prefix "dbs" + laufende Nr $uid = sprintf("dbs%02d", $nr); Unter Unix (oder bei Aufruf aus der Cygwin-Shell) kann script direkt ausführbar gemacht werden: # zufällige Generierung Passwortzeichen $pwd = ""; for ($i = 0; $i < 8; $i++) { $pwd .= chr(int(rand 42) + 48); } als erste Zeile des Scripts einfügen: #!/usr/bin/perl Script ausführbar machen mit: chmod +x script # Zuordnung User => Passwort $list{$uid} = $pwd; Methode geht mit vielen Scriptsprachen (sh, perl, wish) 30 } 32 Dalitz DBS Kap1.5 1.5.3 abstraktes CLI (15) 1.5.3 abstraktes CLI (17) Perl DBI Verbindungsaufbau $dsn = "dbi:Pg:dbname=test;host=dbs;port=5432"; %attr = (AutoCommit => 0, PrintError => 0, RaiseError => 0); Wie bei ODBC braucht der DB-Zugriff mit dem Perl Database Interface (DBI) zwei Komponenten: $dbh = DBI->connect($dsn, "uid", "pwd", \%attr); if (!$dbh) { # Fehlerbehandlung } Die abstrakte DBI-Bibliothek wird als Modul eingebunden mit use DBI; Der Database Driver (DBD) wird dynamisch beim Aufruf der connect Methode geladen DBI->connect("dbi:Pg:", "uid", "pwd"); DBI->connect("dbi:Oracle:", "uid", "pwd"); Parameter $dsn entspricht "Data Source Name" bei ODBC: enthält Treiber + (optional) treiberspezifische Optionen DBI-Attribute %attr können auch direkt angegeben werden: DBI->connect(..., {AutoCommit => 0, ...}) 33 35 1.5.3 abstraktes CLI (16) 1.5.3 abstraktes CLI (18) DBI arbeitet als objektorientierte Bibliothek ähnlich wie libpq mit zwei Objekten: Wichtige DBI-Attribute Objekt $dbh $sth Bedeutung Database handle object Statement handle object Attribut AutoCommit PrintError $dbh RaiseError $sth DBI−>connect $dbh−>prepare $dbh−>disconnect script SQL Attribute werden als Hash-Referenz im vierten Argument bei DBI->connect übergeben: $sth−>fetchrow_array $sth−>execute $sth−>finish @row Bedeutung Nach jedem Statement automatisch Commit (0 = off, 1 = on (default)) Fehler werden automatisch nach stderr ausgegeben (0 = off, 1 = on (default)) Bei Fehler wird Exception (vgl. C++) geworfen (0 = off (default), 1 = on) 34 DBI->connect($dsn, $uid, $pwd, {AutoCommit => 0, PrintError => 0}); 36 Dalitz DBS Kap1.5 1.5.3 abstraktes CLI (19) 1.5.3 abstraktes CLI (21) Beispiel Non-Select Referenzen $sth = $dbh->prepare("delete from produkt"); Online Kurse Perl: http://www.phy.uni-bayreuth.de/~btpa25/perl/perl_inhalt.html http://www.pronix.de/perl/perl.html if (!$sth->execute) { # Fehler printf ("%s\n", $dbh->errstr); } else { # Rückmeldung über Erfolg printf ("%d Zeilen gelöscht\n", $sth->rows); } Offizielle Perl-DBI Dokumentation: http://www.perldoc.com/cpan/DBI.html Die beim DBI mitgelieferte Dokumentation kann mit dem Kommando perldoc DBI wie eine Manpage gelesen werden Bemerkung: Für Non-Select Statements gibt es auch die Methode $dbh->do() (Zusammenfassung von prepare + execute) Beispielprogramm bsp-perldbi auf Homepage 37 39 1.5.3 abstraktes CLI (20) 1.5.4 embedded SQL (1) Beispiel Select Historie historisch erste Möglichkeit, aus Programm SQL-Kommandos abzusetzen 1992 in SQL2-Standard aufgenommen wird von den meisten DBS unterstützt (Oracle: Pro*C, PostgreSQL: ecpg) => ESQL Source Code leicht portabel $sth = $dbh->prepare("select * from produkt"); if (!$sth->execute) { # Fehler printf ("%s\n", $dbh->errstr); } else { # Verarbeitung der Ergebniszeilen while (@row = $sth->fetchrow_array) { # ... } } # meist optional: $sth->finish; Konzept C-Code und SQL-Code werden gemischt SQL-Code wird durch exec sql kenntlich gemacht SQL-Code wird von Präprozessor in C-Code übersetzt 38 40 Dalitz DBS Kap1.5 1.5.4 embedded SQL (2) 1.5.4 embedded SQL (4) Ein Beispiel: Konkrete Schritte der Programmierung: ESQL Source Code in Editor erstellen EXEC SQL BEGIN DECLARE SECTION; int res; EXEC SQL END DECLARE SECTION; Dateinamenskonvention: *.pgc ESQL-Präprozessor aufrufen ecpg pgm.pgc int main() { EXEC SQL CONNECT TO dbname USER uid/passwd; (erzeugt pgm.c) Zu Object Code compilieren gcc -c -I/usr/include/pgsql pgm.c "/usr/inlude/pgsql" ist Verzeichnis mit Postgres-Headern EXEC SQL SELECT COUNT(*) INTO :res FROM pg_user; Mit libecpg und libpq linken printf("Anzahl User: %d\n", res); gcc -o pgm pgm.o -L/usr/lib/pgsql -lecpg -lpq "/usr/lib/pgsql" ist Verzeichnis mit Postgres-Libraries return 0; } 41 1.5.4 embedded SQL (3) 1.5.4 embedded SQL (5) Übersetzen ESQL-Programm: ESQL Code Probleme bei "Zwittercode" pgm.pgc e Präprozessor reiner C Code Object Code ud pgm.o ecpgtype.h ecpglib.h ecpgerrno.h Header l nc Problem Lösung Variablenaustausch Definiton von gemeinsamen Variablen in exec sql declare Abschnitt Laufzeit-Generierung von SQL-Statements Übernahme von Statements aus Variablen mit exec sql prepare (“dynamic SQL”) Navigation in SelectErgebnissen (Tabellen) SQL-Erweiterung: Cursor Fehlerkommunikation globale Variable (structure) sqlca (“SQL Communication Area”) #i libecpg.a libpq.a pgm.c Compiler 43 Library Linker pgm Executable 42 44 Dalitz DBS Kap1.5 1.5.4 embedded SQL (6) 1.5.4 embedded SQL (8) gemeinsame Variablen dynamic SQL Shared Variables werden als C Variablen in der Declare Section deklariert EXEC int char EXEC Shared Variables können auch SQL-Kommandos enthalten. Zum Ausführen zwei Schritte nötig: SQL BEGIN DECLARE SECTION; nr; name[30]; SQL END DECLARE SECTION; Definition SQL Statement-Variable mit prepare strcpy(stmt, "delete from produkt"); EXEC SQL PREPARE sqlstmt FROM :stmt; Verwendung in SQL mit vorangestelltem Doppelpunkt Ausführen der Statements mit execute EXEC SQL EXECUTE sqlstmt; EXEC SQL DELETE FROM produkt WHERE nr=:nr; 45 47 1.5.4 embedded SQL (7) 1.5.4 embedded SQL (9) C- und SQL-Datentyp müssen kompatibel sein Select-Ergebnisse SQL-Typ C-Typ INTEGER NUMERIC CHAR(n), VARCHAR(n) DATE TIMESTAMP int, char[] double, char[] char[n+1] char[12] char[28] Da Select-Statements im allg. Tabellen liefern, sind zwei Fälle bei der Auswertung zu unterscheiden: Ergebnis kann nur aus einer Zeile bestehen => Spaltenwerte können direkt in Shared Variables übergeben werden mit select into Bemerkungen: C-Typ char-Array ist immer möglich wenn SQL-String länger als C-String, wird abgeschnitten (aber Achtung: ggf. fehlt dann Abschluss-Null) Datumstypen vorzugsweise mit to_char, to_date formatieren Ergebnis kann mehrere Zeilen enthalten => einzelne Zeilen müssen mit einem Cursor abgearbeitet werden 46 48 Dalitz DBS Kap1.5 1.5.4 embedded SQL (10) 1.5.4 embedded SQL (12) Single-Row Select Tabellen-Retrieval (2) EXEC SQL BEGIN DECLARE SECTION; char name[256]; EXEC SQL END DECLARE SECTION; /* Deklaration Shared Variables */ EXEC SQL BEGIN DECLARE SECTION; double preis; char einf[12]; EXEC SQL END DECLARE SECTION; /* Cursor Definition */ EXEC SQL DECLARE cursor1 CURSOR FOR SELECT usename FROM pg_user; EXEC SQL OPEN cursor1; /* Füllen Shared Variables in SQL */ EXEC SQL SELECT preis, to_char(einfuehrung,’DD.MM.YY’) INTO :preis, :einf FROM produkt WHERE pnr = ’P1’; /* Loop über Ergebnisse */ EXEC SQL WHENEVER NOT FOUND DO break; while (1) { EXEC SQL FETCH cursor1 INTO :name; printf("%s\n", name); } /* Benutzung Shared Variables in C */ printf("preis: %0.2f; einf: %s\n", preis, einf); 49 /* Cursor Schliessen */ EXEC SQL CLOSE cursor1; 51 1.5.4 embedded SQL (11) 1.5.4 embedded SQL (13) Tabellen-Retrieval (1) Fehlerbehandlung Kommunikation über Erfolg der SQL-Statements über globale Variable sqlca (SQL Communication Area) Definition eines Cursors mit declare cursor und Verknüpfung mit Tabellenausdruck Tabellenausdruck muss Select-Statement oder entspr. SQL Statement-Variable sein bei Cursordefinition wird Statement noch nicht ausgeführt Einbindung mit EXEC SQL INCLUDE sqlca; In C Struktur. Wichtigste Felder: Ausführen des Statements und Positionierung des Cursors vor die erste Zeile mit open sqlca.sqlcode (alternativ Makro: SQLCODE) sqlca.sqlerrm.sqlerrmc Auslesen der Zeilen mit fetch in einer Schleife Fehlercode letztes Statement Fehlermeldung vom DBS Achtung: Struktur von sqlca in SQL2 nicht festgelegt Nur Werte für das Makro SQLCODE sind festgelegt Schließen des Cursors mit close 50 52 Dalitz DBS Kap1.5 1.5.4 embedded SQL (14) 1.5.4 embedded SQL (16) Werte für sqlca.sqlcode bzw. SQLCODE: Verbindungsaufbau und -abbau Wert 0 100 < 0 > 0 6 100 = Bedeutung kein Fehler keine Datensätze gefunden Fehler bei Ausführung Statement konkrete Codes DBS-spezifisch Warnung (z.B. String zu klein) konkrete Codes DBS-spezifisch DB-Login ist in SQL nicht vorgesehen => spezielles ESQL-Statement erforderlich EXEC SQL CONNECT TO db [USER uid[/pwd]]; EXEC SQL DISCONNECT; Parameter db kann DBS-spezifische Erweiterungen unterstützen (z.B. Postgres: dbname[@host]) Bemerkung Fehlerabfrage in SQL2 vereinfacht mit whenever EXEC SQL WHENEVER bedingung aktion; Mögliche bedingung NOT FOUND oder SQLERROR Fügt Abfrage hinter jedes Statement ein und führt ggf. aktion (z.B. DO break) aus Fehlerabfrage über SQLCODE bzw. sqlca.sqlcode 53 1.5.4 embedded SQL (15) 1.5.5 weitere Ansätze (1) Beispiel Fehlerbehandlung Webanwendungen EXEC SQL DECLARE cursor1 CURSOR FOR SELECT usename FROM pg_user; EXEC SQL OPEN cursor1; if (sqlca.sqlcode) { /* Fehler aufgetreten */ printf("%s\n", sqlca.sqlerrm.sqlerrmc); } else { /* Loop über Ergebnisse */ EXEC SQL WHENEVER NOT FOUND DO break; while (1) { EXEC SQL FETCH cursor1 INTO :name; printf("%s\n", name); } } EXEC SQL CLOSE cursor1; 55 normale Client-Server Anwendungen sind session-orientiert: Login -> umfangreiche Verarbeitung -> Logout Webanwendungen sind session-los: einzelne Seiten werden ohne weitere Verpflichtung angefordert => für jeden Seitenaufbau Login großer Overhead Lösung: Persistent Database Connections 54 56 Dalitz DBS Kap1.5 1.5.5 weitere Ansätze (2) 1.5.5 weitere Ansätze (4) Persistent Database Connections Fourth Generation Language (4GL) proprietäre Sprache des DBS-Herstellers, die SQL und GUI-Programmierkonzepte vereinigt (Beispiele: Informix-4GL, Sybase PowerBuilder) child processes Web Client parent process Bezeichnung ist Marketing-Gag durch Gleichsetzung Machinencode=1GL, Assembler=2GL, C etc.=3GL DBS Weiterführung dieser Idee sind spezielle Application Development Frameworks einzelner Hersteller Webserver Voraussetzung: Verarbeitung nicht über CGI sondern Script-Modul 57 Vorteil: Customizing statt Programmierung => niedrige Entwicklungskosten 59 1.5.5 weitere Ansätze (3) Application Server Anwendungen wollen eigentlich gar keinen Datenbank-Zugriff sondern spezielle Funktionen Idee: entwerfe Protokoll für diese Funktionen implementiere dieses Protokoll in eigenem Client-Server Modell Clients greifen über dieses Protokoll auf Application Server zu Application Server implementiert DB-Zugriffe Vorteile: Datenbank-Logik zentral in Application Server einfachere Client-Programmierung 58 Dalitz DBS Kap1.5 2 Datenmodelle 2.1 Überblick (2) Bisher: ANSI/SPARC Architektur Datenbankpraxis externe Ebene Benutzersicht einzelner Endanwender auf die Daten z.B. in Masken des User-Interface manifestiert mehrere Sichten möglich Welche Objekte bietet relationale Datenbank? Wie manipuliert man Datenbank-Objekte? Wie greift man aus Programm auf Datenbank zu? Datenbankstruktur als gegeben betrachtet konzeptionelle Ebene logische Gesamtsicht auf die Daten das umgangssprachliche "Datenmodell" der Anwendung Jetzt: interne Ebene Datenmodellierung physische Datenstruktur auf dem Rechner Wie designt man eine "vernünftige" Datenbankstruktur? Welche Strukturen sind "(un)vernünftig"? Verhältnis zu den Ebenen des Datenbankentwurfs? 1 2.1 Überblick (1) 3 2.1 Überblick (3) Ebenen des Datenbankentwurfs: Benutzer− sichten konzeptionelle Ebene logische Gesamtsicht des Anwenders auf die Daten unabhängig vom eingesetzten DBS-Typ konzeptio− nelle Ebene Implementierungsebene Implementie− rungsebene konzeptionelle Datenstrukturen im Rahmen des eingesetzten DBS bei relationalem DBS z.B. Tabellen physische Ebene physische Ebene konkrete Implementierung der Strukturen im Rahmen des eingesetzten DBS betrachtete Strukturen: Datenblöcke, Zeiger, Indexstrukturen 2 Datenbankentwurf konzeptio− nelle Ebene interne Ebene ANSI/SPARC 4 Dalitz DBS Kap2.1-3 2.1 Überblick (4) 2.1 Überblick (6) Themeneinordnung Anforderungs− Analyse Thema Entwurfsebene 2.2 Relationales Modell: Definition, Normalisierung Implementierungsebene 2.3 Relationales Modell: Redundanzvermeidung, Abhängigkeiten, Normalformen Implementierungsebene 2.4 Semantischer Ansatz Entity/Relationship konzeptionelle Ebene 2.5 Relationale Algebra und relationaler Kalkül Implementierungsebene . . . Speicherstrukturen physische Ebene Funtionale Anforderungen Datenstruktur Anforderungen konzeptionelles Design DBS−unabhängig DBS−spezifisch Implementierung Anwendungs− programmierung physisches Design 5 2.1 Überblick (5) 7 2.1 Überblick (7) Der Entwurfsprozess Entwurfsprozess ist keine Einbahnstraße Anforderungsanalyse im Gespräch mit den zukünftigen Anwendern Ergebnis ist Pflichtenheft umfasst Anforderungen an Datenstruktur und Funktionen konzeptionelles Design Beschreibung der Datenstrukturen auf konzeptioneller Ebene Analyse Implementierung Schritt 1 Schritt 2 Schritt 3 Einsatz Umsetzen konzeptionelles Design in relationales Modell Formulierung in Data Defintion Language (DDL) Aber Faustregel: Kosten für Änderung wachsen exponentiell in Schrittnummer, d.h. 1 Euro Änderungskosten in Analysephase entsprechen 100 Euro in Realisierung physisches Design erfolgt durch DBS aufgrund DDL Anwendungsprogrammierung Umsetzung Funktionen in User-Interface und weitere Programme 6 8 Dalitz DBS Kap2.1-3 2.1 Überblick (8) 2.2.1 Relationen (2) Vorgehen Anforderungsanalyse: Vergleich der Begriffe Relation und Tabelle Identifikation von Organisationeinheiten, Nutzerkreisen und zu unterstützenden Aufgaben Ermittlung zu befragender Personen und Sammlung Anforderungen Filterung der Informationen bzgl. Verständlichkeit Eindeutigkeit; iterative Rücksprache bzw. weitere Befragung Anforderungen klassifizieren bzgl. zu verwaltender Daten und Operationen auf den Daten Formalisieren der Anforderungen in einem Pflichtenheft, das vom fachlichen Projektbetreuer verstanden und bestätigt werden muss relationaler Begriff “Umgangssprache” Relationsschema Tabellendefinition Relation (-szustand, -sinstanz) Tabelle Attribut Spaltenname Domain (Wertebereich) Datentyp Tupel Reihe, Zeile Bemerkungen 9 Eine Relationen variiert mit der Zeit, während das Relationsschema weitgehend konstant bleibt Unterschiede Tabelle und Relation später 2.2 Das relationale Modell 2.2.1 Relationen (3) 2.2.1 Relationen Bestandteile eines Relationsschemas R(A1 :dom(A1 ), A2 :dom(A2 ), . . . , An :dom(An )) Grundbegriffe einer Relation: Wertebereich, Domain Attribut 11 • Relationsname R • Attributliste A1 , . . . , An hnr :char(2) name :varchar(30) stadt :varchar(30) H1 Henkel Düsseldorf H2 Pelikan Hannover Tupel Jedem Attribut Ai ist eine Menge möglicher Werte zugeordnet, die Domain dom(Ai ). Domains können endlich oder unendlich sein. 10 Relationsschema beschreibt Relation mit Namen R. Die Attributanzahl n heißt Grad der Relation. 12 Dalitz DBS Kap2.1-3 2.2.1 Relationen (4) 2.2.1 Relationen (6) Eine Relation r(R) des Relationsschemas R(A1 , .., An ) ist eine endliche Menge von n-Tupeln Relationale Datenbanken und SQL basieren nicht auf Relationen (Mengen von Tupeln), sondern auf ungeordneten Listen (engl. Bags, Multisets), d.h. ti = (x1 , . . . , xn ) mit xj ∈ dom(Aj ) ∪ {NULL} Tupel sind ungeordnet Doubletten sind möglich NULL ist ein spezieller Nullwert. Teilweise erlaubt SQL Wahl (distinct versus all) Eine Relation r können wir also schreiben: r= m [ Vorteile von Bags: {ti } i=1 Für den j-ten Wert xj in Tupel t (dh. für den Wert des 13 Attributs Aj im Tupel t) schreiben wir auch t[Aj ]. 2.2.1 Relationen (5) 15 2.2.1 Relationen (7) Weitere Verallgemeinerung: Umformulierung Relations-Definition: Attributreihenfolge in Relation unerheblich in formaler Defintion Tupel nicht mehr als geordnete Liste von Werten auffassen, sondern als Menge von Attribut/Wert Paaren: Eine Relation r(R) ist eine mathematische Relation n-ten Grades auf den Mengen dom(A1 ), ..., dom(An ). t= D.h. r(R) ist eine Teilmenge des kartesischen Produkts der Wertebereiche: n [ {Ai : xi } wobei xi ∈ dom(Ai ) ∪ {NULL} i=1 Voraussetzung: keine gleichnamigen Attribute in Relation Wir nehmen im Folgenden Attributreihenfolge als egal an, verwenden aber die (einfachere) Listennotation r(R) ⊆ dom(A1 ) × dom(A2 ) × · · · × dom(An ) Wie verhält sich SQL diesbezüglich? Konsequenzen der Definition als Menge: keine Ordnung auf den Tupeln definiert keine zwei identischen Tupel (Doubletten) möglich Eliminierung von Doubletten ist aufwendige Operation => Bags sind deutlich effizienter als Mengen stillschweigendes Verschwinden von Tupeln ist insbes. bei Projektion auf wenige Spalten meist unerwünscht Aggregatfunktionen wie count, avg oft sinnlos auf Mengen gleichnamige Attribute in Relation unzulässig Attribute können in beliebiger Reihenfolge angegeben werden Aber: INSERT ohne Attributnamen gemäß fester Reihenfolge 14 16 Dalitz DBS Kap2.1-3 2.2.1 Relationen (8) 2.2.2 Integrität (2) Notationskonventionen Ein Schlüsselkandidat ist ein minimaler Superkey, d.h. ein Superkey, aus dem kein Attribut entfernt werden kann ohne die Eindeutigkeits-Bedingung zu verletzen. R(A1 , A2 , ..., An ) r(R), r t = (x1 , x2 , ..., xn ) t[Ai ] t[Ai1 , Ai2 , ..., Aik ] Relationsschema n-ten Grades Relationsnamen: Q, R, S Relationszustand. Buchstaben: q, r, s Tupel ∈ r. Buchstaben: t, u, v Wert des Attributs Ai im Tupel t Subtupel (t[Ai1 ], t[Ai2 ], ..., t[Aik ]) Primärschlüssel: im allg. hat Relation mehrere Schlüsselkandidaten ein Kandidat wird als Primärschlüssel ausgewählt Bemerkungen: Weitere Konventionen: Name des Relationsschemas (z.B. hersteller) bezeichne auch aktuelle Tupelmenge (Relationszustand). Dagegen bezeichnet hersteller(hnr, name, stadt) nur das Relationsschema Attribut kann mit Relationsnamen qualifiziert werden mittels Punktnotation, z.B. hersteller.name 17 Primärschlüssel besteht im allg. aus mehreren Attributen gesamtes Tupel (dh. alle Attribute) ist durch Angabe der Primärschlüsselwerte identifiziert Notationskonvention: Primärschlüsselattribute durch angehängtes Doppelkreuz ’#’ kennzeichnen 2.2.2 Integrität (1) 2.2.2 Integrität (3) Primärschlüssel Beispiel: Eine Teilmenge {Ak1 , ..., Akm } von Attributen heißt Schlüsselobermenge (Superkey) des Relationsschemas R, wenn es keine zwei Tupel geben kann, die in allen Werten dieser Attribute gleich sind, d.h. auto ti [Ak1 , ..., Akm ] 6= tj [Ak1 , ..., Akm ] für alle i 6= j amtlkz# fahrgestellnr hersteller modell jahr KR−AD 102 A69352 2000 DU−PW 430 X83554 Beetle KA VW Ford 2001 Fragen: Bemerkungen: Ob die Eindeutigkeits-Bedingung erfüllt ist, kann nur aufgrund der Bedeutung der Attributwerte entschieden werden Jede Relation hat mindestens einen Superkey (Welchen und Warum?) im allgemeinen gibt es mehrere Superkeys 19 Welche Superkeys gibt es? Wieviele Superkeys gibt es? Welche Schlüsselkandidaten gibt es? 18 20 Dalitz DBS Kap2.1-3 2.2.2 Integrität (4) 2.2.2 Integrität (6) Ein Primärschlüssel ist eine Integritätsbedingung für eine einzelne Relation: Beispiel für Fremdschlüssel: hersteller keine zwei Tupel dürfen dieselben Primärschlüsselwerte haben kein Primärschlüsselwert darf NULL sein Neben diesen Entity Integrity Constraints gibt es auch noch Referential Integrity Constraints, die sich auf zwei Relationen beziehen: produkt hnr# name stadt pnr# name H1 H2 Henkel Pelikan Düsseldorf Hannover P1 P2 Pritt Papier preis 2.50 5.30 hnr H1 NULL Fremdschlüssel {hnr} von produkt referenziert hersteller für das Attribut produkt.hnr sind nur die Werte ’H1’, ’H2’ oder NULL zulässig Tupel s = (’P1’, ’Pritt’, 2.50, ’H1’) aus produkt referenziert t = (’H1’, ’Henkel’, ’Düsseldorf’) aus hersteller Tupel mit hersteller.hnr = ’H2’ darf gelöscht werden, Tupel mit hersteller.hnr = ’H1’ nicht erzwingt die Existenz eines Tupels in einer Relation, wenn sich ein Tupel einer anderen Relation darauf bezieht realisiert durch Fremdschlüssel 21 23 2.2.2 Integrität (5) 2.2.2 Integrität (7) Eine Attributmenge F ⊆ {A1 , ..., An } der Relation R1 ist ein Fremdschlüssel von R1 , der die Relation R2 referenziert, wenn gilt: Komponenten eines relationalen Datenbankschemas: Menge von Relationsschemas Menge von Integritätsbedingungen • die Attribute in F haben dieselben Domains wie die Primärschlüsselattribute von R2 mögliche Darstellungen: textuelle Darstellung (z.B. SQL-DDL) grafische Darstellung mit Pfeilen für Fremdschlüssel • die Werte t1 [F ] in einem Tupel t1 ∈ R1 kommen entweder als Primärschlüsselwerte in einem Tupel t2 ∈ R2 vor, oder sie sind alle NULL hersteller hnr# name stadt Wir sagen: “t1 referenziert t2 ”. R1 ist die referenzierende, R2 die referenzierte Relation. 22 produkt pnr# name hnr preis 24 Dalitz DBS Kap2.1-3 2.2.2 Integrität (8) 2.2.2 Integrität (10) Relationales Schema in SQL-DDL Grafische Darstellung Variante 2: Relationsschema als Zeilenvektor CREATE TABLE hersteller ( hnr CHAR(2), name VARCHAR(30), stadt VARCHAR(30), PRIMARY KEY(hnr) ); hersteller hnr# name stadt CREATE TABLE produkt ( hnr CHAR(2), name VARCHAR(30), preis NUMERIC(8,2), PRIMARY KEY(hnr,name), FOREIGN KEY(hnr) REFERENCES hersteller(hnr) ); CREATE TABLE lieferung ( lnr INT, datum DATE, phnr CHAR(2), pname VARCHAR(30), PRIMARY KEY(lnr), FOREIGN KEY(phnr,pname) REFERENCES produkt(hnr,name) ); produkt hnr# name# preis lieferung lnr# datum phnr pname 25 27 2.2.2 Integrität (9) 2.2.3 Normalisierung (1) Grafische Darstellung Variante 1: Relationsschema als Spaltenvektor Relationales Modell nach Codd (1970): hersteller produkt lieferung hnr# name stadt hnr# name# preis lnr# datum phnr pname Domains enthalten nur atomare Werte Attributwert ist Einzelwert aus Domain Ein relationales Modell mit dieser Eigenschaft ist in erster Normalform (1NF). Da diese Bedingung Teil der Definition des relationalen Modells ist, ist ein relationales Schema immer in 1NF. Notationen: Darstellung ähnelt UML-Klassendiagramm Primärschlüssel durch Doppelkreuz (#) Fremdschlüssel durch Pfeil zum referenzierten Schlüsselattribut bei zusammengesetzten Schlüsseln mehrere Pfeile (Warum?) Das Umformulieren eines Schemas derart, dass die erste Normalform erfüllt ist, heißt Normalisierung. 26 28 Dalitz DBS Kap2.1-3 2.2.3 Normalisierung (2) 2.2.3 Normalisierung (5) Unzulässig in 1NF: Lösung 1: hersteller hnr# H1 name adresse branche Henkelstr. 67 {Klebstoff, Wasch− Henkel mittel, Kosmetik} 40191 Düsseldorf Bemerkungen: 29 2.2.3 Normalisierung (3) name H1 Henkel Henkel Henkelstr. 67 40191 strasse plz hnr# branche# H1 H1 H1 Kosmetik Waschmittel Klebstoff ort Düsseldorf hersteller_branche entferne Attribut branche aus Relation hersteller bilde neue Relation hersteller_branche, die branche und den Primärschlüssel von hersteller enthält Primärschlüssel von hersteller_branche ist {hnr, branche} für jede Branche eigenes Tupel in hersteller_branche 31 2.2.3 Normalisierung (6) hersteller hnr# name H1 hersteller adresse besteht aus drei Unterwerten branche ist Menge von Werten, d.h. selber wieder Relation Objektrelationale DBS (z.B. PostgreSQL) erlauben benutzerdefinierte zusammengesetzte Datentypen und Arrays. Erfordert Möglichkeit, eigene Operatoren zu definieren. Achtung: manche Autoren (z.B. Date) lassen frei definierte Datentypen auch im rein relationalen Modell zu Verschachteltes relationales Modell erlaubt Relationen als Werte hnr# Lösung 2: adresse branche hersteller Henkelstr. 67 {Klebstoff, Wasch− 40191 Düsseldorf mittel, Kosmetik} hnr# name Wie kann dieses Schema normalisiert werden? zusammengesetzter Wert für adresse: ersetze adresse durch drei Felder strasse, plz, ort strasse plz ort branche# H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel H1 Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff Füge in hersteller pro branche ein Tupel ein, so dass für einen Hersteller mit n Branchen n Tupel vorhanden sind Der Primärschlüssel von hersteller muss dann erweitert werden zu {hnr, branche} (Warum?) Mehrfachwerte für branche: verschiedene Lösungen möglich 30 32 Dalitz DBS Kap2.1-3 2.2.3 Normalisierung (7) 2.2.3 Normalisierung (9) Lösung 3: Redundanzen und Anomalien hersteller hnr# name strasse H1 Henkel Henkelstr. 67 40191 branche1 plz branche2 Klebstoff Waschmittel Die in Lösung 2 eingeführten Redundanzen sind besonders unerwünscht, weil sie zu Inkonsistenzen bei Änderungen führen (Update-Anomalien) ort Düsseldorf ... ... Das Problem ist, dass bei Änderungen mehrere Tupel verändert werden müssen, wenn die Information nicht inkonsistent werden soll. brancheN NULL Problem betrifft alle Änderungen: möglich, wenn maximale Anzahl Branchen N bekannt ersetze in hersteller das Attribut branche durch die N Attribute branche1, branche2, ..., brancheN bei weniger Branchen Werte mit NULL auffüllen Einfüge-Anomalien Lösch-Anomalien Modifikations-Anomalien 33 2.2.3 Normalisierung (8) 35 2.2.3 Normalisierung (10) hersteller Bewertung der drei Lösungen hnr# name Nachteile von Lösung 3: begrenzt maximale Anzahl Branchen führt Nullwerte ein für Hersteller mit weniger als N Branchen Nachteile von Lösung 2: strasse plz ort branche# H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik H1 Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel H1 Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff Einfüge-Anomalien (1) führt Redundanzen ein: überflüssige Mehrfachspeicherung der Attribute hnr, name, strasse, plz, ort => Speicherplatzverschwendung => Updates kompliziert, da Gefahr der Inkonsistenz Wenn zum Hersteller ’H1’ eine weitere Branche ergänzt werden soll, müssen für name, strasse, plz, ort die passenden Werte eingefügt werden (sonst Inkonsistenz!) Korrektheit dieser Werte lässt sich (außer über Trigger) nicht einfach durch Integrity Constraints erzwingen => keine Garantie für konsistenten Inhalt Lösung 1 ist unbedingt vorzuziehen 34 36 Dalitz DBS Kap2.1-3 2.2.3 Normalisierung (11) 2.2.3 Normalisierung (13) Lösch-Anomalien hersteller Wenn ein Hersteller gelöscht wird, der zufällig als einziger einer bestimmten Branche angehört, werden die Informationen über diese Branche alle mitgelöscht hnr# name Problem betrifft auch Lösung 1 und kann durch Einführung einer Referenztabelle branche gelöst werden hersteller hnr# H1 hnr# H1 H1 H1 bnr# B3 B2 B1 name Kosmetik Waschmittel Klebstoff hnr# H1 H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel H1 Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff 39 Inhaltliche Bedeutung (Semantik) der Relationen und Attribute sollte leicht verständlich sein branche bnr# B3 B2 B1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik H1 Informelle Qualitätsmaße für den Entwurf eines Relationsschemas: name strasse plz ort Henkel Henkelstr. 67 40191 Düsseldorf bnr# B3 B2 B1 H1 2.2.4 Designrichtlinien hersteller hersteller_branche branche# 37 2.2.3 Normalisierung (12) hnr# H1 ort Wenn sich die Adresse des Herstellers ’H1’ ändert, muss sie in allen Tupeln gleich geändert werden eine nicht gleichartige oder nur teilweise Änderung lässt sich nicht automatisch abfangen und abweisen branche bnr# B3 B2 B1 plz Modifikations-Anomalien name strasse plz ort Henkel Henkelstr. 67 40191 Düsseldorf hersteller_branche strasse name Kosmetik Waschmittel Klebstoff Reduzierung redundanter Werte in Tupeln Einfüge-Anomalien (2) Reduzierung der Nullwerte in Tupeln Lösung mit Referenztabelle branche ermöglicht auch das Einfügen von Branchen unabhängig von Herstellern insbesondere wird es dadurch möglich, Branchen einzufügen, denen noch kein Hersteller zugeteilt ist Verhinderung der Erzeugung "unechter" Tupel 38 40 Dalitz DBS Kap2.1-3 2.3 Normalformen (1) 2.3.1 Abhängigkeit (1) Bei Normalisierung enstanden Modelle mit selbem Informationsgehalt, aber unterschiedlicher "Güte": 2.3.1 Funktionale Abhängigkeit Variante 1 hersteller hersteller_branche hnr# name strasse plz ort Variante 2 Eine funktionale Abhängigkeit “X → Y ” zwischen zwei Attributmengen X, Y eines Relationsschemas R besteht, wenn für beliebige Tupel t1 , t2 ∈ r(R) gilt: hnr# branche# hersteller t1 [X] = t2 [X] hnr# name strasse plz ort branche# Variante 2 führt zu unerwünschten Redundanzen, die Update-Anomalien verursachen Variante 1 hat diesen Nachteil nicht =⇒ t1 [Y ] = t2 [Y ] Die Werte der X-Komponente eines Tupels bestimmen also eindeutig alle Werte der Y -Komponente. Die Y -Werte sind also eine Funktion der X-Werte: Ziele: formale Definition von Redundanzen Kriterien für Redundanzfreiheit 41 t[Y ] = f (t[X]) 43 2.3 Normalformen (2) 2.3.1 Abhängigkeit (2) Redundanz eines Attributs: Ein Attribut ist redundant, wenn einzelne Attributwerte ohne Informationsverlust weggelassen werden können. Beispiel hersteller hnr# name hersteller hnr# name redundante Attribute strasse plz ort Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff ort branche# H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff {hnr, branche} → {name, strasse, ort, plz} {hnr} → {strasse, ort} {hnr, name} → {plz} Es gilt nicht überflüssige Werte Wie können wir Redundanz formal definieren? plz Es gilt branche# H1 strasse {hnr} → {branche} {branche} → {name, plz} 42 44 Dalitz DBS Kap2.1-3 2.3.1 Abhängigkeit (3) 2.3.1 Abhängigkeit (5) hersteller hnr# name strasse plz ort Armstrongs Regeln branche# H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel H1 Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff IR1 Reflexivität: Y ⊆X Bemerkungen (1) X→Y In obiger Beipielrelation gilt {strasse} → {ort} Trotzdem keine funktionale Abhängigkeit 45 2.3.1 Abhängigkeit (4) ⇒ X→Z 47 (Beweis der Regeln an der Tafel) 2.3.1 Abhängigkeit (6) hersteller ort X ∪Z →Y ∪Z X → Y und Y → Z keine beweisbaren Tatsachen erfordert Intuition des Datenbankdesigners plz ⇒ IR3 Transitivität: funktionale Abhängigkeit ist Eigenschaft der Bedeutung (Semantik) der Attributwerte strasse X→Y IR2 Augmentation: funktionale Abhängigkeit ist Eigenschaft des Relationsschemas R und nicht eines Relationszustands r(R) hnr# name ⇒ Anmerkungen zu Armstrongs Regeln: branche# H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel H1 Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff Regeln IR1 und IR2 aus Buch von Elmasri, Navathe sind falsch! Die durch IR1 gegebenen Abhängigkeiten heißen trivial Armstrong hat 1974 gezeigt, dass die Regeln IR1-3 vollständig sind: Wenn man diese Regeln solange auf eine Menge F von funktionalen Abhängigkeiten anwendet, bis keine neuen Abhängigkeiten mehr erzeugt werden, so erhält man alle Abhängigkeiten, die aus F herleitbar sind Bemerkungen (2) Wenn P = {hnr, branche} die Menge der Primärschlüsselattribute ist, dann gilt für jede beliebige Attributmenge X: P → X Aus gegebenen funktionalen Abhängigkeiten lassen sich weitere Abhängigkeiten ohne Kenntnis der Attributbedeutung ableiten Die Menge aller aus F herleitbaren Abhängigkeiten heißt Hülle (Closure) von F (symbolisch F+) z.B. folgt aus {hnr} → {strasse, ort} automatisch {hnr} → {strasse} Für die Ableitung weiterer Abhängigkeiten gibt es Regeln, die sog. Inferenzregeln (Inference Rules) 46 48 Dalitz DBS Kap2.1-3 2.3.1 Abhängigkeit (7) 2.3.1 Abhängigkeit (9) Erste Anwendung Abhängigkeiten: Beispiel: hersteller hnr# name strasse plz ort Schema 1 branche# H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel H1 Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff Schema 2 hersteller hnr# name strasse plz ort branche# hersteller hnr# name strasse plz ort {hnr} → {name} {hnr, branche} → {hnr, name, strasse, plz, ort, branche} 49 Frage: Wann ist Zerlegung verlustfrei (additiver Join)? 2.3.1 Abhängigkeit (8) 2.3.1 Abhängigkeit (10) Weitere, aus IR1-3 ableitbare Inferenzregeln: Theorem (Heath 1971): IR4 Zerlegung: ⇒ IR5 Vereinigung: ⇒ Wenn die funktionale Abhängigkeit A → B gilt, dann ist jeder Relationszustand r(R) gleich dem Join seiner Projektionen über {A,B} und {A,C} X →Y ∪Z IR6 Pseudotransitivität: X → Y und W ∪ Y → Z ⇒ W ∪X →Z Bemerkungen: IR7 Komposition: X → Y und V → W ⇒ X ∪V →Y ∪W (Beweis: IR5+7 an Tafel, IR4+6 Übung) 51 Sei R(A,B,C) ein Relationsschema, wobei A, B und C Attributmengen sind. X → Y und X → Z X → Y und X → Z hnr# branche# Schema 2 kann als Zerlegung von Schema 1 aufgefasst werden Relation von Schema 1 lässt sich aus den Relationen von Schema 2 komplett rekonstruieren: SELECT h.hnr,name,strasse,plz,ort,branche FROM hersteller h, hersteller_branche b [ LEFT OUTER ] JOIN ON h.hnr = b.hnr; Aus {hnr} → {name, strasse, plz, ort} lässt sich nur mit Armstrongs Regeln ableiten (Wie?): X →Y ∪Z hersteller_branche 50 die Bedingung ist hinreichend, aber nicht notwendig äquivalentes Kriterium über mehrwertige Abhängigkeiten (später) Dieses Theorem ist die Grundlage des Normalisierungs-Prozesses 52 Dalitz DBS Kap2.1-3 2.3.1 Abhängigkeit (11) hnr name H1 H1 H2 strasse plz ort 2.3.2 2NF und 3NF (2) NF’s auf Basis projektiver Zerlegung branche Erste Normalform (1NF) Henkelstr. 67 40191 Düsseldorf Kosmetik Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel Henkel Unilever Dammtorwall 15 20355 Hamburg Waschmittel Zerlegung 1 Dritte Normalform (3NF) hst2 hst1 hnr Zweite Normalform (2NF) branche strasse plz ort hnr Boyce−Codd Normalform (BCNF) name Vierte Normalform (4NF) Zerlegung 2 hst3 branche name strasse plz ort hst4 Fünfte Normalform (5NF) nur triviale Verbundabhängigkeiten hnr branche Join von Zerlegung 1 erzeugt wieder Ursprungstabelle Muss laut Heath’s Theorem so sein wegen {hnr} → {name} Join von Zerlegung 2 erzeugt Zusatztupel (Welche?) Bezeichnung in Literatur: "nicht additiver Join" Da Heath’s Theorem nur hinreichende Bedingung angibt, kann das nicht aus fehlender Abhängigkeit gefolgert werden keine mehrwertigen Abhängigkeiten nur Abhängigkeiten vom Schlüssel keine transitiven Abhängigkeiten alle Attribute voll vom Schlüssel abhängig 53 55 beliebige Relation mit atomaren Werten 2.3.2 2NF und 3NF (1) 2.3.2 2NF und 3NF (3) 2.3.2 Zweite und Dritte Normalform Bemerkungen zu den Normalformen: jede Stufe definiert echt strengere Kriterien, d.h. ein Relationsschema in x-NF ist auch in y-NF für alle y < x Normalisierungsprozess Formalismus zum Erkennen von Redundanzen (Normalformtests) Zerlegungsregeln um redundante Schemas durch weniger redundante Schemas zu ersetzen (Randbedingung: additiver Join) Die verschiedenen Normalformen unterscheiden sich durch die Art der Redundanzen, die noch zugelassen werden. Höhere Normalform = strengere Kriterien 2NF, 3NF und BCNF basieren auf funktionalen Abhängigkeiten 4NF und 5NF basieren auf mehrwertigen Abhängigkeiten in der Praxis beschränkt man sich meist auf 3NF bzw. BCNF, da die Abhängigkeiten für 4NF relativ selten sind und die Abhängigkeiten für 5NF schwer zu erkennen sind Denormalisierung es gibt weitere Normalformen, die allerdings nicht (ausschließlich) auf Projektion und Join beruhen, z.B. Domain-Key NF oft werden Redundanzen geduldet. Mögliche Gründe: Performance: Join über viele Tabellen oft zeitraubend Praktikabilität: Anwender hat kein Recht Referenzwerte zu pflegen Zulassung von Redundanzen heißt Denormalisierung 54 56 Dalitz DBS Kap2.1-3 2.3.2 2NF und 3NF (3) redundante Attribute hersteller hnr# name 2.3.2 2NF und 3NF (5) strasse plz ort Beispiel: hst1 branche# H1 Henkel Henkelstr. 67 40191 Düsseldorf Kosmetik H1 H1 Henkel Henkelstr. 67 40191 Düsseldorf Waschmittel Henkel Henkelstr. 67 40191 Düsseldorf Klebstoff hnr# name strasse plz ort branche# hst2 hnr# name strasse plz ort hst3 hnr# branche# überflüssige Werte Fragen: Wodurch kommt Redundanz der Attribute? Formale Definition über funktionale Abhängigkeit möglich? Antwort: redundante Attribute hängen funktional von einem Teil (hnr) des Primärschlüssels (hnr, branche) ab 57 Relation hst1 ist nicht in zweiter Normalform, denn Attribut name hängt von hnr ab, Primärschlüssel ist aber {hnr, branche} Relation hst2 ist in zweiter Normalform, denn der Primärschlüssel enthält nur ein Attribut Relation hst3 ist in zweiter Normalform, denn es gibt keine nicht primären Attribute 2.3.2 2NF und 3NF (4) 2.3.2 2NF und 3NF (6) Definition zweite Normalform (Annahme: nur ein Schlüsselkandidat) Ein Relationsschema, das nicht in 2NF ist, kann in mehrere Schemas in 2NF zerlegt werden 59 a) Fasse alle nicht primären Attribute, die nur von einem Teilschlüssel abhängen, mit diesem Teilschlüssel als Primärschlüssel in einer eigenen Tabelle zusammen. Ein Relationsschema ist in zweiter Normalform (2NF), wenn jedes nicht primäre Attribut voll funktional vom Primärschlüssel abhängt. b) Alle Attribute, die vom selben Teilschlüssel abhängen, müssen in derselben Tabelle zusammengefasst werden. c) Entferne die ausgelagerten nichtprimären Attribute aus der Ursprungstabelle. Erläuterungen: primäre Attribute heißen die Attribute des Primärschlüssels Eine Attributmenge Y heißt von einer Attributmenge X voll funktional abhängig, wenn sie von keiner echten Teilmenge von X abhängt. Tut sie es doch, heißt sie partiell abhängig von X. Bemerkungen: 58 Bedingung a) und Heath’s Theorem gewährleisten additiven Join Bedingung b) nötig, um Verlust von funktionalen Abhängigkeiten zu vermeiden 60 Dalitz DBS Kap2.1-3 2.3.2 2NF und 3NF (7) 2.3.2 2NF und 3NF (9) hst1 Definition Dritte Normalform (Annahme: nur ein Schlüsselkandidat) hnr# name strasse plz ort branche# hst2 hst3 hnr# name strasse plz ort hnr# branche# Zerlegung 1 hst3 hst4 hnr# name strasse plz hnr# ort Zerlegung 2 Ein Relationsschema ist in dritter Normalform (3NF), wenn es in 2NF ist und kein nicht primäres Attribut transitiv vom Primärschlüssel abhängt. hst5 hnr# branche# Bemerkungen: Zerlegung 1 gemäß Regeln a), b) und c) B heißt transitiv abhängig von A, wenn es eine Attributmenge C gibt mit A → C und C → B die beiden Abhängigkeiten bei der Transitivität dürfen nicht trivial (C ⊆ A oder B ⊆ C) sein Zerlegung 2 verletzt Regel b), denn ort und plz hängen vom selben Teilschlüssel hnr ab, sind aber nicht in derselben Relation zusammengefasst => funktionale Abhängigkeit {plz} → {ort} geht verloren beide Zerlegungen erfüllen "additiven Join" 61 63 2.3.2 2NF und 3NF (8) 2.3.2 2NF und 3NF (10) Mit der 2NF werden bestimmte Redundanzen ausgeschlossen. Andere aber nicht: Gelegentlich andere "Definition" in Literatur: hnr# name H1 H2 strasse de Beukelaer Arnoldstr. 62 Polyant Speefeld 7 plz Ein Relationsschema ist in 3NF, wenn es in 2NF ist und kein nicht primäres Attribut von einer Menge anderer nichtprimärer Attribute abhängt. ort Dies ist keine äquivalente 3NF Definition, sondern nur eine notwendige (aber nicht hinreichende!) Bedingung für 3NF 47906 Kempen 47906 Kempen Gegenbeispiel: redundanter Wert Relation ist in 2NF (Warum?) Attribut ort ist redundant Ursache: funktionale Abhängigkeit von nichtprimärem Attribut plz bzw. transitive Abhängigkeit {hnr} → {plz} → {ort} p1# p2# x1 x2 x3 erfüllt obige "Definition" enthält aber transitive Abhängigkeit {p1#,p2#} → {p2#,x1} → {x3} 62 64 Dalitz DBS Kap2.1-3 2.3.2 2NF und 3NF (11) 2.3.2 2NF und 3NF (13) Ein Relationsschema, das nicht in 3NF ist, kann in mehrere Schemas in 3NF zerlegt werden Beispiel: Sprachcode a) Fasse die transitiv abhängigen nicht primären Attribute mit den Attributen, von denen sie direkt abhängen, in einer eigenen Tabelle zusammen. Verlagscode isbn1 isbn2 isbn3 autor titel verlag sprache jahr b) Entferne die ausgelagerten abhängigen Attribute aus der Ursprungstabelle. hst hnr# name strasse plz hst hnr# name Schlüsselkandidat 1 ort plz strasse plz plz# ort 65 2.3.2 2NF und 3NF (12) Schlüsselkandidat 2 Relation buch hat mehrere Schlüsselkandidaten Relation ist in Codd-2NF, da alle Attribute zu Schlüsselkandidaten gehören Relation ist nicht in Kent-2NF, da sprache partiell abhängig ist vom Teil isbn1 der ISBN-Nr 67 2.3.2 2NF und 3NF (14) Verallgemeinerung Definition 2NF auf beliebige Anzahl Schlüsselkandidaten Verallgemeinerung Definition 3NF auf beliebige Anzahl Schlüsselkandidaten Definition 2NF Codd (1971) Definition 3NF Codd Jedes Attribut, das zu keinem Schlüsselkandidaten gehört, ist von jedem Schlüsselkandidaten voll funktional abhängig. 2NF und kein Attribut, das zu keinem Schlüsselkandidaten gehört, ist von einem Schlüsselkandidaten transitiv abhängig. Definition 2NF Kent (1973) Definition 3NF Kent Jedes Attribut im Komplement eines Schlüsselkandidaten ist von diesem Schlüsselkandidaten voll funktional abhängig. 2NF und kein Attribut im Komplement eines Schlüsselkandidaten ist von diesem Schlüsselkandidaten transitiv abhängig. Bemerkungen: Bemerkungen: Definitionen stimmen für nur einen Schlüsselkandidaten überein im allgemeinen Fall ist die Codd-2NF schwächer (d.h. lässt mehr Redundanzen zu) als die Kent-2NF (vgl. Übung 5.1) Definitionen stimmen für nur einen Schlüsselkandidaten überein wieder ist die Codd-3NF schwächer 66 68 Dalitz DBS Kap2.1-3 2.3.2 2NF und 3NF (15) 2.3.3 4NF (1) Boyce/Codd Normalform (BCNF) Mehrwertige Abhängigkeiten Für jede nicht triviale Abhängigkeit X → A ist X ein Superschlüssel der Relation. Betrachte Relation mit mehreren unabhängigen mengenwertigen Attributen (d.h. nicht in 1NF!) Bemerkungen: kette# erfordert keine Überprüfung von 2NF ursprünglich als einfachere Definition der 3NF vorgeschlagen, dann aber nachgewiesen, dass BCNF strenger als 3NF ist: BCNF ⇒ 3NF, aber nicht umgekehrt: A# B# C Relation in 3NF, aber nicht in BCNF Leffers 69 2.3.2 2NF und 3NF (16) fd3 hnr# name ort fd1 hst2 hnr# name plz strasse plz fd4 {Bekleidung} {Dortmund, Hannover} Ersetzen durch skalare Attribute führt zu Redundanzen, die keiner funktionalen Abhängigkeit entsprechen 71 Schlechte Umformung in 1NF: fd2 strasse plz standort 2.3.3 4NF (2) Relation R ist in BCNF, wenn für jede nicht triviale Abhängigkeit X → A die Menge X ein Superschlüssel von R ist. hst1 branche Karstadt {Lebensmittel, {Essen, Bekleidung} Dortmund} kette# branche# standort# Karstadt Karstadt Karstadt Karstadt Leffers Leffers Lebensmittel Lebensmittel Bekleidung Bekleidung Bekleidung Bekleidung Essen Dortmund Essen Dortmund Dortmund Hannover Tabelle ist redundant: pro Kette jede Branche mit jedem Standort kombiniert (nötig, da Branche und Standort unabhängige Eigenschaften) Trotzdem ist die Relation in BCNF (Warum?) plz# ort fd5 Abhängigkeiten fd1 in Relation hst1 sind mit BCNF verträglich Abhängigkeit fd3 auch (Warum?), aber fd2 nicht Relationen hst2 und plz sind in BCNF Brauchen weiteres Kriterium für Redundanz: mehrwertige Abhängigkeiten 70 72 Dalitz DBS Kap2.1-3 2.3.3 4NF (3) 2.3.3 4NF (5) Definition: Die Attributmenge Y ∈ R ist mehrwertig abhängig von der Attributmenge X ∈ R, symbolisch X → →Y , wenn für alle Tupel t1 , t2 mit t1 [X] = t2 [X] Tupel t3 , t4 existieren mit • t3 [X] = t4 [X] = t1 [X] = t2 [X] branche# standort# Lebensmittel Lebensmittel Bekleidung Bekleidung Bekleidung Bekleidung Essen Dortmund Essen Dortmund Dortmund Hannover Anschauliche Bedeutung von X • t3 [Y ] = t1 [Y ] und t4 [Y ] = t2 [Y ] Bemerkungen: !!!! die vier Tupel sind nicht notwendig verschieden wegen der Symmetrie in Definition folgt aus X Y auch X Z. Man schreibt deshalb auch X Y|Z !! !! Y | Z: Das Ergebnis des Statements SELECT DISTINCT Y FROM R WHERE X = ’..’ AND Z = ’..’; ist für alle (vorhandenen) Werte von Z gleich • t3 [Z] = t2 [Z] und t4 [Z] = t1 [Z] wobei Z = R \ (X ∪ Y ) 73 2.3.3 4NF (4) Existieren zwei Tupel mit gleichem X aber unterschiedlichem Y, so müssen diese Y-Werte in getrennten Tupeln für jeden unterschiedlichen Wert von Z wiederholt werden 75 2.3.3 4NF (6) Zu t1 , t2 mit t1 [X] = t2 [X] existieren t3 , t4 mit Triviale mehrwertige Abhängigkeiten • t3 [X] = t4 [X] = t1 [X] = t2 [X] !! wenn Y Teilmenge von X ist oder X ∪ Y = R, folgt automatisch X Y • t3 [Y ] = t1 [Y ] und t4 [Y ] = t2 [Y ] • t3 [Z] = t2 [Z] und t4 [Z] = t1 [Z] wobei Z = R \ (X ∪ Y ) sagt also nichts Wesentliches aus: "triviale" Abhängigkeit Beispiel: kette# branche# standort# Karstadt Karstadt Karstadt Karstadt Leffers Leffers Lebensmittel Lebensmittel Bekleidung Bekleidung Bekleidung Bekleidung Essen Dortmund Essen Dortmund Dortmund Hannover !! kette# Karstadt Karstadt Karstadt Karstadt Leffers Leffers es gilt {kette} {standort} und {kette} es gilt nicht {standort} {kette} !! !! t1 t4 Zusammenhang zu funktionaler Abhängigkeit t3 !! t2 aus X → Y folgt X Umkehrung gilt nicht {branche} 74 Y 76 Dalitz DBS Kap2.1-3 2.3.3 4NF (7) 2.3.3 4NF (9) Theorem (Fagin 1977): Beispiel: Sei R(A,B,C) ein Relationsschema, wobei A, B und C Attributmengen sind. Jeder Relationszustand r(R) ist gleich dem Join seiner Projektionen über {A,B} und {A,C}, genau dann wenn die Abhängigkeit A B | C gilt. !! kette# branche# standort# Karstadt Karstadt Karstadt Karstadt Leffers Leffers Lebensmittel Lebensmittel Bekleidung Bekleidung Bekleidung Bekleidung Essen Dortmund Essen Dortmund Dortmund Hannover !! Relation ist nicht in 4NF, denn es gilt {kette} {standort}, aber weder standort noch branche sind funktional abhängig von kette Bemerkungen: Im Unterschied zu Heath’s Theorem äquivalente Bedingung für "additiven Join" (Heath lieferte nur hinreichende Bedingung) Heath’s Theorem folgt direkt aus diesem Theorem (Warum?) 77 2.3.3 4NF (8) Beispiel ist typisch: die meisten Relationen mit nichttrivialen mehrwertigen Abhängigkeiten enthalten nur Schlüsselattribute 79 2.3.3 4NF (10) Umformung in 4NF: Vierte Normalform (4NF) !! Wenn eine nichttriviale mehrwertige Abhängigkeit A B gilt, dann sind alle Attribute der Relation funktional abhängig von A. Anders ausgedrückt: kette# branche# standort# Karstadt Karstadt Karstadt Karstadt Leffers Leffers Lebensmittel Lebensmittel Bekleidung Bekleidung Bekleidung Bekleidung Essen Dortmund Essen Dortmund Dortmund Hannover kette# Karstadt Karstadt Leffers alle nichttrivialen Abhängigkeiten (mehrwertig oder funktional) sind funktionale Abhängigkeiten von einem Superkey. Somit ist eine Relation in 4NF auch immer in BCNF. 4NF = BCNF und alle mehrwertigen Abhängigkeiten sind funktionale Abhängigkeiten von Schlüsseln. 78 branche# Lebensmittel Bekleidung Bekleidung kette# Karstadt Karstadt Leffers Leffers standort# Essen Dortmund Dortmund Hannover !! Zerlege Relation R=(A,B,C) mit Abhängigkeit A C per Projektion in zwei Relationen R1=(A,B) und R2=(A,C) R1 und R2 sind in 4NF (Warum?) Aufgrund Fagin’s Theorem ist diese Zerlegung additiv 80 Dalitz DBS Kap2.1-3 2.3.3 4NF (11) kette# branche standort Karstadt {Lebensmittel, {Essen, Bekleidung} Dortmund} Leffers {Bekleidung} {Dortmund, Hannover} Mehrwertige Abhängigkeiten hätten früh im Design vermieden werden können bei Umformung in 1NF Faustregel: unabhängige mengenwertige Attribute in separate Relationen trennen! Theorie der 4NF gibt strenge Begründung für diese Faustregel 81 2.3.3 4NF (12) Weitere Normalformen Project-Join Normalform oder 5NF betrachtet "Join Dependencies", das sind Bedingungen bzgl. der projektiven Zerlegung über Attributmengen Verletzungen treten in Praxis selten auf (pathologische Fälle?) und sind schwer zu entdecken => geringe praktische Bedeutung Domain-Key Normalform (DKNF) erfasst beliebige Constraints alle Constraints sollen aus Domain-Constraints und Key-Constraints folgen impliziert 5NF Bedingungen ungeklärt, wann DKNF möglich 82 Dalitz DBS Kap2.1-3 2.4 Semantische Modelle 2.4.1 Semantischer Ansatz (3) 2.4.1 Der semantische Ansatz Basiselemente Semantischer Datenmodelle: Ebenen des Datenbankentwurfs (Wdh.): Entity - unterscheidbares "Real World" Objekt Property - Eigenschaft, die ein Objekt beschreibt Relationship - Zusammenhang zwischen Entities konzeptionelle Ebene logische Gesamtsicht des Anwenders auf die Daten unabhängig vom eingesetzten DBS-Typ Implementierungsebene Semantische Modelle unterschieden sich konzeptionelle Datenstrukturen im Rahmen des eingesetzten DBS bei relationalem DBS z.B. Tabellen in der Art der unterstützten Relationships und den Abstraktionsmechanismen für Relationships (z.B. Abhängigkeit, Aggregation, Vererbung) in der Darstellung der Basiselemente und insbesondere der Relationships, z.B. durch physische Ebene konkrete Implementierung der Strukturen im Rahmen des eingesetzten DBS betrachtete Strukturen: Datenblöcke, Zeiger, Indexstrukturen spezielle Diagrammsymbole und Linien (Entity-Relationship Modell) Darstellung als Funktionen (Funktionales Datenmodell) 1 2.4.1 Semantischer Ansatz (2) 2.4.1 Semantischer Ansatz (4) Auch Relationales Modell hat diese Basiselemente: Semantisches Modell Entity: Relation Property: Attribut, Primary Key Constraint Relationship: Foreign Key Constraint konzeptionelle Ebene Implementierungsebene Hierarchisches Modell Relationales Modell 3 Semantik ist aber unzureichend dargestellt: Objektrelato− nales Modell Schema 1 kunde kdnr# name adresse Semantisches Datenmodell versucht mehr von Daten-Bedeutung (Semantik) zu erfassen modelliert auf konzeptioneller Ebene unabhängig vom eingesetzten Datenbank-System kann in verschiedene DBS-Typen implementiert werden bei Übergang zu Implementierungsebene geht Information verloren => Designschritt nicht reversibel 2 Schema 2 kd_ansp kdnr# apnr# name telefon kunde kdnr# name adresse kd_ansp kdnr apnr# name telefon Tabelle kd_ansp ist abhängig von kunde, d.h. representiert eigentlich eine Eigenschaft von Kunde Zusammenhang in Schema 1 nur implizit representiert (Wodurch?) diese Bedeutung ist in Schema 2 gar nicht representiert 4 Dalitz DBS Kap2.4 2.4.1 Semantischer Ansatz (5) 2.4.2 ER Modell (2) Vorteile semantischer Modelle Entity intuitiver verständlich (auch für Nichtexperten!) leichtere Modellierung durch größere Nähe zur "realen Welt" Designer wird von Details der DBS entlastet (CASE-Tools) grafische Notation (Diagramme) anschaulich und (wenn grob vereinfacht) "pflichtenhefttauglich" strong (regular) Entity eigenständiges Objekt; kann unabhängig von anderen Objekten existieren weak Entity abhängiges Objekt; kann nur existieren wenn ein Objekt aus einer anderen Entity existiert Nachteile semantischer Modelle Diagramme bei größeren Modellen nicht mehr praktikabel Schritt zu SQL-DDL ist irreversibel => kein "Reverse Engineering" möglich => Änderungen an implementiertem Modell schwierig geringe Unterstützung für Constraints und Tuning-Parameter Unterscheidung Entity/Relationship oft künstlich => direkte relationale Modellierung manchmal intuitiver strong Entity weak Entity 5 7 2.4.2 ER Modell (1) 2.4.2 ER Modell (3) Das verbreitetste semantische Modell ist das Entity-Relationship Modell (ER Modell): Beispiel 1976 von Chen vorgeschlagen beinhaltet bestimmte Diagrammnotation (ER Diagramm) ist später erweitert worden um Varianten der Vererbung (Spezialisierung, Generalisierung, Kategorien) Einige Autoren (z.B. Elmasri, Navathe) unterscheiden zwischen der originalen Formulierung von Chen und den Erweiterungen ("extended ER" bzw. "EER") Erweiterung des ER Modells auf allgemeine Softwareentwicklung (nicht nur DB-Design) in Form von OMT und UML UML (Unified Modelling "Language") benutzt aber andere Diagrammsymbole und Begriffe Kunde angestellt bei Ansprech− partner Ansprechpartner ist kein unabhängiges Objekt existiert nur, wenn entsprechender Kunde auch existiert Bemerkungen: 6 Es ist oft nicht offensichtlich, ob eine Entity "weak" ist z.B. kann im Hersteller/Produkt Beispiel die Entity produkt sowohl als strong, als auch als weak aufgefasst werden (Warum?) ob weak oder strong hängt von logischer Sicht auf die Daten ab => Semantik der Entities wird modelliert 8 Dalitz DBS Kap2.4 2.4.2 ER Modell (4) 2.4.2 ER Modell (6) Property (Attribut) Relationship atomar, zusammengesetzt stellt Zusammenhang zwischen Entities her Darstellung durch Raute mit Linien zu beteiligten Entities Anzahl beteiligter Entities heißt Grad der Relationship Attribute werden durch Blasen dargestellt, zusammengesetzte Attribute (Strukturen) durch Zerlegung in weitere Blasen Schlüssel Schlüsselattribute werden unterstrichen mehrwertig (mengenwertig) mehrwertige Attribute erhalten doppelten Rand Feld1 Attribut Key Struktur mehrw. Attribut E3 Feld2 E1 R1 E2 (Grad 2) R2 (Grad 3) Feld3 Entity E4 9 2.4.2 ER Modell (5) 2.4.2 ER Modell (7) Beispiel Relationship kann auch reflexiv sein, d.h. Objekte derselben Entity miteinander verknüpfen: strasse name ort adresse hnr Mitarbeiter branche hersteller Vorgesetzter von Relationship zwischen strong und weak Entity durch doppelten Rahmen gekennzeichnet: Bemerkungen: zusammengesetzte und mehrwertige Attribute sind eigentlich überflüssig (siehe Diskussion zum Thema 1NF) mehrwertige Attribute machen aber Semantik klarer bei großer Zahl Attribute sind Blasen nicht mehr darstellbar => als Spaltenvektor darstellen (vgl. UML Klassendiagramm) 11 Kunde 10 angestellt bei Ansprechpartner 12 Dalitz DBS Kap2.4 2.4.2 ER Modell (8) 2.4.2 ER Modell (10) Kardinalität einer Relationship Relationships können auch Attribute haben gibt an wieviele Elemente derselben Entity an Relationship beteiligt sein können durch Zahlen an Verbindungslinien angegeben Lieferant Produkt m n beliefert Beispiel: Rabatt Hersteller 1 n stellt her k Produkt 1:n Beziehung zwischen Hersteller:Produkt ein Hersteller stellt mehrere (n) Produkte her ein Produkt hat einen (1) Hersteller Kunde 13 2.4.2 ER Modell (9) Verwischt Grenze zwischen Entity und Relationship Chen spricht von "Relationship Relation" 2.4.2 ER Modell (11) Komplettes Beispiel: Kardinalitätstypen 1:1 (One-to-One), 1:n (One-to-Many), n:m (Many-to-Many). Werte für n,m > 0 Wenn auch kein Element zulässig, explizit Null mit angeben, z.B. 0,1:1 oder 1:0,n n nr branche name Lieferant 1 stellt her nr m n adresse name Produkt preis beliefert Produkt strasse Hersteller 15 n plz Rabatt ort k nr ausge− liefert telefon name Kunde 1 name strasse adresse plz 0,m Lieferung nr 14 Ansprechpartner 0,n ange− stellt ort 16 Dalitz DBS Kap2.4 2.4.2 ER Modell (12) 2.4.3 ER -> Relational (2) Zusammenfassung ER-Notationen: Strong Entities strong Entity weak Entity Relationship Zuordnung strong/weak Entity zusammengesetzte und mehrwertige Attribute können schon auf der ER-Ebene nach dem Muster der Normalisierung (siehe erste Normalform) umgeformt werden hnr name hnr name ort Attribut partieller Schlüssel einer weak Entity mehrwertiges Attribut branche E2 1 hersteller 0,n ort Relationship mit Kardinalitäten R 0,m strasse branche 17 2.4.3 ER -> Relational (1) strasse hst− branche adresse E1 0,n Schlüssel− attribut hersteller nr name 19 2.4.3 ER -> Relational (3) Weak Entities (1) Umwandlung ER in Relationales Schema eigene Relation Primary Key = eigene Key Attribute + PK strong Entity ODER eigener künstlicher Schlüssel (nicht empfohlen (Warum?)) wenn zusammengesetzte Keys unerwünscht sind Allgemeines Vorgehen jede Entity wird Relation Attribute und Primary Key (PK) werden übernommen jede Relationship wird Relation Primary Key = alle PK’s beteiligter Entities name nr strasse Kunde ort 1 Feinheiten ange− stellt mehrwertige und zusammengesetzte Attribute Behandlung von weak Entities nicht alle Relationships brauchen eigene Relation => abhängig von Kardinalität der Relationship Art der Foreign Key Constraints 0,n Ansprechpartner nr 18 name telefon kunde nr# name strasse ort ansprechpartner kundenr# nr# name telefon 20 Dalitz DBS Kap2.4 2.4.3 ER -> Relational (4) 2.4.3 ER -> Relational (6) Weak Entities (2) One-To-Many Relationship (1) abhängige Entity ist an andere strong Entity gebunden => bei Foreign Key Constraint folgende Optionen nötig: ON DELETE CASCADE ON UPDATE CASCADE CREATE TABLE kunde ( nr INT8, name VARCHAR(30), strasse VARCHAR(30), ort VARCHAR(30), PRIMARY KEY (nr) ); 1:n Relationship kann wie n:m Relationship umgesetzt werden Unterschied: PK der Entity am "1-Ende" nicht in PK der "Relationship-Relation" mit aufnehmen (Warum?) nr CREATE TABLE ansprechpartner ( kundenr INT8 REFERENCES kunde(nr) ON DELETE CASCADE ON UPDATE CASCADE, nr INT, name VARCHAR(30), telefon VARCHAR(30), PRIMARY KEY (kundenr, nr) ); on delete cascade bewirkt Löschung von Ansprechpartner wenn referenzierter Kunde gelöscht wird on update cascade ändert Fremdschlüssel in Ansprechpartner mit bei Schlüsseländerung des referenzierten Kunden nr# name 1 stellt her n nr# name 21 ... 23 Beobachtung: separate Relation hersteller_produkt unnötig Zusammenlegung mit produkt ergibt: nr# name hersteller nr# name kunde kunde_produkt kundenr# produktnr# hersteller hersteller_produkt herstellernr produktnr# ... nr# name m produkt nr# name herstellernr produkt Vorteile: Produkt nr# name nr produkt name One-To-Many Relationship (2) name bezieht nr 2.4.3 ER -> Relational (7) n:m Relationships werden eine eigene Relation Primary Key = PK’s aller beteiligten Entities Kunde n hersteller_produkt herstellernr produktnr# Produkt Many-To-Many Relationship nr# name hersteller Hersteller 2.4.3 ER -> Relational (5) nr name produkt name Foreign Key Constraints mit on update cascade Option 22 weniger Relationen klarere Semantik: Hersteller Eigenschaft von Produkt Aber: wenn oft kein Hersteller bekannt, vermeidet linke Lösung NULL-Werte in Foreign Key Feld 24 Dalitz DBS Kap2.4 2.4.3 ER -> Relational (8) 2.4.3 ER -> Relational (10) One-To-One Relationship Zusammenfassung auch bei 1:1 Relationship keine eigene Relation nötig PK einer Entity als Foreign Key in andere Entity aufnehmen nr name nr# name Personal 1 personal nr# name chefnr abteilung Chef von 0,1 nr# name chefvon personal ER Modell Relationales Modell Entity einfaches Attribut zusammengesetztes Attribut Schlüsselattribut mehrwertiges Attribut 1:1 oder 1:N Relationship Relation Attribut mehrere Attribute Primary Key Relation mit Fremdschlüssel Fremdschlüssel in Relation auf Seite der höheren Kardinalität (Alternative: separate Relation) Relation mit zwei Fremdschlüsseln Relation mit n Fremdschlüsseln Abteilung nr nr# name name N:M Relationship Relationship n-ten Grades abteilung obere Lösung ist besser (Warum?) Regel: erweitere Tabelle am "0-Ende" 25 27 2.4.3 ER -> Relational (9) 2.4.4 Entwurfsfragen (1) Relationship höheren Grades Anforderungen an Datenmodell eigene Relation PK beteiligter Relationen als Foreign Keys PK = PK’s beteiligter Relationen mit Kardinalität > 1 Produkt Lieferant lieferant a) vollständig b) minimal bzw. redundanzfrei c) einfach und verständlich produkt Damit zusammenhängende Aspekte m n beliefert belieferung lfnr# pdnr# kdnr# rabatt Namenskonventionen Auswahl des Elements (Entity, Attribut, Relationship) Mehrwert (?) von ER versus Relational allgemeines Vorgehen (Top-Down, Bottom-Up) Rabatt k Kunde kunde 26 28 Dalitz DBS Kap2.4 2.4.4 Entwurfsfragen (2) 2.4.4 Entwurfsfragen (4) Namenskonvention Wahl des Basiselements Oft gibt es mehrere Möglichkeiten, einen Sachverhalt zu representieren Namen von Objekten des Modells sollen Bedeutung entsprechen => leichter verständlich Konventionen erleichtern Verwendung (leichter merkbar, Fremdschlüssel erkennbar) a) Attribut versus Entity und Relationship b) Relationship versus Entity Alternative a) ist echte Designfrage mit Auswirkungen auf Dateneingabe und Datenkonsistenz. Beipielkonventionen (1) Enitäten konsistent im Singular oder Plural. Beides sinnvoll: select * from kunden; select kunde.nr,kunde.name from kunde ...; übliche Konvention: Singular Alternative b) ist künstliches Problem im ER Modell Name von Key und Bedeutung einheitlich, z.B. nr und name 29 im Relationalen Modell kein Unterschied ER Modell unterstützt Foreign Keys nur implizit durch Relationships und weak Entities neuere Modelle und CASE-Tools erweitern ER um Relationale Konzepte => Unterscheidung Entity/Relationship aufgehoben 2.4.4 Entwurfsfragen (3) 2.4.4 Entwurfsfragen (5) Beispielkonventionen (2) Attribut versus Entity + Relationship (1) Name Fremdschlüsselattribut = referenzierte Tabelle + PK hersteller nr# name branchenr Betrachte Eigenschaft "Branche" eines Herstellers Lösung 1: branche nr# name name nr Name Relationship-Relation zusammengesetzt aus Namen der beteiligten Entities; ebenso bei weak Entities Branche n Anspr. n 1 m Kunde 31 branche hersteller ER Modell branche branche_kunde kunde kunde_ansp 30 hersteller nr# name hst_branche hstnr# branche# Relationales Modell Branche als mehrwertiges Attribut modelliert freie Text-Eingabe für Branche möglich => leichte Eingabe (keine Referenzdatenpflege) => Auswertung über Branche schwierig (z.B. Tippfehler) Branchen nicht separat pflegbar sondern abhängig von Hersteller 32 Dalitz DBS Kap2.4 2.4.4 Entwurfsfragen (6) 2.4.4 Entwurfsfragen (8) Attribut versus Entity + Relationship (2) Entity versus Relationship (1) Lösung 2: Betrachte Modellierung eines Schachturniers nr ER Modell name hersteller nr# name hersteller spieler nr# name elozahl herstellernr# branchenr# hst_branche nr name Relationales Modell ist offensichtlich Relationa− les Modell branche nr# name partie runde# weissnr# schwarznr# ergebnis branche Branche als eigene, Hersteller-unabhängige Entity modelliert keine freie Eingabe möglich, sondern Auswahlliste => Pflege separater Referenztabelle branche nötig => Auswertungen über Branchenschlüssel möglich ER Modell ist weniger offensichtlich Ursache: 33 Foreign Keys kennt das ER Modell nicht tauchen nur implizit auf bei Relationship oder weak Entity => zwei Modellierungsalternativen 2.4.4 Entwurfsfragen (7) 2.4.4 Entwurfsfragen (9) Attribut versus Entity + Relationship (3) Entity versus Relationship (2) Alternative besteht nicht nur bei mehrwertigen Attributen, sondern bei allen Attributen Lösung 1: Verwende Referenztabelle, wenn Attributwerte nicht beliebig sind, sondern aus (konfigurierbarer!) Werteliste kommen sollen Unterschied zu Domain-Constraint (Check-Constraint): Werteliste änderbar ohne Schemaänderung klausel art Versicherung nr zahlweise nr name elozahl art und klausel müssen über Referenztabelle modelliert werden zahlweise kann über Constraint modelliert werden: Werte 1,2,4,6,12 sind fest Werte tragen Bedeutung für Berechnungen n 35 runde trifft auf Spieler m ergebnis Partien modelliert als Relationship zwischen zwei Spielern Probleme: 34 selbe Begegnung mehrmals möglich (gelöst über zusätzlichen Teilschlüssel runde) Wer hat Weiß, wer Schwarz (wäre allerdings bei anderer Sportart egal)? Eigentlich interessierendes Objekt "Partie" taucht gar nicht auf! 36 Dalitz DBS Kap2.4 2.4.4 Entwurfsfragen (10) 2.4.4 Entwurfsfragen (12) Entity versus Relationship (3) allgemeines Vorgehen Lösung 2: name Top-Down weiß nr n 1 Spieler Partie 1 elozahl starte mit grobem Entwurf, der zunehmend verfeinert wird (z.B. durch Einführung von Referenztabellen) Erleichtert Verständnis des Systems, da zunächst aus der "Vogelperspektive" modelliert wird runde n ergebnis schwarz Bottom-Up arbeite Details aus und füge sie zu Gesamtsystem zusammen Gesamtverständnis des Systems ist so schwerer zu gewinnen, Gefahr des Verlierens im Detail wegen "Käferperspektive" Partien modelliert als weak Entity, die von zwei strong Entities abhängt (=> FK’s gehen in PK ein) trotz dieses kuriosen Konstrukts angemessener: Information "weiss/schwarz" dargestellt "Partie" als Hauptgegenstand der Anforderung taucht explizit auf 37 39 2.4.4 Entwurfsfragen (11) 2.4.4 Entwurfsfragen (13) Entity versus Relationship (4) In Praxis liefert Anforderungsanalyse meist vor allem Detailwissen => zunächst Bottom-Up Analyse nötig vor Top-Down Design Interessanterweise führen beide ER-Lösungen zu demselben Relationalen Modell spieler nr# name elozahl Gesamt− überblick partie runde# spieler1nr# spieler2nr# ergebnis Folgerungen: Übergang ER -> Relational ist irreversibel: aus Relationalen Schema lässt sich nicht mehr rekonstruieren, aus welchem ER Schema es erzeugt wurde Semantik von Lösung 1 (beide Spieler gleichwertig) geht im Relationalen Modell verloren Top−Down Design Bottom−Up Analyse Anforderungs− analyse 38 Datenmodell Abgleich Ergebnis 40 Dalitz DBS Kap2.4 2.4.4 Entwurfsfragen (14) 2.4.5 Vererbung (2) Mögliches Top-Down Vorgehen: Beispiel Fahrzeug Modellieren der wesentlichen Entities und Relationships (zwecks besseren Überblicks noch keine Attribute) is−a Ergänzen der Schlüsselattribute Modellieren aller Entity-Eigenschaften als (ggf. mehrwertige) Attribute PKW wo Auswahlliste für Attributwerte gewünscht, Attribute durch Relationships mit Referenztabellen ersetzen wenn ein Attribut von mehreren Entities verwendet wird, ebenfalls durch Referenzen auf neue Entity ersetzen (Warum?) 41 LKW ein Objekt der Entity PKW gehört auch zur Entity Fahrzeug ein Objekt der Entity Fahrzeug kann zugleich zu einer oder (nicht hier, aber im allg.) auch zu mehreren Subklassen gehören da IS-A Relationship sich auf genau ein Objekt bezieht, ist es immer eine 1:1 Beziehung => Kardinalitätsangabe unnötig Subklassen können weitere spezifische Attribute haben 2.4.5 Vererbung (1) 2.4.5 Vererbung (3) Oft enthält Entity A Objekte mit speziellen Eigenschaften, die nicht für alle Objekte aus A relevant sind. => definiere special-case Entity B für diese Objekte Vergleich mit Vererbung in C++ abgeleitete Klasse erbt alle Eigenschaften der Oberklasse, d.h. Subklasse = Superklasse + spezielle Eigenschaften Objekt der Subklasse kann als Objekt der Superklasse behandelt werden Unterschied in C++ hat Objekt einen bestimmten Datentyp, d.h. gehört zu genau einer Klasse im ER Modell kann ein Objekt zu einer ganzen Hierarchie von Entites gehören allerdings: in C++ Typumwandlung möglich mittels dynamic cast B is−a C 43 Übereinstimmung B heißt Subklasse der Superklasse A Superklasse wird auch Generalisierung genannt, Subklasse auch Spezialisierung zwischen B und A besteht "IS-A" Relationship. grafische Darstellung dieser Relationship durch Dreieck im allgemeinen mehrere Subklassen zu einer Superklasse A Motorrad 42 44 Dalitz DBS Kap2.4 2.4.5 Vererbung (4) 2.4.5 Vererbung (6) Spezialisierung einer Superklasse in mehrere Subklassen hat zwei verschiedene Eigenschaften: Umwandlung in Relationales Modell Betrachte Spezialisierung der Superklasse A(k, a1 , . . . , an ) (k ist der Schlüssel von A) mit m Subklassen B1 , . . . , Bm disjunkt oder überlappend kann ein Element der Superklasse in höchstens einer Subklasse sein, ist die Spezialisierung disjunkt total oder partiell k Da beide Eigenschaften voneinander unabhängig sind, ergeben sich vier verschiedene Kombinationen 2.4.5 Vererbung (5) Es gibt vier verschiedene Umwandlungsoptionen Erstelle für A die Relation A(k#, a1 , . . . , an ) und für jede Subklasse Bi eine Relation mit den Attributen {k#} ∪ {Attribute von Bi }. disjunkt partiell PKW LKW k# B1 Gitarre Lebewesen überlappend total akustisch elektrisch 47 Option 1: Fahrzeug Frau Bm 2.4.5 Vererbung (7) Mensch Mann ... B1 45 an A muss ein Element der Superklasse in mindestens einer Subklasse sein, ist die Spezialisierung total disjunkt total ... a1 k# überlappend partiell Tier b1 1 ... b1 k1 a1 ... an ... A Bm k# bm 1 ... bm km erzeugt viele Relationen geeignet für disjunkt und überlappend geeignet für total und partiell Mensch 46 48 Dalitz DBS Kap2.4 2.4.5 Vererbung (8) 2.4.5 Vererbung (10) Option 2: Option 4: Erstelle eine Relation A mit den Attributen von A, den Attributen aller Subklassen und m boolschen Attributen t1 , . . . , tm , die Flags für Subklassenzugehörigkeiten sind. Erstelle für jede Subklasse Bi eine Relation mit den Attributen {k#, a1 , . . . , an } ∪ {Attribute von Bi }. a1 ... an b1 1 ... b1 k1 B1 k# a1 ... k# k# a1 ... an bm 1 ... bm km Bm ... an t1 ... t m b1 1 ... b1 k1 ... A bm 1 ... bm km Flags für Subklassenzugehörigkeit erzeugt eine Relation weniger (die Superklasse) nur geeignet für disjunkte und totale Spezialisierung: nicht total => Objekte nicht in Subklasse nicht speicherbar nicht disjunkt => Redundanz durch Mehrfachspeicherung erzeugt nur eine einzige Relation geeignet für überlappende Spezialisierung wie bei Option 3 ggf. zahlreiche Nullwerte 49 51 2.4.5 Vererbung (9) Option 3: Erstelle eine Relation A mit den Attributen von A, den Attributen aller Subklassen und einem Typ-Attribut t, das die Subklassenzugehörigkeit angibt. k# a1 ... an t b1 1 ... b1 k1 ... bm 1 ... bm km A Typ−Attribut erzeugt nur eine einzige Relation nur geeignet für disjunkte Spezialisierung (Warum?) erzeugt ggf. zahlreiche Nullwerte (Welche?) 50 Dalitz DBS Kap2.4 3.1 weitere DB-Objekte 3.1.1 Sequence (2) wichtige fortgeschrittene Datenbankobjekte: Naiver Ansatz für Primärschlüsselerzeugung (select max(nr) + 1) ist problematisch: Sequence Client 1 generiert eindeutige Werte nicht in SQL2 spezifiziert, aber von fast allen DBS unterstützt, wobei Syntax der Verwendung variiert Tabelle Client 2 select max(nr)+1 Schema select max(nr)+1 1022 Namespaces zum Trennen von Usern/Anwendungen in SQL2 gefordert, aber ungenau spezifiziert => DBS-spezifische Unterschiede im Detail 1022 bearbeiten bearbeiten insert View Select-Statement als Tabelle in SQL2 spezifiziert; wesentlicher Bestandteil aller relationalen Datenbanksysteme insert 1 3 Fehler 3.1.1 Sequence (1) 3.1.1 Sequence (3) Beschreibung Verwendung Sequence zur Schlüsselgenerierung: Anlegen der Sequenz Sequence ist ein Zähler wesentliche Eigenschaft: einmal vergebener Wert wird nicht nochmal vergeben (auch nicht in anderen Transaktionen) => Sequence-Werte sind über Transaktionsgrenzen hinweg eindeutig CREATE SEQUENCE s_person START 100000 INCREMENT 1; Verwendung als Default-Wert für Primärschlüssel CREATE TABLE person ( nr numeric(6) DEFAULT nextval(’s_person’), name varchar(30), /* ... */ PRIMARY KEY (nr) ); Anwendungsgebiete automatische Generierung Primärschlüsselwerte Erzeugung eindeutiger Namen für temporäre Tabellen (oft besser: Verwendung von create local temporary table) 2 Bemerkung: PostgreSQL Datentyp serial macht das automatisch 4 Dalitz DBS Kap3.1-3 3.1.2 Schema (1) 3.1.2 Schema (3) Hierarchieebenen einer DBS-Instanz: Was ist ein Schema? ein Schema ist ein Namespace: derselbe Tabellenname kann parallel in verschiedenen Schemas verwendet werden jede Tabelle ist genau einem Schema zugeordnet; angesprochen wird Tabelle mit schemaname.tabellenname User kann in derselben Sitzung (Datenbank-Verbindung) Objekte aus mehreren Schemas ansprechen auf Schemas können Zugriffsrechte erteilt werden Database Cluster Database Cluster Database User Group Schema Tabelle View Database Sequence Schema Index Constraint Group User Wozu braucht man Schemas? Tabelle View Constraint Index damit mehrere User dieselbe Datenbank ohne Kollisionen nutzen können um mehrere Applikationen auf derselben Datenbank zu betreiben logische Gruppierung von Objekten mit leichterer Verwaltung ... 5 3.1.2 Schema (2) 3.1.2 Schema (4) Benutzung von Schemas Datenbank Cluster Sammlung mehrerer Datenbanken, die von einem Datenbank-Serverprozess verwaltet werden User und Gruppen auf Clusterebene, aber einstellbar wer auf welche Datenbank zugreifen darf (PostgreSQL: pg_hba.conf, Oracle: grant/revoke connect) Schemaanlage create schema <schemaname>; per Default vorhanden: Schema "public" Tabellenanlage create table [schemaname.] tabellenname (...); ohne schemaname wird Tabelle in erstem (existierenden) Schema aus Suchpfad angelegt Datenbank Sammlung von Tabellen, Views, Constraints, Indizes, ..., die in Schemas zusammengefasst sind eine Verbindung zum DB-Server wird immer mit genau einer Datenbank hergestellt datenbankübergreifende SQL-Statements sind nach SQL2 nicht möglich, können aber in Oracle mit Datenbank-Links emuliert werden (auch über Clustergrenzen hinweg!) 7 Schema Suchpfad unqualifizierte Tabellennamen werden im Schema Suchpfad gesucht wie Suchpfad gesetzt wird ist systemspezifisch typischer Defaultwert: username, public 6 8 Dalitz DBS Kap3.1-3 3.1.2 Schema (5) 3.1.3 View (2) Typische Konfiguration: Definition eines Views Jeder User, der Tabellen anlegt (das ist normalerweise pro Applikation nur ein einziger User!) hat ein eigenes Schema mit seiner Userid als Namen Alle Tabellen der Applikation in diesem Schema anlegen; Suchpfad Applikationsaccount beginnt mit Usernamen Endanwender (andere Accounts!) müssen Tabellen qualifizieren und dürfen DML aber kein DDL ausführen produkt pnr# name preis einfuehrung auslauf π...(σ...( produkt )) produkt_aktuell Emulation schemalose Datenbank: pnr# name preis einfuehrung View, der nur aktuelle Produkte enthält: erforderlich zwecks Kompatibilität zu DBS, die keine Schemas unterstützen (z.B. PostgreSQL vor Version 7.3) keine expliziten Schemas anlegen und nur "public" Schema benutzen (=> alle User im selben Namespace) 9 CREATE VIEW produkt_aktuell AS SELECT pnr,name,preis,einfuehrung FROM produkt WHERE auslauf > current_date OR auslauf IS NULL; 3.1.3 View (1) 3.1.3 View (3) Was ist ein View? Angabe der Attributnamen im View "virtuelle Tabelle", deren Inhalt dynamisch über relationalen Algebra Ausdruck berechnet wird 11 implizit über Liste selektierter Attribute: CREATE VIEW produkt_aktuell AS SELECT pnr, name AS produkt, ... FROM produkt WHERE ... im relationalen Modell als abgeleitete Relation bezeichnet, im Gegensatz zu Basisrelation (Tabelle) explizite Angabe hinter View-Namen: verhält sich aus Anwendersicht wie Tabelle: CREATE VIEW produkt_aktuell (pnr, produkt, ...) AS SELECT pnr, name, ... FROM produkt WHERE ... Abfrage mit select explizite Rechtevergabe mit grant/revoke Aber: Änderung (insert, update, delete) im allg. nicht möglich 10 12 Dalitz DBS Kap3.1-3 3.1.3 View (4) 3.1.3 View (6) Abfragen über Views Rechtebeschränkung mit Views Problem: führen zu Abfragebaum (s. 2.5.2) mit Views an Blättern Anwender benutzt Abfrage-Frontend, das keine Rechtebeschränkung ermöglicht (z.B. MS Access, SQL-Prompt) ersetze Views durch die Abfragebäume, die in ihrer Definition hinterlegt sind => Abfragebaum hat nur Tabellen an Blättern Lösung: richte Views ein, deren Select-Klausel das Rechteprofil des Anwenders berücksichtigen richte für Anwender eigenen Datenbank-User ein gebe diesem User nur das Zugriffsrecht auf die Views und entziehe ihm den Zugriff auf alle anderen Tabellen Abfrage Baum R V R S T 13 15 3.1.3 View (5) 3.1.3 View (7) Wozu sind Views gut? Beispiel: System-Catalog, in dem jeder nur seine eigenen Tabellen sieht Kapselung komplexer Queries Anwender braucht Abfrage nicht zu kennen Abfrage kann geändert werden, ohne Applikation anzupassen evtl. bessere Performance ("materialized Views") mögliche Lösung: Tabelle all_tables (tblid, name, owner,...) enthält Tabellen aller User definiere View, in dem jeder nur seine Tabellen sieht: CREATE VIEW user_tables AS SELECT * FROM all_tables WHERE owner = current_user; Bemerkungen: Einschränkung von Zugriffsrechten normalerweise Rechte über Zugriffsfrontend gesteuert wird kein anwendungsspezifisches Frontend verwendet (z.B. DB-Frontends aus Office-Paketen), trotzdem Rechtebeschränkung mit Views möglich Vermeidung Redundanzen current_user ist die SQL2-Funktion für die aktuelle Benutzerkennung obwohl alle auf denselben View zugreifen, sieht jeder User andere Daten abgeleitete Attribute können dynamisch berechnet werden 14 16 Dalitz DBS Kap3.1-3 3.1.3 View (8) 3.1.3 View (10) Data Dictionary Oracle: Bessere Lösung bei berechenbarer Abhängigkeit f: vom System definierte Views, die Benutzerrechte berücksichtigen Präfix USER_ => eigene Objekte Präfix ALL_ => alle Objekte auf die User zugreifen darf Präfix DBA_ => alle Objekte View * tables * tab columns * sequences * indexes * ind columns * users * role privs Purpose Shows all relational tables Shows all table and view columns Lists all sequences in the database Lists all indexes Lists all indexed columns Lists all users Lists all roles granted to users and other roles definiere View Vb mithilfe Berechnungsregel von f, der Primärschlüssel von T und berechnete Werte enthält T k1# a1 a2 c1 b1 b1 = f (a1, a2) k1# a1 a2 c1 c2 Vb Ta 17 3.1.3 View (11) Redundanzvermeidung mit Views Beispiel: lnr# produkt menge netto k1# a1 a2 c1 b1 c2 001 002 003 A = { a1, a2 } B = { b1 } k1# a1 a2 c1 c2 Ta a1# a2# Buch A Buch B Software 1 1 1 49.35 116.94 38.90 19 mwst brutto datum 7.0 7.0 16.0 52.80 125.13 43.40 01.12.2002 05.01.2003 01.08.2002 Tabelle lieferung enthält Redundanzen wegen 100 + mwst netto ∗ = brutto 100 Abspalten berechenbares Attribut mittels View: b1 Tb Rückblick Normalisierung: Redundanzen formal beschrieben durch funktionale Abhängigkeit A → B, d.h. B = f(A) Redundanzvermeidung durch projektive Zerlegung Im allg. ist Funktion f nicht berechenbar (vgl. THI) => Darstellung durch Wertetabelle Tb erforderlich k1# f (a1, a2) geht nur, wenn f genügend "einfach" ist, um mit relationaler Algebra berechnet werden zu können (Aber: allgemeiner berechenbarer Fall mit stored Procedures prinzipiell möglich) 3.1.3 View (9) T c2 Tabelle lieferung 18 lnr# produkt menge netto mwst datum View lieferung_brutto SELECT lnr, netto*(1+mwst/100) FROM lieferung 20 Dalitz DBS Kap3.1-3 3.1.3 View (12) 3.1.3 View (14) Weitergehende Möglichkeiten: Projektionsviews pnr# name preis einfuehrung auslauf mit Views lassen sich z.T. auch Redundanzen vermeiden, die nicht durch Normalisierung (projektive Zerlegung) beseitigt werden können Beispiel: Lieferungen mit mehreren Positionen und Gesamtsumme lieferung (lnr#, datum, summe) position (lnr#, posnr#, produkt, preis) summe kann aus preis der zugehörigen Positionen berechnet werden => Redundanz mit Updateanomalien Redundanz kann eleminiert werden durch einen View, der entsprechende Beträge aggregiert (wie lautet die genaue Definition dieses Views?) Probleme produkt π ... bei insert wird für ausgeblendete Attribute NULL oder der bei Tabellenanlage angegebene default eingesetzt => ggf. Integritätsverletzung (Not Null Constraint) bei Ausblendung Primary Key kein insert möglich weitere Effekte bei Ausblendung Primary Key 21 verschiedene Tupel können als Doubletten im View auftreten => keine gezielte Änderung möglich bei select distinct entsprechen einem View-Tupel im allg. mehrere Basistupel 3.1.3 View (13) 3.1.3 View (15) Änderungen auf Views Selektionsviews (1) Anforderungen: pnr# name preis einfuehrung auslauf Korrektheit Änderung in Basisrelation(en) wirkt sich so aus, als ob der View direkt geändert würde Eindeutigkeit und Minimalität welche Sätze zu ändern sind, darf nicht mehrdeutig sein diese Sätze werden minimal geändert für gewünschten Effekt Integritätserhaltung Änderung darf zu keinen Integritätsverletzungen führen keine Auswirkung auf "unsichtbare" Tupel der Basisrelationen billigprodukt := 23 produkt σ preis < 5.0 ( produkt ) Probleme Änderung kann ausgeblendeten Teil betreffen DELETE FROM produkt WHERE preis > ’2.0’; Minimalitätsprinzip: keine Auswirkung auf unsichtbare Tupel Anforderungen im allgemeinen nicht alle erfüllbar Untersuche Bedingungen für Erfüllbarkeit 22 Verschieben von sichtbar zu unsichtbar UPDATE produkt SET preis = ’8.5’ ... kann in SQL2 mit with check option unterdrückt werden 24 Dalitz DBS Kap3.1-3 3.1.3 View (16) 3.1.3 View (18) Selektionsviews (2) Ansätze für änderbare Views: automatisch änderbare Views Betrachte Viewdefinition über Subquery: definiere (hinreichende) Bedingungen, wann View änderbar ist solche Views sind änderbar gemäß festdefinierten Regeln bei allen anderen Views sind keine Änderungen zulässig diese Lösung wird von SQL2 gewählt Bedingungen sind aber sehr restriktiv (=> geringer Nutzen) CREATE VIEW teuerstes_produkt AS SELECT * FROM produkt WHERE preis = ( SELECT max(preis) FROM produkt ); Anforderung der Korrektheit für Änderungen nicht erfüllbar Wie wäre nämlich z.B. delete from teuerstes_produkt umzusetzen? Was ist mit updates und inserts? selbstdefinierbare Regeln für Änderungen ermögliche Definition von Regeln (Rules), was bei insert, update, delete gemacht werden soll nur Views mit solchen Rules sind änderbar Lösung wird von PostgreSQL gewählt flexibel, aber kein Automatismus für triviale Fälle Problem: where-Klausel wird durch Änderung mitverändert Views, die Subqueries mit Selbstbezug enthalten, sind daher in SQL2 nicht änderbar 25 3.1.3 View (17) 3.1.3 View (19) Verbundviews (Joins) hersteller hnr# hersteller stadt Probleme 27 Änderbare Views in SQL2 produkt SQL2 unterscheidet nicht zwischen insert, update und delete, sondern spricht allgemein von "updatable Views" pnr# produkt preis hnr hersteller_produkt := hersteller ein "updatable View" ist ein select [all] (kein select distinct) auf genau eine Basistabelle, mit folgenden Zusatzbedingungen: produkt der View enthält keine berechneten Attribute Gruppierung und Aggregation ist unzulässig Subselect auf dieselbe Basistablle ist unzulässig alle nicht im View enthaltenen Attribute dürfen in der Basistabelle NULL sein oder haben einen Default-Wert definiert (M.a.W. ein insert schlägt nicht fehl) Änderungen nicht eindeutig einem Basistupel zugeordnet z.B. Löschung eines View-Tupels auf drei Arten möglich: Löschung des Produkts aus produkt Löschung des Herstellers aus hersteller Löschung Produkt und Hersteller create view bietet Parameter with check option, mit dem eine "Tupelmigration" in unsichtbaren Bereich der Basistabelle verhindert werden kann In letzten zwei Fällen ist Ergebnis nicht korrekt, da immer weitere Tupel aus hersteller_produkt mitgelöscht werden in SQL2 Änderungen auf Verbundsichten verboten 26 28 Dalitz DBS Kap3.1-3 3.1.4 Rule (1) 3.1.4 Rule (3) Nachteile SQL2 Lösung: Anwendung auf Löschproblem Verbundview: hersteller Bedingungen für Eindeutigkeit decken nur triviale Fälle ab mehrdeutige Fälle können prinzipiell nicht erfasst werden durch "automatische" Umsetzung Statements auf Basistabellen hnr# hersteller stadt pnr# produkt preis hnr hersteller_produkt := hersteller allgemeinere Lösung mit Rules: produkt es soll nur das Produkt, nicht der Hersteller gelöscht werden: CREATE RULE hersteller_produkt_del AS ON DELETE TO hersteller_produkt DO INSTEAD DELETE FROM produkt WHERE pnr = old.pnr; Rule redefiniert, was im Falle eines insert, update, delete, select gemacht werden soll nicht nur auf Views beschränkt, auch auf Tabellen anwendbar verwandt mit dem Trigger kein Bestandteil eines SQL-Standards, sondern PostgreSQLspezifische Erweiterung 29 Bemerkung: Die Pseudorelationen old und new enthalten das betroffene Tupel vor bzw. nach Durchführung der auslösenden Operation Bei delete braucht man also nur old, bei insert nur new und bei update beides 3.1.4 Rule (2) 3.1.4 Rule (4) Anlegen einer Rule: Wozu sind Select-Rules gut? CREATE RULE rule_name AS ON event TO object [WHERE rule_qualification] DO [INSTEAD] [action | (actions) | NOTHING]; 31 Protokollierung von Zugriffen problematisch bzgl. Performance besser: Logfile-Auswertung (ggf. Auditing Tool verwenden) Beispiele: verhindere Update’s an Tabelle hersteller: CREATE RULE hersteller_no_upd AS ON UPDATE TO hersteller DO INSTEAD NOTHING; (kein gutes Beispiel: wie macht man das besser?) Setze statt physischer Löschung Löschkennzeichen: CREATE RULE hersteller_del AS ON DELETE TO hersteller DO INSTEAD UPDATE hersteller SET geloescht = TRUE WHERE hnr = old.hnr; produkt PostgreSQL-interne Implementierung von Views: CREATE VIEW myview AS SELECT * FROM mytab; wird umgesetzt als CREATE TABLE myview (attribute list of mytab); CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD SELECT * FROM mytab; 30 32 Dalitz DBS Kap3.1-3 3.1.4 Rule (5) 3.2 Serverprogrammierung (2) Idee serverseitige Programmierung: Rules sind spezieller experimenteller Ansatz, der in den meisten DBS-Lehrbüchern nicht behandelt wird Verlagere Datenmanipulation mit fester Ablauflogik vom Client auf den Server Programme werden als stored Procedures im DBS hinterlegt und vom Clientprogramm per SQL-Befehl gestartet Originale Forschungsliteratur zum Thema "Rules": Anwendg. Stonebraker, Jhingran, Goh, Potamianos: On Rules, Procedures, Caching and Views in Database Systems. URL: http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/papers/ERL-M90-36.pdf SELECT proc() FROM ... DB DBMS proc() stored Procedure Ong, J. Goh: A Unified Framework for Version Modeling Using Production Rules in a Database System. ERL Technical Memorandum M90/33, University of California, April, 1990 DBS Vorteile 33 stored Procedures stehen in jedem Client zur Verfügung (sogar im SQL-Prompt) bei Änderung Ablauflogik müssen Clients nicht angepasst werden, sondern nur zentrale Prozedur 3.2 Serverprogrammierung (1) 3.2 Serverprogrammierung (3) Datenbankzugriff aus Clientprogramm: Komponenten serverseitiger Programmierung 35 stored Procedures DB−Server die im Server hinterlegten Programme SQL nicht Turing-vollständig => Procedures können i. allg. nicht in reinem SQL sein (Host Language oder PL/SQL) Programm SQL Verar− beitung SQL prozedurale SQL-Erweiterungen Verar− beitung ermöglichen direkte Erzeugung von Prozeduren mit SQL Quasistandard: PL/SQL von Oracle Programm holt Daten per SQL abhängig von Verarbeitungslogik werden weitere SQL-Statements abgesetzt usw. Verarbeitungslogik kann fest programmiert sein (z.B. Praktikum 3+4) oder interaktiv vom Anwender bestimmt werden (Extremfall: SQL-Prompt) Trigger Auslösen von stored Procedures beim Eintreten bestimmter Ereignisse, z.B. Update einer bestimmten Tabelle "aktive" Datenbankobjekte, die nicht direkt vom Anwender angesprochen werden 34 36 Dalitz DBS Kap3.1-3 3.2 Serverprogrammierung (4) 3.2.1 Stored Procedures (2) "Standards" der serverseitigen Programmierung Beispiel: PL/SQL DROP FUNCTION bruttofunc(NUMERIC); -- berechne Bruttobetrag incl. Mwst CREATE FUNCTION bruttofunc(numeric) RETURNS numeric AS ’ SELECT $1 * CAST(1.16 AS numeric); ’ LANGUAGE ’SQL’; prozedurale SQL-Erweiterung von Oracle vollwertige moderne prozedurale Programmiersprache (Funktionen mit Defaultargs und Überladen, Exceptions,...) Vorbild für PL/pgSQL von Postgres PSM Bemerkungen: Persistent Stored Modules (PSM) 1996 in ANSI SQL-Standard aufgenommen; Bestandteil von SQL3 (1999) spezifiziert drei Aspekte Überladung möglich => Argumente beim drop mit angeben Argumente referenzierbar mit $1, $2 etc. Rückgabewert = Ergebnis letztes Select-Statement Funktion ist mit reinem SQL implementiert (kein PL/SQL) Implementierungssprache im Parameter language angegeben auch andere Sprachen möglich (plpgsql, C, plperl, pltcl, plpython) Definition und Aufruf von Prozeduren und Funktionen Zusammenfassen von Funktionen zu Modulen prozedurale SQL-Erweiterung wegen zu PL/SQL inkompatibler Syntax (noch?) kaum umgesetzt 37 39 3.2.1 Stored Procedures (1) 3.2.1 Stored Procedures (3) Definition und Aufruf Funktionen können nicht nur zum Berechnen, sondern auch für Operationen verwendet werden: SQL3 unterscheidet zwischen Prozedur und Funktion -- Abbuchung in Tabelle Konto durchführen CREATE FUNCTION abbuchung(varchar, numeric) RETURNS numeric AS ’ UPDATE konto SET stand = stand - $2 WHERE nr = $1; SELECT stand FROM konto WHERE nr = $1; ’ LANGUAGE ’SQL’; Anlage mit create procedure bzw. create function Aufruf Prozedur mit SQL-Befehl call <procname> Aufruf Funktion im Rahmen von select-Statement. Beispiel: select bruttofunc(preis) from produkt; PostgreSQL macht diese Unterscheidung nicht expliziter Aufruf nur über select möglich => explizit aufrufbare Funktion muss Rückgabewert haben Funktionen ohne Rückgabewert haben Rückgabetyp trigger => können nur implizit vom DBS aufgerufen werden (z.B. über Trigger) Bemerkung 38 letztes select nötig, da Funktion Wert zurückgeben muss könnte aber auch durch triviales select ersetzt werden, z.B. select ’1’; 40 Dalitz DBS Kap3.1-3 3.2.1 Stored Procedures (4) 3.2.2 prozedurales SQL (2) PostgreSQL unterstützt auch C-Funktionen Sprachen-Framework in PostgreSQL Funktion muss in Shared-Library (*.so) bereitgestellt werden Shared-Library wird auf DB-Server abgelegt Parameterübergabe über spezielle libpq-Makros SQL Funktionsdefinition: CREATE FUNCTION bruttofunc(numeric) RETURNS numeric AS ’bruttofunc.so’ LANGUAGE ’C’; Suchpfad für Shared-Library ist konfigurierbar stored Procedures name userfunc source ... sprache pl Sprachen name pl pl_handler plmodul.so C handler pl_handler Nachteile: Zugriff auf Betriebssystem erforderlich DBS im allgemeinen nur durch DBA möglich plattformabhängig DBS kann nicht optimieren plmodul.so 41 3.2.2 prozedurales SQL (1) 3.2.2 prozedurales SQL (3) SQL nur begrenzte Möglichkeiten (relationale Algebra) => für "inline" Definition von Funktionen ist prozedurale SQL-Erweiterung nötig Installation Sprache in PostgreSQL (durch DBA) 43 a) Compilieren und Bereitstellen Objectfile für den Language Handler (ggf. schon vorinstalliert, z.B. bei plpgsql) b) Deklaration Handler Funktion Ansätze feste Implementierung von PL/SQL im DBS CREATE FUNCTION handler_function_name() RETURNS LANGUAGE_HANDLER AS ’path-to-shared-object’ LANGUAGE C; b) Deklaration der Sprache von Oracle gewählte Lösung PL/SQL immer verfügbar (auch außerhalb von Funktionen!) CREATE [TRUSTED] LANGUAGE language-name HANDLER handler_function_name; Hinweise: Framework zum Bereitstellen von Sprachen für mitgeliefert Sprachen (plpgsql, plperl, ...) kann Script createlang verwendet werden, z.B. createlang plpgsql template1 bei Installation in Template werden Sprachen an (danach!) angelegte Datenbanken vererbt von PostgreSQL gewählte Lösung Sprachen müssen separat ins DBS eingebunden werden Sprache in Funktionsdefinition angeben beliebig erweiterbarer Ansatz 42 44 Dalitz DBS Kap3.1-3 3.2.2 prozedurales SQL (4) 3.2.2 prozedurales SQL (6) Sicherheitsaspekt Beispielfunktion in SQL: -- berechne Bruttobetrag incl. Mwst CREATE FUNCTION bruttofunc(numeric) RETURNS numeric AS ’ SELECT $1 * CAST(1.16 AS numeric); ’ LANGUAGE ’SQL’; Sprachen können Aufruf von System-Kommandos ermöglichen => ggf. Sicherheitsproblem Beispiel: Prozedur xp_cmd_shell in MS SQL-Server => jeder DB-User darf beliebige Systemkommandos mit der Userid ausführen, unter der das DBS läuft Dieselbe Funktion in PL/pgSQL: Lösungsansätze: lasse Systemcalls nicht zu in Sprache ("trusted Language") => Sprache darf von jedem benutzt werden lasse "untrusted Languages" nur für spezielle User zu in PostgreSQL Parameter trusted bei create language Benutzung "untrusted" Language erfordert DBA-Rechte 45 CREATE FUNCTION bruttofunc(numeric) RETURNS numeric AS ’ DECLARE res numeric; BEGIN res := $1 * CAST(1.16 AS numeric); RETURN res; END; ’ LANGUAGE ’plpgsql’; 3.2.2 prozedurales SQL (5) 3.2.2 prozedurales SQL (7) PL/SQL und PL/pgSQL Mögliche Deklarationen: -- normaler SQL-Datentyp name VARCHAR(30); allgemeine Struktur ist blockorientiert: -- Vorbelegung jedesmal, wenn Block aufgerufen menge INT DEFAULT 0; /*oder: menge INT := 0;*/ [ DECLARE declarations ] BEGIN statements END; -- Datentyp von Tabellenattribut übernehmen preis produkt.preis%TYPE; -- Aliasname für Funktionsparameter arg1 ALIAS FOR $1; Statements werden mit Semikolon (;) angeschlossen jedes Statement kann selber wieder Block sein Deklarationen gelten nur im jeweiligen Block begin nicht zu verwechseln mit Transaktionsstart: PostgreSQL erlaubt keine verschachtelten Transaktionen und damit auch keine Transaktionen innerhalb von Funktionen Oracle kennt kein begin work (nur impliziter Transaktionsbeginn) 47 -- zusammengesetzter Datentyp (Tabellentupel) prod produkt%ROWTYPE; 46 -- Platzhalter für SELECT-Ergebnis -- (d.h. ROWTYPE mit beliebiger Struktur) rec RECORD; 48 Dalitz DBS Kap3.1-3 3.2.2 prozedurales SQL (8) 3.2.2 prozedurales SQL (10) Kontrollstrukturen: Multiple-Row Select einfache Variante (nur Postgres): Select in For-Loop Verzweigungen DECLARE rec RECORD; BEGIN FOR rec IN SELECT * FROM produkt LOOP /* Verarbeitung */ END LOOP; END; if - then - [else -] end if; Loops sowohl while- als auch for-Loops: WHILE bedingung LOOP anweisungen END LOOP; FOR var IN start .. ende LOOP anweisungen END LOOP; komplizierte Variante (Postgres und Oracle): Cursor Abbruch aus Schleife mit exit auch Loops über Select-Ergebnisse möglich: FOR rec IN SELECT * FROM produkt LOOP IF (rec.preis < 5) THEN zahler := zaehler + 1; END IF; END LOOP; 49 3.2.2 prozedurales SQL (9) DECLARE cur CURSOR IS SELECT * FROM produkt; BEGIN OPEN cur; LOOP FETCH cur INTO variablelist; EXIT WHEN cur%NOTFOUND; /*Postgres: EXIT WHEN NOT FOUND;*/ /* Verarbeitung */ END LOOP; CLOSE cur; END; 51 3.2.2 prozedurales SQL (11) Überprüfung ob Select Ergebnis lieferte: SQL-Statements Postgres update, insert, delete direkt formulierbar select ist komplizierter: Abfragen globale boolesche Variable found Oracle Was ist, wenn mehr als ein Tupel zurückliefert wird? Wie wird erkannt, ob überhaupt Ergebnis gefunden? wenn select into nichts liefert, wird Exception vom Typ no_data_found geworfen bei fetch into Cursorattribut %NOTFOUND abfragen Single-Row Select Dynamische Statements kann mit select into erfolgen: SELECT max(preis) INTO maxpreis FROM produkt; komplettes Tupel kann in record oder rowtype Variable eingelesen werden; Attributwerte ansprechbar mit rec.att Statements, die erst zur Laufzeit zusammengesetzt werden, können mit execute ausgeführt werden execute auch dann nötig, wenn Statement Tabellen referenziert, deren OID zur Compilezeit noch nicht bekannt ist (trifft z.B. auf DDL-Statements zu) 50 52 Dalitz DBS Kap3.1-3 3.2.2 prozedurales SQL (12) 3.2.2 prozedurales SQL (14) Postgres ermöglicht auch Aggregatfunktionen Fehlerbehandlung Attributwerte erfolgt grundsätzlich über Exceptions Postgres stark eingeschränktes Fehlerhandling: Exceptions können zwar mit raise exception geworfen, aber nicht gefangen werden schlägt SQL-Statement fehl, wird aktuelle Transaktion mit rollback abgebrochen x1 y1 xi x i+1 yi y i+1 xn yn y n+1 Aggregatwert Oracle n+1 ) eigentliche Aggregatdefinition verweist dann auf die zwei Hilfsfunktionen und legt Startwert für Zustandsvariable fest 3.2.2 prozedurales SQL (13) 3.2.3 Trigger (1) Komplettes Beispiel: Was ist ein Trigger? 55 Trigger verknüpfen ein Ereignis in einer Tabelle mit bestimmten Aktionen Lieferung mwst gueltigab# lnr# produkt netto 14.00 16.00 01.01.1990 01.04.1997 1 2 50.12 82.50 datum auslösendes Ereignis kann insert, update oder delete sein; ist immer an genau eine Tabelle gebunden ausgelöste Aktion kann beliebige stored Procedure sein (kann also auch andere Tabellen betreffen) auch als Event-Condition-Action Rules (ECA) bezeichnet 01.12.1992 01.12.1999 Funktion zur Mehrwertsteuerberechnung Trigger können von Anwendern nicht direkt angestossen werden (nur indirekt durch Ereignis) zwei Argumente: Nettobetrag, Datum sucht zu Datum passenden Mwst-Satz und berechnet Bruttobetrag wenn zu Datum kein passender Mwst-Satz hinterlegt => Fehler (Alternative: Rückgabe von NULL) Siehe plsqldemo.tar.gz auf Homepage finalfunc ( y Übergangsfunktion sfunc verarbeitet einzelne Attributwerte Kommunikation über Zustandsvariable (state variable) (optionale) Abschlussfunktion berechnet aus Zustandsvariable den Aggregatwert 53 Pritt Uhu sfunc ( x i , y i ) erfordert Definition zweier Hilfsfunktionen PL/SQL Blöcke haben zusätzlichen exception Abschnitt, in dem auf Exceptions je nach Typ verschieden reagiert werden kann Mwst Zustandsvariable von meisten DBS unterstützt und in SQL3 enthalten, aber zahlreiche Unterschiede im Detail 54 56 Dalitz DBS Kap3.1-3 3.2.3 Trigger (2) 3.2.3 Trigger (4) Wozu sind Trigger gut? Anlegen eines Triggers Automatisierung Ablauflogik CREATE TRIGGER trigger [ BEFORE | AFTER ] event ON relation FOR EACH [ ROW | STATEMENT ] EXECUTE PROCEDURE procedure(); Abläufe können im DB-Server hinterlegt werden, ohne dass Clientprogramm spezielle Funktionen aufrufen muss Abläufe können unabhängig vom Client erzwungen werden auslösendes Ereignis (event) kann insert, update oder delete sein; auch Kombinationen mit or möglich Triggerfunktion kann vor (before) oder nach (after) dem auslösenden Ereignis aufgerufen werden Ausführen für jede vom event betroffene Zeile (for each row) oder nur einmal pro gesamtes Statement (for each statement) Unterschiede im Detail: komplexe Integrity Constraints Variante 1: erzeuge Fehler (Exception) bei Integritätsverletzung Variante 2: korrigiere fehlerhafte Eingabe automatisch Berechnung redundanter Werte aus Performancegründen oft keine Redundanzfreiheit Update-Anomalien können durch Trigger aufgelöst werden execute procedure ist Postgres-spezifisch Oracle erlaubt inline Definition mittels PL/SQL-Block SQL3 verlangt SQL-Code statt Funktionsangabe und erlaubt zusätzliche when Klausel zur Einschränkung des auslösenden Ereignisses Wichtig: nur dosiert und mit Bedacht einsetzen! 57 59 3.2.3 Trigger (3) 3.2.3 Trigger (5) Problematische Eigenschaften von Triggern Die Triggerfunktion Strukturierung CREATE FUNCTION triggerfunc() RETURNS TRIGGER AS ’ ... ’ LANGUAGE ’plpgsql’; es fehlen z.Zt. Abstraktionsmechanismen um Trigger zu logischen Einheiten zusammenzufassen Terminierung Funktion als Triggerfunktion markiert (Rückgabewert trigger) (Achtung: Postgres < 7.3 braucht Rückgabewert opaque) innerhalb der Funktion enthalten spezielle Variablen Informationen über auslösendes Ereignis und Zustand. Variablen sind DBS-spezifisch. Bei Postgres: Operationen in Triggerfunktionen können andere Trigger (evtl. auch sich selber!) auslösen Terminiert diese Triggerkette? Frage ist für beliebige Kombinationen unentscheidbar (vgl. THI) Konfluenz dasselbe Ereignis kann mehrere Trigger parallel auslösen Ist das Ergebnis unabhängig von der Abarbeitungsreihenfolge? auch diese Frage ist im allg. unentscheidbar 58 Variable OLD NEW TG_NAME TG_RELNAME TG_OP Typ RECORD RECORD NAME NAME TEXT Bedeutung Datensatz vor Ausführung Ereignis Datensatz nach Ausführung Ereignis Name auslösender Trigger Name auslösende Tabelle Art auslösendes Ereignis (insert,...) 60 Dalitz DBS Kap3.1-3 3.2.3 Trigger (6) 3.2.3 Trigger (8) Beispiel: Protokollierung letztes Update Komplettes Beispiel: Tabelle habe Attribut lastchange für Zeitpunkt letztes Update Jahresabschluss Definition der Triggerfunktion: CREATE FUNCTION changelog() RETURNS TRIGGER AS ’ begin new.lastchange := current_timestamp; end; return new; ’ LANGUAGE ’plpgsql’; Definition des eigentlichen Triggers: CREATE TRIGGER tg_mytable BEFORE UPDATE ON mytable FOR EACH ROW EXECUTE PROCEDURE changelog(); Kosten lnr# artnr datum 15.01.2001 K001 U003 1 2 kst netto datum 7020 7030 50.12 82.50 01.12.2000 29.02.2002 Verhinderung unzulässiges Kostendatum nach erfolgtem Jahresabschluss dürfen keine Kosten davor mehr angelegt oder geändert werden Tabelle Jahresabschluss enthält letztes Abschlussdatum Trigger auf Kosten überprüft Integritätsbedingung 61 Siehe plsqldemo.tar.gz auf Homepage 63 3.2.3 Trigger (7) 3.2.3 Trigger (9) Trigger für Integrity Constraints Auch Foreign Key Constraints können über Trigger realisiert werden begrenzter Leistungsumfang eingebauter Constraints not null, check bezieht sich nur auf aktuelles Tupel (aber: flexibler, wenn check Subselects zulässt) unique, primary key, foreign key prüfen Vorkommen in Relation Wieviele und was für Trigger sind z.B. für die folgende Foreign Key Constraint erforderlich? Hersteller hnr# name SQL3 assertion hat sich nicht durchgesetzt sehr schwierig zu implementieren Trigger sind flexibler, weil zusätzliche Operationen möglich Trigger können beliebige Bedingungen prüfen durch PL/SQL nicht auf relationale Algebra beschränkt 62 on update cascade Produkt pnr# name hnr preis Tatsächlich realisiert Postgres Foreign Key Constraints intern mit Triggern 64 Dalitz DBS Kap3.1-3 3.2.3 Trigger (10) 3.3 DB-Tuning (2) Trigger zur Berechnung redundanter Werte Ansätze zum Datenbanktuning Wir sahen: Redundanz durch berechnete Attribute kann durch Views vermieden werden gelegentlich aber aus Performancegründen explizites Speichern redundanter Werte erforderlich Update-Anomalien können durch Trigger vermieden werden Konfiguration Nutzung OS-Resourcen *) Indizes Abfragemodifikation Denormalisierung *) Transaktionsablauf Vermeidung Client-Server Pingpong Beispiel: Lagerverwaltung mit Artikeln und Lagerbewegungen Lagerbestand bei jedem Zugriff dynamisch zu berechnen wäre zu aufwändig => hinterlege beim Artikel aktuellen Bestand beim Insert einer Bewegung kann Bestand durch Trigger automatisch aktualisiert werden *) untersuchen wir im Folgenden nicht näher 65 67 3.3 DB-Tuning (1) 3.3 DB-Tuning (3) Ziele Datenmodellierung: Was ist ein Index? einfache und klare Semantik Redundanzfreiheit Datenstruktur, die direkten Zugriff auf Tupel anhand eines Attributwerts ermöglicht (im Ggs. zu sequentiellem Scan) Index wird vom DBS getrennt von Tabelle gespeichert Ziele Datenbanktuning: Was bewirkt ein Index? Beschleunigung von Abfragen hoher Importdurchsatz Vermeidung Verklemmungen (Deadlocks) deutliche Beschleunigung Suche über Attributwert (aber nicht immer: oft auch sequentieller Scan schneller) Beschleunigung Sortierung und Join über Attributwert Verlangsamung Änderungen an Tabelle (Warum?) Beide verfolgen also orthogonale Ziele, beeinflussen sich aber teilweise => ggf. im Einzelfall abwägen Sorgfältige Indexwahl wichtigstes Tuningmittel Fehlender Index häufigstes Performanceproblem 66 68 Dalitz DBS Kap3.1-3 3.3 DB-Tuning (4) 3.3 DB-Tuning (6) Indextypen Gründe für Nichtnutzung von Indizes: normaler Attributindex falsche Statistikinfos zu Tabellen Anlage mit create [unique] index indname on tblname (att1, ...) Achtung: bei Multicolumn Index beschleunigter Zugriff über alle Attribute gemeinsam oder erstes Attribut bei Postgres muss Statistik explizit aktualisiert werden mit analyze (am besten cron Job einrichten; siehe auch autovacuum daemon im contrib-Verzeichnis ab Postgres 7.4) Statistik enthält Zufallsauswahl => ggf. irreführend Bitmap Index Verwendung von Funktionen, Mehrfachindex, pattern matching Operator (like, similar) erheblich schneller auf Attributen mit wenigen Werten partieller Index Ausschließen bestimmter Tupel aus Index Type Mismatch zwischen Feldern funktionaler Index Query Optimizer schwach bei bestimmten Queries Index auf berechnete Werte, z.B. create index ... on lower(att) insbesondere nötig bei Caseinsensitiver Suche 69 bei Joins ggf. explizites join on ausprobieren verschiedene Varianten desselben Statements testen 3.3 DB-Tuning (5) 3.3 DB-Tuning (7) Nutzung von Indizes durch DBS Beispiel für äquivalente Abfragen (vgl. Übungen) 71 DBS benutzt existierende Indizes nicht unbedingt SELECT * FROM person WHERE pnr IN (SELECT regie FROM film); oft ist Zugriff über Index langsamer als squentieller Scan; Query Optimizer trifft Entscheidung aufgrund statistischer Informationen über Tabelleninhalt; ggf. kann Nutzung von Indizes auch immer erzwungen werden (Serverparameter) SELECT * FROM person WHERE EXISTS (SELECT ’ ’ FROM film WHERE regie = person.pnr); meisten DBS bieten SQL Kommando zur Abfrage Query Plan Beispiel: Ausgabe des Postgres SQL-Befehls explain SELECT DISTINCT p.* FROM person p, film f WHERE f.regie = p.pnr; dbname=# explain select b,c from testi where a=99999; NOTICE: QUERY PLAN: Seq Scan on test (cost=0.00..1987.20 rows=1 width=14) SELECT DISTINCT p.* FROM person p INNER JOIN film f ON f.regie = p.pnr; dbname=# explain select b,c from test where a=cast(99999 as int8); NOTICE: QUERY PLAN: Index Scan using test_a_key on test (cost=0.00..3.01 rows=1 width=14) 70 72 Dalitz DBS Kap3.1-3 3.3 DB-Tuning (8) Transaktionsablauf Interaktive Bearbeitung Transaktionen sollten kurz sein (Deadlockgefahr) kein Table-Lock, sondern select for update (Row-Level Lock) Massenimport auf keinen Fall nach jedem Statement commit, besser erst nach Blöcken vieler Datensätze evtl. Indizes vorher droppen und hinterher neuanlegen Trigger und Constraints ggf. droppen/disablen evtl. unterstützt DBS Import am Transaction Manager vorbei (z.B. "raw Import" bei Oracles sqlldr oder Postgres copy) wenn möglich, fsync deaktivieren (Verzicht auf "Durability" in "ACID"); sinnvoll z.B. beim Backup-Einspielen 73 3.3 DB-Tuning (9) Vermeidung Client-Server Pingpong Probleme Client-Server Anwendung Netztransfer großer Datenmengen (bei DB’s meist kein Problem) Ketten von Frage-Antwort Logik Lösungsmöglichkeiten eine komplexe SQL-Abfrage ist sehr viel schneller als viele kleine => fortgeschrittene SQL-Features nutzen (Subquery, Union, ...) Abfragen mittels Views komplett im DB-Server hinterlegen für Abfragen, die mit SQL nicht machbar sind (z.B. transitive Hülle berechnen), stored Procedures schreiben 74 Dalitz DBS Kap3.1-3