Klausurzusammenfassung: Datenbanken - Praktische Umsetzung

SQL, PostgreSQL, DB-seitige Programmierung, Transaktionen, JDBC/JPA, verteilte Datenbanken und NoSQL

Grundlage: vollständige Analyse der bereitgestellten Vorlesungsskripte aus temp_db-praktisch: 8 Skripte mit 485 Vorlesungsseiten plus 7 Seiten Übungsklausur, insgesamt 492 PDF-Seiten.

1. Stoffkarte und Prüfungskern

Der Kurs behandelt Datenbanken aus praktischer Sicht: SQL-Syntax sicher anwenden, PostgreSQL-Objekte erstellen, Daten konsistent ändern, Abfragen interpretieren, Logik in Datenbank und Anwendung sauber trennen, Transaktionen verstehen und relationale Systeme von NoSQL-Systemen abgrenzen. Die Übungsklausur zeigt, dass nicht nur Definitionen, sondern konkrete Befehle, Ergebnisermittlung und kurze Codeergänzungen erwartet werden können.

Prüfungskern: Eine gute Lösung verbindet Syntax und Datenbanklogik. Typische Kette: Schema verstehen → Schlüssel/Constraints erkennen → passenden SQL-Befehl wählen → WHERE/GROUP/JOIN korrekt setzen → Nebenwirkungen auf Integrität, Transaktion und Performance prüfen Fehler entstehen meist nicht durch fehlende Stichwörter, sondern durch falsche Reihenfolge, fehlende WHERE-Klauseln, falsche JOIN-Bedingungen, unklare Transaktionsgrenzen oder unpassende NoSQL-Abgrenzung.

Gliederung

  1. Grundlagen, Architektur und Datenmodelle
  2. PostgreSQL, DBeaver und SQL-Konventionen
  3. DDL, Datentypen und Integritätsbedingungen
  4. DML: INSERT, UPDATE, DELETE
  5. DQL: SELECT, WHERE, GROUP BY, JOINs, Subqueries
  6. Views, Index, Rechte und Systemkatalog
  7. DB-seitige Programmierung: Functions, Procedures, Trigger
  8. Transaktionen, Isolation, Locks, 2PL und 2PC
  9. JDBC, REST, JPA und ORM
  10. Relationale Erweiterungen, HANA und verteilte Datenbanken
  11. NoSQL: Redis, MongoDB, Cassandra, Neo4j und Polystores
  12. Klausurtraining, Checkliste, Fragen und Abdeckung

2. Grundlagen, Architektur und Datenmodelle

2.1 Daten, Information, Wissen

Begriff Kernidee Beispiel Prüfungshinweis
Daten Isolierte, uninterpretierte Fakten oder Kennwerte. Name = Meier, Ort = Tübingen. Ohne Semantik sind Daten noch keine Information.
Information Daten mit Bedeutung und Kontext. Herr Meier wohnt in Tübingen. Entsteht durch Verknüpfung und Interpretation.
Wissen Verarbeitete Information mit Bezug zu Erfahrung und Handlungsfähigkeit. Die Adresse gehört zu einem bekannten Kontakt. Wissen ist stärker subjekt- und nutzungsbezogen.

2.2 Datenbank, DBMS, Datenbanksystem

Datenbank: Logische Einheit zusammengehörender Daten einschließlich Metainformationen. Beispiel: eine PostgreSQL-Datenbank.
Datenbank-Management-System (DBMS): Softwarewerkzeug zum Erstellen, Füllen, Abfragen, Sichern und Verwalten von Datenbanken. Beispiel: die PostgreSQL-Installation auf einem Server.
Datenbanksystem (DBS): Funktionale Einheit aus Datenbank und DBMS.

Ein DBMS übernimmt exklusiven physischen Datenzugriff, Konsistenz- und Integritätssicherung, zentrale Zugriffskontrolle sowie interne Hintergrundprozesse wie Optimierung, Logging, Backup und Rechteprüfung. Für die Klausur ist wichtig: Anwendungen sollen nicht direkt an physischen Dateien arbeiten, sondern über das DBMS.

2.3 Datenbanksprachen

Kategorie Zweck Typische Befehle Prüfungsfalle
DDL Strukturen definieren und ändern. CREATE, ALTER, DROP CREATE erzeugt Objekte, keine Datensätze.
DML Daten verändern. INSERT, UPDATE, DELETE Ohne WHERE ändern/löschen UPDATE und DELETE sehr viele Zeilen.
DQL Daten abfragen. SELECT, FROM, WHERE, JOIN, GROUP BY Syntaxreihenfolge und logische Abarbeitungsreihenfolge sind nicht identisch.
DCL/TCL Rechte und Transaktionen steuern. GRANT, REVOKE, COMMIT, ROLLBACK Transaktionssteuerung ist nicht in Functions erlaubt, aber in Procedures möglich.

2.4 ANSI-SPARC und Datenmodelle

ANSI-SPARC Drei-Schichten-Architektur
ANSI-SPARC: Externe Sicht, konzeptionelle/logische Sicht und interne physische Speicherung trennen Benutzerperspektive, fachliches Datenmodell und technische Ablage.

Die Drei-Schichten-Architektur erklärt Datenunabhängigkeit: Fachliche und externe Sichten sollen möglichst stabil bleiben, auch wenn sich physische Speicherung oder interne Optimierungen ändern. In praktischen Aufgaben zeigt sich das später bei Views, JDBC/JPA und REST-Backends.

Konzeptionelles Modell

Beschreibt die Miniwelt fachlich, etwa mit Entities, Beziehungen und Kardinalitäten. Es ist DBMS-unabhängig und dient als Brücke zwischen Realität und Datenbankschema.

Relationales Modell

Bildet Daten als Relationen mit Attributen, Tupeln, Domänen, Primärschlüsseln und Fremdschlüsseln ab. Beziehungen werden in Tabellen über Schlüsselwerte realisiert.

Relationales Datenmodell als Industrie-Standard
Das relationale Modell ist der zentrale Ausgangspunkt für SQL, Integrität, Transaktionen und die spätere Abgrenzung zu NoSQL-Systemen.

3. PostgreSQL, DBeaver und SQL-Konventionen

3.1 Warum PostgreSQL im Kurs?

PostgreSQL ist frei, quelloffen, nah am ANSI-SQL-Standard und unterstützt vollständige ACID-Transaktionen, auch für DDL. Es ist stark erweiterbar: eigene Datentypen, Funktionen, Operatoren, Stored Procedures, PL/pgSQL und weitere Prozedursprachen sowie JSON/JSONB-Unterstützung sind möglich. Dadurch eignet es sich sowohl didaktisch als auch praktisch.

3.2 DBeaver

DBeaver ist ein plattformunabhängiger Universal-Datenbankclient. Es bietet SQL-Editor, Syntax-Highlighting, Autovervollständigung, ER-/Relationsschema-Visualisierung sowie Import/Export. Wichtig: Die DBeaver-Visualisierung wird oft als ER-Modell bezeichnet, zeigt praktisch aber das Relationenschema mit Tabellen und Fremdschlüsseln.

3.3 SQL-Konventionen

Prüfungsfalle: Ein Stern in SELECT * ist praktisch bequem, aber in Klausurantworten oft unpräzise. Wenn konkrete Attribute gefragt sind, explizit projizieren.

4. DDL, Datentypen und Integritätsbedingungen

4.1 Schema und Tabelle erstellen

CREATE SCHEMA employees;
SET SCHEMA 'employees';

CREATE TABLE emp_employee (
  emp_id INTEGER,
  emp_email VARCHAR(50),
  emp_first_name VARCHAR(50),
  emp_last_name VARCHAR(50),
  PRIMARY KEY (emp_id)
);

Ein DBMS kann mehrere Datenbanken verwalten, innerhalb einer Datenbank organisieren Schemas die Tabellen. Tabellen bestehen aus Spaltendefinitionen mit Name, Datentyp und optionalen Constraints.

