Datenbanken Entity-Relationship-Modell und Datenbankentwurf 1 Andreas Heß Hochschule Furtwangen Inhalte heute • Einführung ins Entity-Relationship-Modell • Einführung ins relationale Modell • Umsetzung vom E/R- ins relationale Modell • Erste SQL-Statements Begriffsklärung Name Vorname Straße PLZ Ort Mail Kemper Alfons Schillerstr. 15 55116 Mainz [email protected] Meier Hans Goethestr. 23a 12345 Mönchengladbach [email protected] Heß Andreas Lessingstr. 25 78120 Furtwangen Zeilen [email protected] Tupel Heß Andreas Goethestr. 39 60318 Frankfurt [email protected] Albrecht Alexandra Marktplatz 1 67543 Heidelberg [email protected] Spalten / Attribute Adressdaten in Datei Name Vorname Straße PLZ Ort Eine Person mit mehreren Schillerstr. 15- wie? 55116 Adressen Mainz Mail Kemper Alfons [email protected] Meier Hans Goethestr. 23a 12345 Mönchengladbach [email protected] Heß Andreas Lessingstr. 25 78120 Furtwangen [email protected] Heß Andreas Goethestr. 39 60318 Frankfurt [email protected] Albrecht Alexandra Marktplatz 1 67543 Heidelberg [email protected] ➔ Manche Informationen doppelt ➔ unklar, ob es sich um die selbe Person handelt Personen identifizieren P-Nr Name Vorname Straße PLZ Ort Mail 1 Kemper Alfons Schillerstr. 15 55116 Mainz 2 Meier Hans Goethestr. 23a 12345 Mönchengladbach [email protected] 3 Heß Andreas Lessingstr. 25 78120 Furtwangen Redundanz! [email protected] [email protected] 3 Heß Andreas Goethestr. 39 60318 Frankfurt [email protected] 4 Albrecht Alexandra Marktplatz 1 67543 Heidelberg [email protected] ➔ Person jetzt eindeutig identifiziert Primärschlüssel? Konzeptuelles Modell • Wildes „Herumschrauben“ an Tabellen ist nicht zielführend • Was wir brauchen ist ein sauberer Entwurf! ONE DOES NOT SIMPLY CREATE A DATABASE Modell: Abbild der Welt • Überlegungen: • Welche Dinge gibt es in der realen Welt? • Welche Eigenschaften haben sie? • Wie stehen sie miteinander in Beziehung? Entity-RelationshipModell nach Chen, 1976; siehe auch Kemper, 7. Aufl., S. 37ff Attribut Name Vorname n Person Entitätstyp Straße wohnt m Hausnr Wohnung n Beziehungstyp PLZ liegt in Schlüssel identifiziert die Entität eindeutig 1 Ortsname Ort Abbildung auf Tabellen • Welche Tabellen braucht man? • Wie sehen sie aus? Person PNr 1 2 3 4 5 Name Kemper Meier Heß Meyer-Heß Albrecht Vorname zusammengesetzter Primärschlüssel WNr Alfons Straße Hausnr PLZ 1 Schillerstraße 15 55116 2 Goethestraße 23a 12345 3 Lessingstraße 25 78120 4 Goethestraße 39 60318 5 Marktplatz 1 78120 Hans Andreas Anke Alexandra (künstlicher) Primärschlüssel Beziehungstabelle Wohnung Fremdschlüssel wohnt PNr WNr 1 2 2 1 3 3 3 (natürlicher) Primärschlüssel Ort PLZ Ortsname 55116 Mainz 4 12345 M‘gladbach 4 4 78120 Furtwangen 5 5 60318 Frankfurt Primärschlüssel • Primärschlüssel (primary key; PK) identifiziert eine Zeile der Tabelle eindeutig • Bei zusammengesetztem PK: Kombination der Werte aller Spalten des PK muss eindeutig sein Fremdschlüssel • Fremdschlüssel (foreign key; FK) stellen Beziehungen zu Zeilen anderer Tabellen her • FK-Spalte einer Tabelle bezieht sich auf Spalte einer anderen Tabelle* • Für FK nur Werte erlaubt, die auch in der Spalte, auf die er sich bezieht, existieren *) fast immer eine PK-Spalte Umwandlung vom E/RModell in Tabellen • E/R-Modell rein konzeptuell • Für DBMS Umwandlung in Tabellen nötig • Entitätstypen ➜ Tabellen • Attribute ➜ Spalten • 1:N-Beziehungstypen ➜ FK auf N-Seite • N:M-Beziehungstypen ➜ Beziehungstabelle Beziehungstabellen • Bei N:M-Beziehungen nötig • Spalten: • FK für jeden beteiligten Entitätstyp • PK zusammengesetzt aus den FK Datenbankentwurf • Drei Ebenen des Entwurfs: • konzeptuelle Ebene • Implementationsebene • physische Ebene Auf welchen Ebenen haben wir bisher gearbeitet? Entwurfsebenen • Konzeptuelle Ebene: • Entity-Relationship-Modell • Implementationsebene: • Tabellen (Relationenmodell) • Physische Ebene • vom DBMS verwaltet Entity-Relationship-Modell • Modellierung von Entitäten (Gegenständen) und Beziehungen zwischen diesen Entitäten • Konzeptuelles Modell Als konzeptuelles Modell komplett unabhängig von einem konkreten Typ von DBMS! Datenbank-Architektur Sicht 1 Sicht 2 ... logische Ebene Sicht n ANSI-SPARC- Architektur physische Ebene logische Ebene ANSI/SPARC-Modell • Auf welcher Ebene spielt sich das alles ab? • Welche Rolle könnten Sichten spielen? ANSI/SPARC-Modell • Tabellen auf der logischen Ebene • physische Ebene: vom DBMS verwaltet • Sichten: stellen für Anwendung aufbereitete Version der Daten zur Verfügung (hier z.B. vollständige Adresse mit Name und Ort) Relationales Modell • Modellierung als Tabellen (Relationen) • Implementierungsebene Die meisten aktuellen DBMS sind relationale DBMS (RDBMS), speichern also Daten in Tabellen ! Relationen ? • Verwechslungsgefahr! • Relationen ≠ Beziehungen! • Bißchen Mathematik zur Erklärung... Relationen R ⊆ D1 × D2 × ... × Dn • Relation ist Teilmenge des kartesischen Produkts (Kreuzprodukts) der Mengen D1 bis Dn • Mengen D bis Dn heißen Domänen oder Wertebereiche 1 Relationen: Beispiel R ⊆ D1 × D2 × ... × Dn Personen ⊆ integer × string × string • Relation = Tabelle • Domänen = Datentypen • Elemente von R = Tupel = Zeilen PersNr Personen Name Vorname 1 Kemper Alfons 2 Meier Hans 3 Heß Andreas Übung • Umwandlung eines E/R-Modells in Tabellen E-Commerce Name Vorname Person 1 Zeit beauftragt n Bestellformular m Produkt ArtNr Preis n enthält Menge Bezeichnung Farbe Beziehungen können auch Attribute haben! Person PNr Bestellformular Name Vorname AuftrNr PersNr Zeit 1 Kemper Alfons 34 3 2017-03-27 13:37 2 Meier Hans 35 4 2017-03-28 20:25 3 Heß Andreas 36 4 2017-03-29 12:05 4 Meyer-Heß Anke 5 Albrecht Alexandra enthaelt Produkt ArtNr 21 22 23 24 25 Bezeichnung Zahnbürste iPhone 7 Gummientchen Laufband Laufschuhe Farbe rosa schwarz gelb schwarz blau Preis 0,99 800,00 4,50 ArtNr AuftrNr Menge 21 34 5 23 34 1 22 35 1 24 36 1 25 36 1 1250,00 123,75 Attribute in Beziehungstabellen • Falls Beziehungstyp Attribute hat: • zusätzliche Spalte für jedes Attribut • gleiches Vorgehen wie bei Entitätstypen Datentypen • Welche Datentypen sollen die Spalten der Tabellen bekommen? Datentypen in DBMS INTEGER ganze Zahlen NUMERIC(n,m), DECIMAL(n,m) Dezimalzahlen FLOAT(n), DOUBLE, REAL Gleitkommazahlen CHARACTER(n), VARCHAR(n) Zeichenketten DATE, TIME, TIMESTAMP Datum und Zeit BLOB, CLOB große Daten BOOLEAN wahr / falsch Datentypen in DBMS INTEGER ganze Zahlen NUMERIC(n,m), DECIMAL(n,m) Dezimalzahlen FLOAT(n), DOUBLE, REAL Gleitkommazahlen CHARACTER(n), VARCHAR(n) Zeichenketten NUMERIC/DECIMAL DATE, TIME, TIMESTAMP Dezimalzahlen Datum und Zeit FLOAT/DOUBLE/REAL binäre große Gleitkommazahlen BLOB, CLOB Daten BOOLEAN wahr / falsch bei binären Gleitkommazahlen: Gefahr von Rundungsungenauigkeiten Datentypen in DBMS INTEGER ganze Zahlen NUMERIC(n,m), DECIMAL(n,m) Dezimalzahlen FLOAT(n), DOUBLE, REAL Gleitkommazahlen CHARACTER(n), VARCHAR(n) Zeichenketten DATE, TIME, TIMESTAMP Datum und Zeit BOOLEAN wahr / falsch CHAR immer feste Länge BLOB, CLOB große Daten VARCHAR variabel bis zur festgelegten Maximallänge Datentypen in DBMS INTEGER ganze Zahlen NUMERIC(n,m), DECIMAL(n,m) Dezimalzahlen FLOAT(n), DOUBLE, REAL Gleitkommazahlen CHARACTER(n), VARCHAR(n) Zeichenketten DATE, TIME, TIMESTAMP Datum und Zeit BLOB, CLOB große Daten BOOLEAN wahr / falsch Werden vom DBMS nur gespeichert und gelesen, aber können nicht verarbeitet werden. NULL • Undefinierte bzw. unbekannte Werte können mit NULL gekennzeichnet werden • NULL ist nicht 0 ! n i Darf ein Primärschlüssel NULL sein? e N Relationales Modell • Schreibweise für relationales Modell: Relation : {[ Primärschlüssel : Datentyp, Attribut : Datentyp, Fremdschlüsselattribut : Datentyp ( ➚ Relation) ]} Beispiel: Adresse : {[ AdressID : INTEGER, PLZ : DECIMAL(5,0) ( ➚ Orte), Strasse : VARCHAR(50) ]} SQL • Structured Query • ANSI / ISO standardisiert • DDL und DML für RDBMS 1 Language 1) früher; heute steht laut ANSI der Name für sich SQL: DDL Tabellen erstellen CREATE TABLE tabelle ( spalte DATENTYP, spalte DATENTYP, ... ); SQL: DDL Tabellen erstellen - Beispiel CREATE TABLE personen ( nummer INTEGER, name VARCHAR(100), vorname VARCHAR(100) ); SQL: DDL Primärschlüssel CREATE TABLE personen ( nummer INTEGER PRIMARY KEY, name VARCHAR(100), vorname VARCHAR(100) ); Generierte Schlüssel • Manchmal bietet sich von den Attributen keines als natürlicher Schlüssel an. • Dann fügt man einen künstlichen Schlüssel bzw. Surrogatschlüssel hinzu. • Besser als einen eindeutigen Wert selber auszudenken ist, einen Schlüssel vom DBMS generieren zu lassen! Generierte Schlüssel • r e Manchmal bietet sich von den Attributen z t u n e B e n r e e d r h keines als natürlicher Schlüssel an. g i e t i M e z n i h e c i e e t l g n ! n n n ö e l e k t h n ä ? n n w i ö Was Dann e t k s r fügt man einen künstlichen Schlüssel i e e b W a d n e m b e l l e s Prob bzw. Surrogatschlüssel hinzu. • • Besser als einen eindeutigen Wert selber auszudenken ist, einen Schlüssel vom DBMS generieren zu lassen! SQL: DDL Primärschlüssel generieren lassen CREATE TABLE personen ( nummer INTEGER PRIMARY KEY AUTO_INCREMENT, L Q S name VARCHAR(100), y M r vorname VARCHAR(100) nu ); SQL: DDL Primärschlüssel generieren lassen CREATE TABLE personen ( nummer INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, SQ L-S tan name VARCHAR(100), dar d vorname VARCHAR(100) ); SQL: DDL Primärschlüssel generieren lassen CREATE TABLE personen ( nummer INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY, SQ L-S tan name VARCHAR(100), dar d vorname VARCHAR(100) ); SQL: Zusammengesetzte Primärschlüssel CREATE TABLE Tabelle ( …, PRIMARY KEY(spalte1, spalte2) ); SQL: DDL NULL-Werte zulassen / verbieten CREATE TABLE personen ( nummer INTEGER PRIMARY KEY, name VARCHAR(100) NOT NULL, vorname VARCHAR(100) NOT NULL ); PRIMARY KEY impliziert NOT NULL SQL: DDL Fremdschlüssel SQ CREATE TABLE adressen ( L-S t and person INTEGER ard REFERENCES personen, strasse VARCHAR(100) NOT NULL, plz CHAR(5) von MySQL REFERENCES orte ignoriert! ); SQL: DDL Fremdschlüssel SQ L-S tan dar d auch MySQ CREATE TABLE adressen ( L person INTEGER NOT NULL, strasse VARCHAR(100) NOT NULL, plz CHAR(5) NOT NULL, FOREIGN KEY (person) REFERENCES Person(PNr) ); SQL: DML Daten einfügen INSERT INTO personen VALUES ( 1, 'Kemper', 'Alfons'); INSERT INTO personen(Name, Vorname) VALUES ('Kemper', 'Alfons'); (z.B. falls Spalten leer bleiben sollen oder generierte Schlüssel sind) SQL: DML Daten abfragen SELECT * FROM personen WHERE nummer = 1; WHERE kann auch weggelassen werden, dann werden alle Zeilen ausgegeben. SQL: DML Daten ändern UPDATE personen SET vorname = 'Hans' WHERE nummer = 1; SQL: DML Daten löschen DELETE FROM personen WHERE nummer = 1; Was passiert wohl, wenn man WHERE weglässt? WHERE kann auch weggelassen werden, dann werden alle Zeilen gelöscht! SQL Konsistenz bei Fremdschlüsseln CREATE TABLE adressen ( person INTEGER REFERENCES personen, ...); INSERT INTO adressen VALUES ( 12345, 'Hauptstr. 5', '78120'); 12345 sei kein Primärschlüssel einer Zeile in Tabelle personen - Was passiert? SQL Konsistenz bei Fremdschlüsseln CREATE TABLE adressen ( person INTEGER REFERENCES personen, ...); INSERT INTO adressen VALUES ( 12345, 'Hauptstr. 5', '78120'); Fehlermeldung, wenn 12345 kein Primärschlüssel einer Zeile in Tabelle personen BIS GLEICH IM PRAKTIKUM!