# Datenmanagement Diese Datei: https://www.speicherleck.de/iblech/stuff/dama.txt 0. https://xkcd.com/327/ 1. Entity/Relationship-Diagramme 2. Was macht ein gutes relationales Datenbankdesign aus? 3. SQL: die relationale Datenbanksprache 4. Sonstiges: NoSQL, graph-basierte Datenbanken, JSON, Datenschutz und Datensicherheit 5. Live-Demo: Hack via SQL Injection Attack Beispiele für äußerst bekannte (und dennoch freie) Datenbanksysteme sind: - MySQL / MariaDB - PostgreSQL - Sqlite Programme, um eine Sqlite-Datenbank aufzusetzen und zu erkunden: sqlitebrowser sudo apt install sqlitebrowser Schlüssel: Als "Schlüssel" werden die Spalten bezeichnet, mit deren Kenntnis klar wird, um welche Zeile es sich handelt. Zum Beispiel ist Vorname+Nachname KEIN Schlüssel für Personen (weil es Leute mit gleichen Namen gibt). Vorname+Nachname+Geburtsdatum+Geburtsort ist schon eher ein Schlüssel, aber immer noch nicht. Ein tatsächlicher Schlüssel wäre Personalausweisnummer. Erste Normalform: Zelleninhalte müssen atomar sein. Verboten sind Aufzählungen innerhalb von Zelleninhalten. Verboten ist zum Beispiel der Eintrag "Action, Science Fiction" bei der Spalte "Genre". Zweite Normalform: Zusätzlich zur ersten Normalform müssen alle Spalten auch tatsächlich vom Gesamtschlüssel abhängen, anstatt nur von einem Teil des Schlüssels abzuhängen. Verboten ist zum Beispiel die Spalte "Verlagsgründungsjahr", wenn der Gesamtschlüssel aus den Spalten "Buch-ID" und "Verlags-ID" besteht. Denn das Verlagsgründungsjahr erschließt sich aus der Verlags-ID. Die Buch-ID ist unnötig, um das Verlagsgründungsjahr zu bestimmen. Dritte Normalform: Zusätzlich zur zweiten Normalform müssen nun auch noch alle Spalten direkt vom Schlüssel abhängen. Indirekte Abhängigkeiten sind nun verboten. Verboten ist zum Beispiel die Spalte "Klassenlehrername", wenn es noch die Spalten "Schüler-Nr" und "Klasse" gibt, und "Schüler-Nr" der Schlüssel ist. Denn der Klassenlehrername hängt nur mittelbar von der Schüler-Nr ab; unmittelbar hängt er von der Klasse ab (z.B.: Klasse 11a hat als Klassenlehrername Hempels). Alle Schüler derselben Klasse haben denselben Klassenlehrer. https://www.tinohempel.de/info/info/datenbank/normalisierung.htm https://de.wikipedia.org/wiki/Normalisierung_(Datenbank) Aufgabe: Ein E/R-Diagramm zeichnen zu einem Themenfeld der Wahl Ressourcen: - Miro-Board: https://miro.com/app/board/uXjVI3jdLXA=/?inviteKey=ck9MbnpiMTlvVEVRcGFIOSs1cmxianArQU9EYjRLOFZlWng2eWJtZE9RL29US3N1V0JKR0JSNm9rSlB1SVpraktXWkhOaTNCd3VKN1duVlRLbTJBdkRGZ2FQWVNjeVo0OWNQMWU0c3J1dkZzeExuK1hWZTBQbGsyVUlFL2tMNTFQdGo1ZEV3bUdPQWRZUHQzSGl6V2NBPT0hdjE= - Trainer: https://sqltrainer.mischok.academy/ PRAGMA foreign_keys = ON; CREATE TABLE "verlag" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT, "gruendungsjahr" INTEGER ); CREATE TABLE "buch" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "titel" TEXT, "erscheinungsjahr" INTEGER, "veroeffentlicht_durch" INTEGER, FOREIGN KEY(veroeffentlicht_durch) REFERENCES verlag(id) -- Foreign Key, der auf die Spalte id -- der Tabelle verlag verweist ); CREATE TABLE "person" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT, "geburtsjahr" INTEGER ); CREATE TABLE "autorenschaft" ( "autor" INTEGER, "buch" INTEGER, PRIMARY KEY(autor, buch), FOREIGN KEY(autor) REFERENCES person(id), FOREIGN KEY(buch) REFERENCES buch(id) ); CREATE TABLE "uebersetzungsprojekte" ( "uebersetzer" INTEGER, "buch" INTEGER, PRIMARY KEY(uebersetzer, buch), FOREIGN KEY(uebersetzer) REFERENCES person(id), FOREIGN KEY(buch) REFERENCES buch(id) ); INSERT INTO verlag (name, gruendungsjahr) VALUES ("Penguin Books", 1935); INSERT INTO verlag (name, gruendungsjahr) VALUES ("HarperCollins", 1989); INSERT INTO verlag (name, gruendungsjahr) VALUES ("Springer Verlag", 1842); INSERT INTO verlag (name, gruendungsjahr) VALUES ("Suhrkamp Verlag", 1950); INSERT INTO verlag (name, gruendungsjahr) VALUES ("Fischer Verlag", 1886); INSERT INTO buch (titel, erscheinungsjahr, veroeffentlicht_durch) VALUES ("1984", 1949, 1); -- Penguin Books INSERT INTO buch (titel, erscheinungsjahr, veroeffentlicht_durch) VALUES ("The Hobbit", 1937, 2); -- HarperCollins (via Tolkien estate / früher Allen & Unwin → heute bei HC) INSERT INTO buch (titel, erscheinungsjahr, veroeffentlicht_durch) VALUES ("Theoretical Physics", 1934, 3); -- Springer (ein Klassiker aus dem Springer-Programm) INSERT INTO buch (titel, erscheinungsjahr, veroeffentlicht_durch) VALUES ("Der Zauberberg", 1924, 4); -- Suhrkamp (aktuelle Ausgabe) INSERT INTO buch (titel, erscheinungsjahr, veroeffentlicht_durch) VALUES ("Homo Faber", 1957, 5); -- Fischer Verlag INSERT INTO person (name, geburtsjahr) VALUES ("George Orwell", 1903); INSERT INTO person (name, geburtsjahr) VALUES ("J. R. R. Tolkien", 1892); INSERT INTO person (name, geburtsjahr) VALUES ("Wolfgang Pauli", 1900); INSERT INTO person (name, geburtsjahr) VALUES ("Max Frisch", 1911); INSERT INTO person (name, geburtsjahr) VALUES ("Thomas Mann", 1875); INSERT INTO autorenschaft (autor, buch) VALUES (1, 1); -- George Orwell -> "1984" INSERT INTO autorenschaft (autor, buch) VALUES (2, 2); -- J. R. R. Tolkien -> "The Hobbit" INSERT INTO autorenschaft (autor, buch) VALUES (3, 3); -- Wolfgang Pauli -> "Theoretical Physics" INSERT INTO autorenschaft (autor, buch) VALUES (4, 5); -- Thomas Mann -> "Der Zauberberg" INSERT INTO autorenschaft (autor, buch) VALUES (5, 4); -- Max Frisch -> "Homo Faber" INSERT INTO person (name, geburtsjahr) VALUES ("Michael Walter", 1937); -- bekannter Übersetzer (u. a. Orwell) INSERT INTO person (name, geburtsjahr) VALUES ("Margaret Carroux", 1912); -- berühmte Tolkien-Übersetzerin INSERT INTO person (name, geburtsjahr) VALUES ("Ingrid Fuchs", 1954); -- fiktiv, Springer-Fachübersetzerin INSERT INTO person (name, geburtsjahr) VALUES ("Hans Magnus Enzensberger", 1929); -- u. a. Übertragungen klassischer Texte INSERT INTO person (name, geburtsjahr) VALUES ("Claire Malroux", 1935); -- real existierend, Frisch-Übersetzerin (Französisch) INSERT INTO uebersetzungsprojekte (uebersetzer, buch) VALUES (6, 1); -- Michael Walter -> "1984" INSERT INTO uebersetzungsprojekte (uebersetzer, buch) VALUES (7, 2); -- Margaret Carroux -> "The Hobbit" INSERT INTO uebersetzungsprojekte (uebersetzer, buch) VALUES (8, 3); -- Ingrid Fuchs -> "Theoretical Physics" INSERT INTO uebersetzungsprojekte (uebersetzer, buch) VALUES (9, 4); -- Enzensberger -> "Der Zauberberg" (Beispiel) INSERT INTO uebersetzungsprojekte (uebersetzer, buch) VALUES (10, 5); -- Claire Malroux -> "Homo Faber" -- Suche alle Bücher, die von Verlagen veröffentlicht wurden, -- die sich vor 1950 gegründet haben --SELECT buch.titel --FROM buch --JOIN verlag ON verlag.id = buch.veroeffentlicht_durch --WHERE verlag.gruendungsjahr < 1950; -- Suche alle Bücher, die von Claire Malroux übersetzt wurden --SELECT * --FROM buch --JOIN uebersetzungsprojekte ON buch.id = uebersetzungsprojekte.buch --JOIN person ON uebersetzungsprojekte.uebersetzer = person.id --WHERE person.name = 'Claire Malroux'; -- Gib alle Buchtitel mit Autornamen und Verlagsnamen aus --SELECT buch.titel, person.name AS "autorname", verlag.name AS "verlagsname" --FROM buch --JOIN verlag ON verlag.id = buch.veroeffentlicht_durch --JOIN autorenschaft ON autorenschaft.buch = buch.id --JOIN person ON person.id = autorenschaft.autor; --SELECT * --FROM buch --JOIN verlag ON verlag.id = buch.veroeffentlicht_durch; -- Suche alle Bücher, die von wem geschrieben wurden, -- der nach 1900 geboren ist SELECT * FROM buch JOIN autorenschaft ON autorenschaft.buch = buch.id JOIN person ON person.id = autorenschaft.autor WHERE person.geburtsjahr > 1900;