4.2 PostgreSQL-Datentypen

Gruppe Typen Verwendung Falle
Text CHAR(n), VARCHAR(n), TEXT CHAR(n) feste Länge, VARCHAR(n) variable Länge, TEXT lange Texte. CHAR(n) füllt kurze Werte mit Leerzeichen auf.
Ganzzahlen SMALLINT, INTEGER, BIGINT, SERIAL Zähler, IDs, Mengen. SERIAL erzeugt intern Sequenz plus NOT NULL. SERIAL ist kein Standard-SQL-Typ.
Fest-/Fließkomma NUMERIC(p,s), DECIMAL(p,s), REAL, DOUBLE PRECISION NUMERIC/DECIMAL für exakte Werte wie Geld; REAL/DOUBLE PRECISION für approximative Werte. Für Währungen keine ungenauen Fließkommatypen verwenden.
Zeit DATE, TIME, TIMESTAMP, TIMESTAMPTZ Datum, Uhrzeit, Zeitpunkte mit oder ohne Zeitzone. Zeitzonenverhalten explizit bedenken.
Weitere BOOLEAN, BLOB, JSON/JSONB Wahrheitswerte, Binärdaten, semistrukturierte Daten. Dateien werden oft besser als Pfad/Objekt in externem Speicher abgelegt.

4.3 ALTER und DROP

DROP SCHEMA employees;
DROP TABLE emp_employee;

ALTER TABLE emp_employee ADD COLUMN birth_date DATE;
ALTER TABLE emp_employee DROP COLUMN first_name;

CREATE legt Objekte an, ALTER verändert bestehende Objekte, DROP löscht ganze Objekte. Das ist strukturelle Arbeit, keine Datensatzmanipulation.

4.4 Constraints

Constraint Wirkung Beispiel Merken
NOT NULL Spalte darf nicht leer sein. emp_email VARCHAR(50) NOT NULL Nur inline, nicht separat benennbar.
DEFAULT Setzt Standardwert bei fehlender Angabe. status TEXT DEFAULT 'neu' Ersetzt keine fachliche Prüfung.
UNIQUE Werte müssen eindeutig sein. emp_email VARCHAR(50) UNIQUE Kann mehrfach pro Tabelle vorkommen.
CHECK Prüft logische Bedingung. CHECK (emp_age >= 16) Gut für Wertebereiche und einfache Geschäftsregeln.
PRIMARY KEY Eindeutig und nicht NULL. PRIMARY KEY (emp_id) Primärschlüssel ist indiziert.
FOREIGN KEY Verweist auf Primärschlüssel einer anderen Tabelle. FOREIGN KEY (emp_pro_id) REFERENCES pro_project(pro_id) Fremdschlüsselwerte dürfen mehrfach vorkommen und können NULL sein, wenn nicht anders eingeschränkt.

4.5 Referentielle Integrität

Fremdschlüssel und referentielle Integrität
Fremdschlüssel modellieren Beziehungen zwischen Tabellen. Das DBMS erzwingt, dass referenzierte Schlüssel existieren oder der Fremdschlüssel NULL ist.
CREATE TABLE pro_project (
  pro_id SERIAL,
  pro_name VARCHAR(255),
  PRIMARY KEY (pro_id)
);

CREATE TABLE emp_employee (
  emp_id SERIAL,
  emp_pro_id INTEGER,
  emp_email VARCHAR(50),
  PRIMARY KEY (emp_id),
  CONSTRAINT fk_employee_project
    FOREIGN KEY (emp_pro_id)
    REFERENCES pro_project(pro_id)
    ON DELETE SET NULL
);
Option Bei DELETE/UPDATE des referenzierten Datensatzes Typischer Einsatz
NO ACTION / RESTRICT Operation wird verhindert, solange abhängige Datensätze existieren. Starke fachliche Abhängigkeit, kein automatisches Löschen.
CASCADE Änderung/Löschung wird auf abhängige Tabelle weitergegeben. Nur verwenden, wenn abhängige Daten ohne Elternsatz fachlich wertlos sind.
SET NULL Fremdschlüssel wird auf NULL gesetzt. Beziehung ist optional, Datensatz soll erhalten bleiben.
Prüfungsfalle: Ein zusammengesetzter Primärschlüssel aus Vor- und Nachname ist fachlich schwach: Namen sind nicht stabil und nicht eindeutig. In praktischen Schemata sind surrogate keys wie IDs oft robuster.

5. DML: INSERT, UPDATE, DELETE

5.1 INSERT

INSERT INTO employee (id, email, first_name, last_name)
VALUES (1, 'worker@comp.de', 'Max', 'Muster');

INSERT INTO employee (id, email, first_name, last_name)
VALUES
  (2, 'a@comp.de', 'Anna', 'Auer'),
  (3, 'b@comp.de', 'Ben', 'Bauer');

Beim Einfügen aus einer anderen Tabelle ohne Spaltenliste müssen Anzahl und Typen der Spalten identisch sein. In Klausurantworten ist eine explizite Spaltenliste meistens sicherer.

5.2 UPDATE

UPDATE employee
SET last_name = 'Mustermann',
    first_name = 'Maxi'
WHERE email = 'worker@comp.de'
  AND last_name = 'Muster';

UPDATE bezieht sich auf eine Tabelle. Die WHERE-Klausel filtert die betroffenen Datensätze. Bestehende Inhalte können zur Berechnung neuer Werte genutzt werden, etwa bei Preiserhöhungen.

5.3 DELETE

DELETE FROM employee
WHERE email = 'worker@comp.de';
Häufiger Fehler: UPDATE employee SET active = false; und DELETE FROM employee; betreffen alle Zeilen. In Prüfungen immer fragen: Welche Zeilen sollen wirklich betroffen sein?

6. DQL: SELECT, WHERE, GROUP BY, JOINs, Subqueries

6.1 Grundform und logische Reihenfolge

SELECT c.country, COUNT(*) AS anzahl
FROM customer AS c
WHERE c.country IS NOT NULL
GROUP BY c.country
HAVING COUNT(*) > 1
ORDER BY anzahl DESC
LIMIT 10;
Logische Abarbeitungsreihenfolge eines SELECT-Befehls
Syntax und Ausführung sind nicht gleich: Tabellen/JOINs entstehen vor WHERE, danach Projektion, Gruppierung, HAVING, Mengenoperationen und Sortierung.
Bestandteil Aufgabe Klausurregel
SELECT Spalten/Expressionen für Ergebnis auswählen. Projektion: Nur ausgeben, was gefragt ist.
FROM Tabellen und JOIN-Quellen bestimmen. Mehrere Tabellen ohne JOIN/WHERE ergeben kartesisches Produkt.
WHERE Zeilen vor Gruppierung filtern. Keine Aggregatfilter, dafür HAVING.
GROUP BY Zeilen zu Gruppen zusammenfassen. Im SELECT nur Gruppierungsspalten oder Aggregatfunktionen.
HAVING Gruppen nach Aggregation filtern. Typisch mit COUNT, SUM, AVG.
ORDER BY Ergebnis sortieren. Ohne ORDER BY ist LIMIT nicht deterministisch.

6.2 Alias, DISTINCT und Multimengen

Aliase verbessern Lesbarkeit und sind bei mehrfachen Tabellen notwendig, wenn Spalten gleich heißen. DISTINCT entfernt Dubletten. Standard-SQL-Ergebnisse sind aber Multimengen: gleiche Zeilen dürfen mehrfach vorkommen, bis DISTINCT explizit gesetzt wird.

SELECT DISTINCT c.first_name AS vorname
FROM customer AS c;

6.3 Aggregatfunktionen und NULL

Funktion Bedeutung NULL-Verhalten
COUNT(*) Zählt Zeilen. Zählt auch Zeilen mit NULL-Werten.
COUNT(spalte) Zählt nicht-NULL-Werte der Spalte. NULL wird ignoriert.
COUNT(DISTINCT spalte) Zählt unterschiedliche nicht-NULL-Werte. Dubletten und NULL werden nicht mitgezählt.
SUM, AVG, MIN, MAX Aggregieren Werte. NULL-Werte werden ignoriert.
Prüfungsfalle: SELECT COUNT(*), emp_id FROM emp_employee; ist ohne GROUP BY logisch falsch, weil eine Gesamtaggregation mit einer einzelnen Zeilenspalte vermischt wird.

6.4 WHERE-Bedingungen

Operator Beispiel Hinweis
=, <>, <, > age < 30 Normale Vergleiche.
AND, OR, NOT first_name <> 'Karl' AND age < 30 Klammern nutzen, wenn Priorität unklar ist.
LIKE first_name LIKE 'K%' % beliebig viele Zeichen, _ genau ein Zeichen.
BETWEEN age BETWEEN 16 AND 30 Entspricht inklusive Bereichsgrenzen.
IS NULL first_name IS NOT NULL = NULL und <> NULL sind falsch.
IN first_name IN ('Karl', 'Foo') Prüft Mitgliedschaft in Wertemenge.
ANY, ALL age > ALL (...) ANY mindestens ein Element, ALL alle Elemente.

6.5 Datum, Textfunktionen und Type Casts

Datum/Zeit
SELECT CURRENT_TIMESTAMP;
SELECT EXTRACT(MONTH FROM '2025-09-12'::DATE);
SELECT CURRENT_DATE + INTERVAL '7 days';
Zeichenketten
SELECT UPPER('sql'), LOWER('SQL');
SELECT LENGTH('Hochschule');
SELECT TRIM('   Text   ');
SELECT SUBSTRING('Datenbank' FROM 6 FOR 4);
SELECT CONCAT('Max', ' ', 'Muster');
Type Casts
SELECT '123'::INTEGER;
SELECT CAST('2025-09-12' AS DATE);
Sortieren und Begrenzen
SELECT *
FROM orderitem
ORDER BY ordered_qty DESC
LIMIT 1 OFFSET 10;

6.6 GROUP BY und HAVING

SELECT country, COUNT(country) AS count
FROM xcustomer
GROUP BY country
HAVING COUNT(country) > 1;

Aus der Übungsklausur ergibt diese Abfrage für die gegebene Tabelle die Länder, die mehr als einmal vorkommen: Canada, Brazil und USA mit jeweils 2.

Prüfungsfalle: WHERE filtert einzelne Zeilen vor der Aggregation. HAVING filtert Gruppen nach der Aggregation. Eine Bedingung wie COUNT(*) > 1 gehört in HAVING.

6.7 Unterabfragen

Unterabfragen können als Wert, Wertemenge, Inline View im FROM-Teil oder korrelierte Unterabfrage verwendet werden. Eine korrelierte Unterabfrage hängt von der äußeren Abfrage ab und wird logisch für jede relevante äußere Zeile ausgewertet.

SELECT c.customer_id, c.last_name
FROM customer AS c
WHERE EXISTS (
  SELECT 1
  FROM invoice AS i
  WHERE i.customer_id = c.customer_id
);
Form Typischer Einsatz Falle
Unabhängige Subquery Filterwert oder Filtermenge zuerst bestimmen. Rückgabetyp muss zum Operator passen.
Korrelierte Subquery Existenzprüfung je äußerer Zeile. Kann teuer sein; JOIN kann lesbarer oder performanter sein.
Inline View Zwischenergebnis im FROM-Teil. Alias ist Pflicht.

6.8 JOINs

JOIN-Arten mit INNER, LEFT und RIGHT JOIN
JOINs ersetzen das kartesische Produkt plus WHERE-Verknüpfung durch explizite Beziehungssyntax. Das ist lesbarer und weniger fehleranfällig.
SELECT al.title, ar.name
FROM album AS al
JOIN artist AS ar
  ON al.artist_id = ar.artist_id
WHERE ar.name = 'Metallica';
JOIN Ergebnis Typische Aufgabe
INNER JOIN Nur passende Zeilen beider Tabellen. Normalfall bei Pflichtbeziehung.
LEFT OUTER JOIN Alle linken Zeilen, rechts NULL falls kein Match. Finde Datensätze ohne Zuordnung.
RIGHT OUTER JOIN Alle rechten Zeilen, links NULL falls kein Match. Seltener; oft als LEFT JOIN umschreiben.
SELF JOIN Tabelle wird mit sich selbst verknüpft. Hierarchien, Mitarbeiter/Vorgesetzter.
CROSS JOIN Kartesisches Produkt. Nur bewusst verwenden.
JOIN-Falle: Filter auf der rechten Tabelle eines LEFT JOIN im WHERE-Teil können aus dem Outer Join faktisch einen Inner Join machen. Solche Filter oft in die ON-Bedingung legen oder NULL-Fall explizit berücksichtigen.

6.9 Mengenoperationen

UNION, INTERSECT und EXCEPT kombinieren Ergebnismengen. Die beteiligten SELECTs müssen kompatible Spaltenanzahl und Datentypen liefern. UNION entfernt Duplikate, UNION ALL behält sie.

7. Views, Index, Rechte und Systemkatalog

7.1 Views

Views sind gespeicherte Abfragen, die sich nach außen wie Tabellen verhalten. Sie dienen als Abstraktionsschicht, zur Wiederverwendung komplexer SELECTs, für Berichte, Geschäftsregeln und Sicherheit.

CREATE VIEW mitarbeiter_namen AS
SELECT id, vornamen, nachname
FROM mitarbeiter;

CREATE VIEW mitarbeiter_namen2 (nummer, vname, nname) AS
SELECT id, vornamen, nachname
FROM mitarbeiter;

DROP VIEW mitarbeiter_namen;
Bedingungen für Änderungsoperationen über Views
Views sind nur unter engen Bedingungen änderbar, etwa wenn sie auf einer Relation ohne GROUP BY, DISTINCT, Berechnungen und Mengenoperatoren basieren.

7.2 Index

CREATE INDEX idx_invoice_country ON invoice(billing_country);
CREATE UNIQUE INDEX idx_user_email ON app_user(email);
EXPLAIN SELECT * FROM invoice WHERE billing_country = 'Germany';

Indizes verbessern Lesezugriffe, verschlechtern aber Schreiboperationen, weil der Index bei INSERT, UPDATE und DELETE mitgepflegt werden muss. Primärschlüssel sind indiziert. Ein UNIQUE INDEX erzwingt Eindeutigkeit ähnlich wie ein Primärschlüssel, ersetzt aber nicht automatisch alle fachlichen Schlüsselentscheidungen.

7.3 Rechteverwaltung

CREATE USER martin WITH PASSWORD '123456789';
GRANT SELECT ON invoice TO martin;
GRANT SELECT (emp_first_name, emp_last_name) ON emp_employee TO martin;
REVOKE SELECT ON emp_employee FROM martin;

CREATE ROLE buchhaltung;
GRANT SELECT ON invoice TO buchhaltung;
GRANT buchhaltung TO martin;

Rechte sollten nach dem Prinzip der minimalen Rechte vergeben werden. Rollenbasierte Zugriffskontrolle ist übersichtlicher als direkte Rechtevergabe an einzelne User, weil Rechte an Rollen und Rollen an Benutzer gekoppelt werden.

7.4 System Catalog und Information Schema

SELECT *
FROM pg_attribute
WHERE attname LIKE 'billing_country';

SELECT *
FROM information_schema.tables
WHERE table_schema = 'chinook';

Der Systemkatalog enthält Metadaten zu Tabellen, Spalten und Verwaltung. information_schema ist standardisiert und daher portabler; pg_*-Tabellen sind PostgreSQL-spezifisch.

8. DB-seitige Programmierung: Functions, Procedures, Trigger

8.1 Warum DB-seitige Logik?

Vorteil Risiko Prüfungsbewertung
Weniger Netzwerkverkehr, weil Logik nahe an den Daten läuft. Logik verteilt sich zwischen Anwendung und Datenbank. Nur sinnvoll, wenn die Logik datenbanknah und wiederverwendbar ist.
Integrität und Geschäftsregeln können zentral erzwungen werden. Portierbarkeit leidet, da viele Features DBMS-spezifisch sind. PostgreSQL-Syntax genau beachten.

8.2 Functions mit LANGUAGE SQL

Benutzerdefinierte Funktionen liefern einen Skalarwert, Datensatz oder void. Sie können in SQL-Abfragen genutzt werden und erweitern dadurch die Sprache SQL.

CREATE OR REPLACE FUNCTION kundenname(cust_id integer)
RETURNS varchar(100)
LANGUAGE SQL
AS $$
  SELECT "FirstName" || ' ' || "LastName"
  FROM "Customer"
  WHERE "CustomerId" = cust_id;
$$;

SELECT kundenname(5);

8.3 Functions mit PL/pgSQL

CREATE OR REPLACE FUNCTION anzahl(unteregrenze int, oberegrenze int)
RETURNS int
LANGUAGE plpgsql
AS $$
DECLARE
  anzahl int;
BEGIN
  SELECT COUNT(*)
  INTO anzahl
  FROM invoice
  WHERE total BETWEEN unteregrenze AND oberegrenze;

  RETURN anzahl;
END
$$;

PL/pgSQL bietet Variablen, DECLARE, BEGIN ... END, IF, CASE, LOOP, WHILE, FOR und Fehlerbehandlung mit EXCEPTION. Übergabeparameter sind implizit verfügbar; lokale Variablen müssen deklariert werden. Abfrageergebnisse werden mit SELECT ... INTO variable gespeichert.

8.4 Procedures

CREATE OR REPLACE PROCEDURE change_support_staff(
  p_customer_id INT,
  p_new_support_id INT
)
LANGUAGE plpgsql
AS $$
BEGIN
  UPDATE customer
  SET support_rep_id = p_new_support_id
  WHERE customer_id = p_customer_id;
END
$$;

CALL change_support_staff(1, 5);
Functions Procedures
Liefern einen Rückgabewert und können in SQL-Anweisungen verwendet werden. Werden mit CALL aufgerufen und dienen Prozessabläufen.
Keine Transaktionsbefehle wie COMMIT. Können Transaktionen steuern, z. B. COMMIT in Prozesslogik.
RETURN gibt Wert zurück. RETURN beendet nur die Procedure; Werte über OUT/INOUT.

8.5 Trigger

CREATE TRIGGER Syntax und Trigger Function
PostgreSQL-Trigger enthalten nicht direkt Code. Der Trigger bindet ein Tabellenereignis an eine separate Trigger-Funktion mit RETURNS TRIGGER.
CREATE OR REPLACE FUNCTION validate_hire_date()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
  IF NEW.hire_date <= NEW.birth_date THEN
    RAISE EXCEPTION 'Fehler: Geburtstag nach Einstelldatum';
  END IF;
  RETURN NEW;
END;
$$;

CREATE TRIGGER check_hire_date
BEFORE INSERT ON employee
FOR EACH ROW
EXECUTE FUNCTION validate_hire_date();
Aspekt Merken
Zeitpunkt BEFORE kann Zeile ändern oder abbrechen; AFTER reagiert nach erfolgreicher Operation.
Ereignis INSERT, UPDATE, DELETE; Spaltentrigger bei UPDATE OF spalte.
Granularität FOR EACH ROW je Zeile, FOR EACH STATEMENT einmal pro SQL-Befehl.
Spezialvariablen OLD alter Datensatz, NEW neuer Datensatz, TG_OP, TG_NAME, TG_TABLE_NAME, TG_ARGV.
Einschränkungen Keine Transaktionsbefehle; keine Ergebnis-SELECTs außer SELECT ... INTO; eigene Tabelle nicht per DML verändern.
Trigger-Falle: Trigger sind für Anwendungsentwickler oft unsichtbar aktiv. In Prüfungsantworten immer erwähnen, dass Trigger Komplexität und Seiteneffekte erhöhen können.

9. Transaktionen, Isolation, Locks, 2PL und 2PC

9.1 Transaktion und ACID

Eine Transaktion ist eine Folge von Datenmanipulationen, die eine logische Arbeitseinheit bildet. Einzelne Zwischenschritte können inkonsistent sein; nach erfolgreichem Abschluss muss die Datenbank wieder konsistent sein. Wenn Abschluss nicht möglich ist, werden Änderungen über Log-Informationen zurückgenommen.

ACID Bedeutung Prüfungsformulierung
Atomicity Alles oder nichts. Transaktion wird komplett oder gar nicht durchgeführt.
Consistency Integrität bleibt erhalten. Gültiger DB-Zustand wird in gültigen DB-Zustand überführt.
Isolation Gleichzeitige Transaktionen stören sich nicht. Zwischenzustände sind nach außen unsichtbar.
Durability Commit ist dauerhaft. Abgeschlossene Transaktionen gehen nicht verloren.
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- oder bei Fehler:
ROLLBACK;

Auto-Commit führt nach jeder einzelnen DML-Anweisung automatisch ein Commit aus. Das ist bequem, aber falsch, wenn mehrere Befehle fachlich eine gemeinsame Transaktion bilden.

9.2 Nebenläufigkeitsanomalien

Anomalie Beschreibung Prüfungsbeispiel
Dirty Write / Lost Update Zwei Transaktionen schreiben denselben Wert, eine Änderung geht verloren. TA1 und TA2 lesen denselben Bestand, beide schreiben neuen Bestand zurück.
Dirty Read Lesen nicht committeter Daten. TA2 liest Wert von TA1, TA1 macht Rollback.
Non-Repeatable Read Wiederholter Zugriff auf dieselbe Zeile liefert innerhalb einer Transaktion unterschiedliche Werte. TA2 liest, TA1 committet Änderung, TA2 liest erneut anderen Wert.
Phantom Wiederholte Bereichsabfrage liefert zusätzliche oder fehlende Zeilen. TA1 fügt passende Zeile ein, TA2 wiederholt Bereichsabfrage.

9.3 Isolation Level

Isolation Level und erlaubte Nebenläufigkeitsanomalien
Höhere Isolation verhindert mehr Anomalien, reduziert aber Parallelität und erhöht Locking/Versioning-Overhead.
Isolation Level Erlaubt typischerweise noch Klausursatz
Read Uncommitted Dirty Read, Non-Repeatable Read, Phantom; Dirty Write verboten. Maximale Parallelität, schwächste Isolation.
Read Committed Non-Repeatable Read, Phantom. Nur committete Daten werden gelesen, aber Wiederholung kann andere Werte liefern.
Repeatable Read Phantom. Gleiche Zeile bleibt innerhalb der Transaktion stabil.
Serializable Keine der genannten Anomalien. Wirkt, als würden Transaktionen seriell nacheinander laufen.

9.4 Synchronisationsstrategien, Locks und Deadlocks

Strategie Grundannahme Vorteil Nachteil
Pessimistisch Konflikte sind häufig. Sperrt vor Lesen/Schreiben, verhindert Konflikte zuverlässig. Blockiert, Deadlocks möglich.
Optimistisch Konflikte sind selten. Hohe Parallelität, Prüfung erst am Ende. Konflikte führen zu Rollback.

Locks schützen Relationen oder Datensätze vor gleichzeitigen Zugriffen. Ein Deadlock entsteht, wenn Transaktion 1 Ressource A hält und auf B wartet, während Transaktion 2 B hält und auf A wartet.

9.5 2PL vs. 2PC

Protokoll Ziel Phasen Nicht verwechseln
Zweiphasen-Sperrprotokoll (2PL) Isolation, Serialisierbarkeit. Wachstumsphase: Sperren anfordern; Schrumpfphase: Sperren freigeben. Hat mit Sperren zu tun, nicht mit verteiltem Commit.
Zweiphasen-Commit-Protokoll (2PC) Atomarität im verteilten Fall. Prepare-Phase; Commit-/Abort-Phase. Koordiniert Abschluss über mehrere Knoten, nicht Isolation.

10. JDBC, REST, JPA und ORM

10.1 JDBC

JDBC (Java Database Connectivity) ist die Standard-Schnittstelle für SQL-Datenbankzugriff aus Java. JDBC enthält keinen datenbankspezifischen Code; datenbankspezifische Details kommen über den JDBC-Treiber. Im Kurs wird der Typ-4-Treiber für PostgreSQL genutzt: vollständig in Java, setzt JDBC-Calls direkt in das Datenbankprotokoll um.

String adresse = "jdbc:postgresql://localhost:5432/postgres?currentSchema=%s";
String schema = "chinook";
String url = String.format(adresse, schema);

Properties props = new Properties();
props.setProperty("user", "postgres");
props.setProperty("password", "postgres");

Connection conn = DriverManager.getConnection(url, props);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM chinook.genre;");

while (rs.next()) {
  Integer id = rs.getInt("genre_id");
  String name = rs.getString("name");
}

rs.close();
st.close();
conn.close();
Methode Für Rückgabe
executeQuery() SELECT ResultSet
executeUpdate() INSERT, UPDATE, DELETE, DDL int: Anzahl betroffener Zeilen.

Ein ResultSet wird cursorartig mit next() durchlaufen. ResultSet, Statement und Connection müssen geschlossen werden, sonst bleiben Ressourcen länger als nötig belegt.

10.2 JDBC-Transaktionen

conn.setAutoCommit(false);
try {
  // mehrere DML-Befehle
  conn.commit();
} catch (SQLException ex) {
  conn.rollback();
  throw ex;
}

10.3 SQL Injection und PreparedStatement

Bei String-Verkettung kann Benutzereingabe die SQL-Logik verändern, z. B. durch 'Blues' OR 1=1. Prepared Statements trennen SQL-Struktur und Parameterwerte.

PreparedStatement pst = conn.prepareStatement(
  "UPDATE genre SET name = 'Blues Rock' WHERE name = ?"
);
pst.setString(1, eingabe);
int affectedRows = pst.executeUpdate();
Merken: Prepared Statements sind sicherer gegen SQL Injection und oft performanter, weil die Datenbank das Statement vorbereiten und mit verschiedenen Parametern erneut ausführen kann.

10.4 REST und 3-Schichten-Architektur

Drei-Schichten-Architektur mit Client, Backend und Datenbank
Moderne Anwendungen kapseln SQL im Backend. Der Client spricht HTTP/REST, nicht direkt SQL und nicht direkt mit Datenbankzugangsdaten.
Schicht Aufgabe Beispiele
Präsentationsschicht UI, Benutzerinteraktion, HTTP-Anfragen. Browser, Mobile App, Java-Client.
Anwendungsschicht Geschäftslogik, Validierung, Sicherheit, Transaktionen, Datenzugriff. Spring Boot, Jakarta EE, REST-API.
Datenschicht Persistenz, Integrität, ACID, optimierte Abfragen. PostgreSQL, Oracle, MySQL.

10.5 ORM, JPA und Hibernate

Der Object-Relational Impedance Mismatch beschreibt Konflikte zwischen Objektwelt und relationaler Welt: Vererbung vs. Tabellen, Objektidentität vs. Primärschlüssel, Objektgraph-Navigation vs. JOINs, RAM-Zustand vs. persistenter Zustand. ORM überbrückt diese Unterschiede.

Ebene Rolle Beispiel
ORM Konzept: Objekte auf Relationen abbilden. Klassen ↔ Tabellen, Objekte ↔ Zeilen.
JPA Java-Spezifikation/API, definiert Interfaces, Annotationen, JPQL. @Entity, @Id, EntityManager.
Hibernate Implementierung/Provider der JPA-Spezifikation. Generiert SQL und nutzt intern JDBC.
JPA Entity Lebenszyklus
JPA verwaltet Entities im Persistence Context. Änderungen an managed Entities werden beim Commit synchronisiert.
JPA-Befehl Zweck Hinweis
em.persist(person) Neue Entity speichern. Beim Commit entsteht ein INSERT.
em.find(Person.class, id) Entity per Primärschlüssel lesen. Effizient für ID-Zugriffe, nicht für komplexe Filter.
em.merge(detached) Detached Entity wieder in Persistence Context bringen. Für Updates abgelöster Objekte.
em.remove(person) Entity löschen. Beim Commit entsteht ein DELETE.
begin(), commit(), rollback() Transaktionsrahmen. Create/Update/Delete brauchen Transaktion.

11. Relationale Erweiterungen, HANA und verteilte Datenbanken

11.1 OLTP vs. OLAP

Aspekt OLTP OLAP
Ziel Operative Geschäftsabwicklung. Analyse und Entscheidungsunterstützung.
Datenmodell Stark normalisiert, Schreib- und Transaktionsfokus. Multidimensional, lese- und aggregationsorientiert.
Problem Komplexe Analysen blockieren operatives System. Daten müssen oft vorbereitet, geladen und aggregiert werden.

Data Cubes strukturieren Kennzahlen nach Dimensionen wie Zeit, Produkt und Region. Operationen sind Slicing, Dicing, Roll-up und Drill-down. Das Sternschema bildet Cubes relational ab: Faktentabelle in der Mitte, Dimensionstabellen außen. Dimensionstabellen werden bewusst denormalisiert, weil OLAP stark lesend arbeitet.

11.2 ORDBMS und SAP HANA

Objektrelationale Datenbanken erweitern relationale Systeme um benutzerdefinierte Datentypen, Typ- und Tabellenhierarchien, Methoden, Objektidentität und komplexe Objekte. Moderne SQL-Datenbanken enthalten viele dieser Features, ohne im Alltag noch separat als ORDBMS bezeichnet zu werden.

SAP HANA-Konzept Bedeutung Prüfungsnutzen
In-Memory Daten liegen primär im RAM, Persistenz über Logs/Snapshots/Savepoints. Analysen werden deutlich schneller, ohne Durability aufzugeben.
Column Store Werte einer Spalte liegen zusammen und sind gut komprimierbar. Vorteil bei OLAP-Scans und Aggregationen über wenige Spalten.
Code-to-Data Rechenlogik wird zur Datenbank verlagert. Weniger Netzlast, bessere Nutzung paralleler DB-Verarbeitung.
Translytical OLTP und OLAP sollen auf aktuellen Daten zusammengeführt werden. Gegenmodell zu getrenntem operativem System plus ETL/Data Warehouse.

11.3 Verteilte Datenbanken

Eine verteilte Datenbank hat ein einziges logisches Schema, aber mehrere physische Fragmente auf vernetzten Rechnern. Ein DDBMS soll Verteilungstransparenz herstellen: Für Nutzer wirkt das System wie eine Datenbank.

Konzept Erklärung Falle
Horizontale Fragmentierung Aufteilung nach Zeilen. Häufigster Fall bei Sharding.
Vertikale Fragmentierung Aufteilung nach Spalten. Primärschlüssel muss zur Rekonstruktion erhalten bleiben.
Sharding Partitionen werden physisch auf Nodes verteilt. Anfragen müssen zur richtigen Partition gelangen.
Replikation Datenkopien auf mehreren Nodes. Erhöht Verfügbarkeit, erschwert Konsistenz.
Vertikale Skalierung Server aufrüsten. Typisch für klassische RDBMS, aber begrenzt.
Horizontale Skalierung Daten/Last auf mehrere Nodes verteilen. Herausfordernd für starke ACID-Garantien und JOINs.

11.4 CAP und BASE

CAP Theorem mit Consistency, Availability und Partition Tolerance
CAP: In massiv verteilten Systemen können bei Partitionierung nicht gleichzeitig strikte Konsistenz und volle Verfügbarkeit garantiert werden.
CAP-Begriff Bedeutung
Consistency Alle Lesevorgänge sehen den jüngsten Schreibvorgang oder erhalten Fehler. Das System wirkt wie eine einzige Datenkopie.
Availability Jede Anfrage wird beantwortet.
Partition Tolerance System arbeitet trotz Netzwerktrennung weiter.
Konsistenz-Falle: ACID-Consistency bedeutet Integrität innerhalb der Datenbankregeln. CAP-Consistency bedeutet Übereinstimmung verteilter Kopien zum selben Zeitpunkt. Das sind unterschiedliche Begriffe.
BASE im Vergleich zu ACID
BASE lockert strikte ACID-Konsistenz zugunsten von Verfügbarkeit und Skalierbarkeit.
BASE Bedeutung
Basically Available System antwortet grundsätzlich auch bei Teilausfällen.
Soft State Daten können vorübergehend in Übergangszuständen sein.
Eventually Consistent Ohne weitere Schreibzugriffe konvergieren Replikate irgendwann zu einem konsistenten Zustand.

12. NoSQL: Redis, MongoDB, Cassandra, Neo4j und Polystores

12.1 NoSQL-Grundidee

Fachlich ist „nicht-relational“ oft präziser als „NoSQL“, weil einige Systeme SQL-ähnliche Sprachen besitzen. Entscheidend ist das andere Datenmodell: Key-Value, Dokument, Wide-Column oder Graph. Treiber sind Big Data-Anforderungen: Volume, Variety und Velocity sowie horizontale Skalierung, Replikation, flexible Schemata und häufig BASE/Eventual Consistency.

Hauptkategorien von NoSQL-Systemen
Die vier Hauptkategorien sind Key-Value Stores, Document Stores, Wide-Column Stores und Graphdatenbanken.

12.2 Key-Value Stores und Redis

Aspekt Erklärung Beispiele
Datenmodell Unique Key → Value, flach, schemafrei. User:1001:email als Key.
Operationen SET, GET, DEL. Cache, Session-Management, Feature Flags.
Performance Sehr schnelle Zugriffe, oft O(1), keine JOINs. Redis, Memcached, DynamoDB.
Struktur Hierarchie nur über Namenskonventionen, nicht durch DB verstanden. Doppelpunkte als Namespace-Konvention.
SET user:U17547:nachname Mueller
GET user:U17547:nachname

HSET user:U17547 vorname Max nachname Mueller email max@example.com
HGETALL user:U17547

Redis hält Daten primär im RAM. Persistenz entsteht durch RDB-Snapshots und AOF-Journaling. Redis ist streng genommen eine Key-Data-Structure-Datenbank, weil Values strukturierte Typen wie Strings, Hashes, Lists, Sets, Streams oder RedisJSON sein können. Ein Redis Hash ist für Objekte oft besser als viele einzelne String-Keys, weil alle Felder eines Objekts mit HGETALL gelesen werden können.

12.3 Dokumentendatenbanken und MongoDB

RDBMS MongoDB Bedeutung
Datenbank Datenbank Oberster Container.
Tabelle Collection Gruppe von Dokumenten, ohne feste Spaltenstruktur.
Zeile Document JSON/BSON-artiger Datensatz.
Spalte Field Schlüssel-Wert-Paar im Dokument.

MongoDB speichert BSON, eine binäre JSON-Repräsentation mit zusätzlichen Datentypen. Jedes Dokument erhält ein eindeutiges _id-Feld, bei fehlender Angabe automatisch als ObjectId. Schemafreiheit bedeutet nicht Regelfreiheit: Die Applikation trägt mehr Verantwortung für Struktur, Validierung und Beziehungen.

db.benutzer.insertOne({
  name: "Anna Schmidt",
  alter: 28,
  status: "aktiv",
  interessen: ["Lesen", "Wandern"]
});

db.benutzer.find({ alter: { $gt: 25 } }, { name: 1, _id: 0 });

db.benutzer.updateOne(
  { name: "Anna Schmidt" },
  { $set: { status: "aktiv" }, $inc: { anzahl_updates: 1 } }
);

db.benutzer.deleteOne({ name: "Anna Schmidt" });

12.4 Wide-Column Stores und Cassandra

Wide-Column Stores gruppieren Daten in Column Families. Sie eignen sich für sparse data, hohe Schreiblast, Zeitreihen, Logging, IoT und massiv verteilte Daten. Logisch kann man sie als sortierte Map verstehen:

(RowKey, ColumnFamily, Column, Timestamp) → Value

Cassandra und relationale Datenbanken im Vergleich
Cassandra nutzt CQL mit SQL-ähnlicher Syntax, aber ohne relationale Abfragefreiheit: keine JOINs, keine Subqueries, Query-first-Modellierung.
Cassandra-Konzept Erklärung Prüfungsregel
Keyspace Ähnlich Datenbank, definiert Replikationsstrategie und Replikationsfaktor. Jede Anwendung typischerweise eigener Keyspace.
Partition Key Bestimmt Datenverteilung auf Nodes. WHERE muss Partition Key nutzen, sonst weiß Cassandra den Node nicht.
Clustering Columns Sortieren Zeilen innerhalb einer Partition. Nur mit Partition Key sinnvoll filterbar.
UPSERT INSERT/UPDATE legt an oder überschreibt. Hoher Schreibdurchsatz, aber kein Schutz vor versehentlichem Überschreiben.
Consistency Level ONE, QUORUM, ALL. Steuert Tradeoff zwischen Availability und Consistency pro Abfrage.
CREATE TABLE personen (
  id UUID,
  name text,
  alter int,
  PRIMARY KEY (id)
);

-- Zusammengesetzt:
PRIMARY KEY ((land), stadt, strasse)
Cassandra-Falle: ALLOW FILTERING kann eine Abfrage erzwingen, ist aber für Produktivsysteme oft ein Warnsignal. In Cassandra wird zuerst die benötigte Abfrage entworfen, dann die Tabelle.

12.5 Graphdatenbanken und Neo4j

Graphdatenbanken behandeln Beziehungen als First-Class Citizens. Im Property-Graph-Modell bestehen Daten aus Knoten, gerichteten Kanten, Properties und Labels. Der Vorteil entsteht bei tief vernetzten Daten, etwa Social Graphs, Empfehlungslogik, Fraud Detection, Knowledge Graphs und Netzwerktopologien.

Neo4j und relationale Datenbanken im Vergleich
Neo4j speichert Beziehungen physisch als Pointer. Relationale Systeme berechnen Beziehungen zur Abfragezeit über JOINs.
CREATE (:Person {name: 'Anna', alter: 28});

MATCH (p:Person)-[:ARBEITET_BEI]->(f:Firma)
WHERE p.alter > 25
RETURN p.name, f.name;

MATCH (p:Person {name: 'Anna'})
DETACH DELETE p;
Neo4j-Konzept Merken
Cypher Deklarative, musterbasierte Abfragesprache mit ASCII-Art-Syntax.
Indexfreie Adjazenz Beziehungen sind physisch persistiert; Traversierung entlang Kanten ist schnell.
Integrität Explizite Constraints nötig; interne Neo4j-ID nicht fachlich als Primärschlüssel verwenden.
ACID Neo4j ist eine der wenigen NoSQL-Datenbanken mit vollständiger ACID-Konformität.
DELETE vs. DETACH DELETE DELETE scheitert bei bestehenden Kanten; DETACH DELETE löscht Knoten samt Beziehungen.

12.6 NoSQL-Einsatzszenarien, Polystores, Self-Tuning

Typische Einsatzszenarien der NoSQL-Datenbanktypen
Die Wahl des Datenbanktyps folgt dem Zugriffsmuster: schnelle Key-Lookups, flexible Dokumente, schreiblastige Zeitreihen oder tiefe Beziehungen.
Typ Geeignet für Weniger geeignet für
Key-Value Caching, Sessions, Feature Flags, High-Speed-Lookups. Komplexe Abfragen und Beziehungen.
Document CMS, Produktkataloge, variable JSON-Strukturen. Stark vernetzte Daten mit vielen Beziehungen.
Wide-Column Logging, IoT, Time-Series, massive Schreiblast. Ad-hoc-Queries, JOINs, starke Transaktionen.
Graph Empfehlungen, Fraud, Social Graph, Routing, Knowledge Graph. Massenaggregationen ohne Beziehungsfokus.

Polystores verbinden heterogene Speicher-Engines unter einer gemeinsamen Abfrageschnittstelle. Beispiel E-Commerce: relationale Datenbank für Bestellungen, Dokumentendatenbank für Produktkatalog, Graphdatenbank für Empfehlungen, Key-Value Store für Klickpfade. Herausforderung sind Komplexität, Datentransfer, Latenz und globale Konsistenz.

Self-Tuning-Datenbanken passen Konfiguration und physische Struktur automatisch an, etwa Indizes, Partitionierung, Materialized Views, Buffer-Größen, Parallelität und Checkpointing-Intervalle.

12.7 Historische Konzepte

Vor dem relationalen Modell gab es hierarchische und netzwerkartige Datenbanken. Hierarchische Systeme modellieren baumartige 1:n-Strukturen; Netzwerkdatenbanken erlauben n:m-Beziehungen über Owner-Member-Sets. Der Zugriff war navigierend und stärker programmiert als in SQL.

13. Klausurtraining, Checkliste, Fragen und Abdeckung

13.1 Aufgabentypen aus der Übungsklausur

Beispiele für Klausuraufgaben
Die Übungsklausur zeigt typische Aufgaben: DDL aus Schema, SQL-Ergebnisse ermitteln, Multiple Choice, Abfragen erstellen, Functions/Trigger, JDBC und Datenbankkonzepte.
Typ Was tun? Kontrolle
DDL aus Relationenschema Tabelle, Datentypen, Primärschlüssel, Fremdschlüssel, Constraints formulieren. Sind alle Integritätsbedingungen enthalten?
SQL-Ergebnis ermitteln Abfrage logisch abarbeiten: FROM/JOIN, WHERE, GROUP BY, HAVING, SELECT, ORDER. NULL, DISTINCT und Gruppierung korrekt behandelt?
SQL-Abfrage schreiben Benötigte Tabellen und Beziehungen identifizieren, dann JOIN und Filter setzen. Keine unnötigen kartesischen Produkte?
Function/Trigger Signatur, Rückgabetyp, LANGUAGE, Body, NEW/OLD und RETURN prüfen. Bei PostgreSQL Trigger-Funktion plus CREATE TRIGGER getrennt?
JDBC-Code ergänzen Connection, Statement/PreparedStatement, ResultSet, execute-Methode, close/Transaktion ergänzen. PreparedStatement statt String-Verkettung bei Eingaben?
Konzepte ACID/BASE/CAP, NoSQL-Typen, JPA/JDBC/REST abgrenzen. Begriffe nicht vermischen, besonders Consistency.

13.2 Musterlösungen als Denkgerüst

DDL mit Fremdschlüssel
CREATE TABLE album (
  album_id INTEGER,
  title VARCHAR(255) NOT NULL,
  artist_id INTEGER NOT NULL,
  PRIMARY KEY (album_id),
  CONSTRAINT fk_album_artist
    FOREIGN KEY (artist_id)
    REFERENCES artist(artist_id)
);
JOIN-Aufgabe
SELECT al.title
FROM album AS al
JOIN artist AS ar
  ON al.artist_id = ar.artist_id
WHERE ar.name = 'Metallica';
Trigger-Skelett
CREATE OR REPLACE FUNCTION set_default_genre()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
  IF NEW.name IS NULL THEN
    NEW.name := 'Untitled Genre';
  END IF;
  RETURN NEW;
END;
$$;

CREATE TRIGGER trg_default_genre
BEFORE INSERT ON genre
FOR EACH ROW
EXECUTE FUNCTION set_default_genre();
JDBC PreparedStatement
PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM artist WHERE name = ?"
);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
  System.out.println(rs.getString("name"));
}
rs.close();
ps.close();

13.3 Typische Fehler und Prüfungsfallen

Fehler Warum kritisch? Besser
UPDATE/DELETE ohne WHERE Ändert oder löscht alle Zeilen. Immer betroffene Zeilen explizit filtern.
= NULL NULL ist unbekannt, nicht gleich/ungleich. IS NULL oder IS NOT NULL.
Nicht gruppierte Spalten im SELECT Verletzt GROUP BY-Regel. Nur Gruppierungsspalten oder Aggregatfunktionen ausgeben.
Fehlende JOIN-Bedingung Kartesisches Produkt, falsche Ergebnismenge. JOIN immer mit fachlicher Schlüsselbeziehung.
WHERE statt HAVING für Aggregatfilter Falsche Ausführungsphase. Zeilenfilter in WHERE, Gruppenfilter in HAVING.
Function und Procedure verwechseln Falscher Aufruf, falsche Transaktionslogik. Function in SQL und mit Rückgabewert; Procedure per CALL.
Trigger-Logik direkt in CREATE TRIGGER PostgreSQL erwartet separate Trigger-Funktion. RETURNS TRIGGER-Funktion plus CREATE TRIGGER.
SQL Injection durch String-Verkettung Eingabe verändert SQL-Logik. Prepared Statements.
ACID- und CAP-Consistency gleichsetzen Unterschiedliche Konsistenzbegriffe. ACID = Integrität, CAP = Replikat-/Lese-Konsistenz.
NoSQL als „keine SQL-Sprache“ definieren Viele Systeme haben SQL-ähnliche Sprachen. NoSQL über nicht-relationale Datenmodelle und Skalierungsziele erklären.

13.4 Lerncheckliste

  • Ich kann DB, DBMS und DBS unterscheiden.
  • Ich kann DDL, DML und DQL anhand von Befehlen trennen.
  • Ich kann eine Tabelle mit Datentypen, Primärschlüssel, Fremdschlüssel und Constraints erstellen.
  • Ich kann INSERT, UPDATE, DELETE sicher formulieren und die Wirkung von WHERE erklären.
  • Ich kann SELECT-Abfragen logisch abarbeiten und Ergebnislisten bei GROUP BY/HAVING bestimmen.
  • Ich kann INNER/LEFT/RIGHT/SELF/CROSS JOIN unterscheiden und typische JOIN-Fehler erkennen.
  • Ich kann Views, Indizes, Rollen/Rechte und information_schema erklären.
  • Ich kann PostgreSQL Functions, Procedures und Trigger syntaktisch und konzeptionell unterscheiden.
  • Ich kann ACID, Auto-Commit, Isolation Level, Locks, Deadlock, 2PL und 2PC erklären.
  • Ich kann JDBC-Code für Verbindung, Query, Update, PreparedStatement, Transaktion und Ressourcenfreigabe ergänzen.
  • Ich kann REST/3-Schichten, JPA, Hibernate, EntityManager und Entity-Lebenszyklus einordnen.
  • Ich kann OLTP/OLAP, Sternschema, HANA, Column Store, Code-to-Data, CAP und BASE erklären.
  • Ich kann Redis, MongoDB, Cassandra und Neo4j anhand Datenmodell, Stärken, Schwächen und Einsatzfällen unterscheiden.

13.5 Mögliche Klausurfragen

  1. Erstellen Sie eine Tabelle inklusive Primärschlüssel, Fremdschlüssel und ON DELETE-Verhalten.
  2. Bestimmen Sie das Ergebnis einer SELECT-Abfrage mit GROUP BY und HAVING.
  3. Formulieren Sie eine SQL-Abfrage über mehrere Tabellen, z. B. Alben eines bestimmten Künstlers.
  4. Erklären Sie, warum WHERE count(*) > 1 falsch ist und wie es korrekt lautet.
  5. Schreiben oder ergänzen Sie eine PL/pgSQL-Function mit SELECT ... INTO und RETURN.
  6. Schreiben Sie eine Trigger-Funktion, die bei INSERT einen Defaultwert setzt oder eine Regel prüft.
  7. Erklären Sie, warum ein Trigger in PostgreSQL eine separate Trigger-Funktion benötigt.
  8. Vergleichen Sie Read Committed, Repeatable Read und Serializable anhand erlaubter Anomalien.
  9. Unterscheiden Sie 2PL und 2PC nach Ziel, Phasen und ACID-Bezug.
  10. Ergänzen Sie JDBC-Code mit PreparedStatement und korrekter Ressourcenfreigabe.
  11. Erklären Sie den Unterschied zwischen direktem JDBC-Zugriff und REST-Backend.
  12. Ordnen Sie JPA, Hibernate und JDBC in einer Architektur ein.
  13. Erklären Sie CAP und BASE und grenzen Sie CAP-Consistency von ACID-Consistency ab.
  14. Wählen Sie für ein Szenario Redis, MongoDB, Cassandra oder Neo4j und begründen Sie.
  15. Erklären Sie bei Cassandra Partition Key, Clustering Columns, UPSERT und Consistency Level.
  16. Erklären Sie, warum Neo4j für tiefe Beziehungen geeignet ist und worin Indexfreie Adjazenz besteht.

13.6 Abdeckungstabelle

Folie/Kapitel Inhalt In Zusammenfassung enthalten? Wo behandelt?
Einführung S. 1-7 Titel, Vorstellung, Schwerpunkte, Literatur, Vorlesungsinhalte Ja, organisatorisch verdichtet Stoffkarte, Grundlagen
Einführung S. 8-11 Daten/Information/Wissen, DB/DBMS/DBS, DBMS-Aufgaben Ja Grundlagen
Einführung S. 12-16 ANSI-SPARC, konzeptionelles und relationales Modell Ja, mit Abbildungen ANSI-SPARC und Datenmodelle
Einführung S. 17-20 Jobprofile, Übung, Literatur Ja, prüfungsorientiert verdichtet Stoffkarte, Klausurtraining
SQL Teil 1 S. 1-8 SQL, Normierung, relationale Algebra Ja SQL-Konventionen, DQL
SQL Teil 1 S. 9-19 DDL-Start, PostgreSQL, DBeaver Ja PostgreSQL und DBeaver
SQL Teil 1 S. 20-33 CREATE SCHEMA/TABLE, Datentypen, ALTER, DROP, Übungen Ja DDL und Datentypen
SQL Teil 1 S. 34-47 NOT NULL, UNIQUE, CHECK, zusammengesetzte Schlüssel, referentielle Integrität, ON DELETE/UPDATE Ja, mit Abbildung Constraints und referentielle Integrität
SQL Teil 1 S. 48-61 INSERT, UPDATE, DELETE, Transferfragen, Challenge, Literatur Ja DML, Klausurtraining
SQL Teil 2 S. 1-20 SELECT, Alias, DISTINCT, Aggregatfunktionen, Datum/Text/Typumwandlung, ORDER BY, LIMIT, GROUP BY, HAVING Ja SELECT-Grundlagen
SQL Teil 2 S. 21-28 WHERE-Bedingungen, WHERE vs. HAVING, Übungen Ja WHERE und GROUP BY
SQL Teil 2 S. 29-36 Subqueries, korrelierte Unterabfragen, Abarbeitungslogik Ja Unterabfragen
SQL Teil 2 S. 37-50 Kartesisches Produkt, WHERE-Verknüpfung, JOINs, JOIN-Arten, Filterung Ja, mit Abbildung JOINs
SQL Teil 2 S. 51-70 Mengenoperationen, Abarbeitungsreihenfolge, komplexe Abfragen, Transferfragen Ja, mit Abbildung DQL, Klausurtraining
SQL Teil 3 S. 1-8 Views, Inline Views, Änderbarkeit von Views Ja, mit Abbildung Views
SQL Teil 3 S. 9-10 Index, Unique Index, EXPLAIN Ja Index
SQL Teil 3 S. 11-16 User, Rollen, GRANT, REVOKE, RBAC Ja Rechteverwaltung
SQL Teil 3 S. 17-24 System Catalog, Information Schema, Transferfragen, Übungen Ja Systemkatalog
DB-seitig/Transaktionen S. 1-6 DB-seitige Logik: Functions, Procedures, Trigger Ja DB-seitige Programmierung
DB-seitig/Transaktionen S. 7-31 Functions LANGUAGE SQL, PL/pgSQL, Parameter, Dollar-Quoting, Beispiele Ja Functions
DB-seitig/Transaktionen S. 32-36 Procedures, CALL, OUT/INOUT, JDBC CallableStatement Ja Procedures
DB-seitig/Transaktionen S. 37-50 Trigger, Trigger-Funktionen, NEW/OLD, Einschränkungen, Transferfragen Ja, mit Abbildung Trigger
DB-seitig/Transaktionen S. 51-73 Transaktionen, ACID, Auto-Commit, Anomalien, Isolation Level, Locks, Deadlock, 2PL, 2PC Ja, mit Abbildung Transaktionen
JDBC/JPA S. 1-37 JDBC, Treibertypen, Connection, Statement, ResultSet, executeQuery/update, SQL Injection, PreparedStatement Ja JDBC
JDBC/JPA S. 38-42 REST, 3-Schichten-Architektur Ja, mit Abbildung REST und 3-Schichten
JDBC/JPA S. 43-67 Object-Relational Impedance Mismatch, ORM, JPA, Hibernate, EntityManager, Lebenszyklus, CRUD, JPQL Ja, mit Abbildung JPA und ORM
Erweiterungen/verteilte DB S. 1-15 Postrelationale Datenbanken, OLTP/OLAP, Data Cube, Sternschema, MOLAP, ORDBMS Ja OLTP/OLAP und ORDBMS
Erweiterungen/verteilte DB S. 16-28 SAP HANA, In-Memory, Row/Column Store, Code-to-Data, ACID Ja SAP HANA
Erweiterungen/verteilte DB S. 29-35 Verteilte DB, DDBMS, Partitionierung, Replikation, Skalierung, Sharing Ja Verteilte Datenbanken
Erweiterungen/verteilte DB S. 36-47 ACID, Konsistenz in verteilten Systemen, CAP, BASE, Transferfragen Ja, mit Abbildungen CAP und BASE
NoSQL S. 1-8 NoSQL-Überblick, Eigenschaften, Hauptkategorien Ja, mit Abbildung NoSQL-Grundidee
NoSQL S. 9-26 Key-Value, Redis, Datentypen, Persistenz, Befehle, Java/Python-Anbindung Ja Key-Value und Redis
NoSQL S. 27-50 Dokumentendatenbanken, MongoDB, BSON/JSON, MQL CRUD, Java/Python-Anbindung Ja MongoDB
NoSQL S. 51-80 Wide-Column, Cassandra, Keyspace, Partition Key, CQL, UPSERT, Konsistenz Ja, mit Abbildung Cassandra
NoSQL S. 81-104 Graphdatenbanken, Neo4j, Cypher, Constraints, ACID, Stärken/Schwächen Ja, mit Abbildung Neo4j
NoSQL S. 105-123 Einsatzszenarien, Polystores, Self-Tuning, historische Konzepte, Ranking, Transferfragen Ja, mit Abbildung Einsatzszenarien und Polystores, Fragen
Übungsklausur S. 1-7 DDL-Aufgaben, SQL-Ergebnisse, Multiple Choice, SQL schreiben, Functions/Trigger, JDBC, andere Konzepte Ja, mit Abbildung und Mustergerüsten Klausurtraining