Klausurzusammenfassung: Datenbanken - Praktische Umsetzung
SQL, PostgreSQL, DB-seitige Programmierung, Transaktionen, JDBC/JPA, verteilte Datenbanken und NoSQL
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.
Gliederung
- Grundlagen, Architektur und Datenmodelle
- PostgreSQL, DBeaver und SQL-Konventionen
- DDL, Datentypen und Integritätsbedingungen
- DML: INSERT, UPDATE, DELETE
- DQL: SELECT, WHERE, GROUP BY, JOINs, Subqueries
- Views, Index, Rechte und Systemkatalog
- DB-seitige Programmierung: Functions, Procedures, Trigger
- Transaktionen, Isolation, Locks, 2PL und 2PC
- JDBC, REST, JPA und ORM
- Relationale Erweiterungen, HANA und verteilte Datenbanken
- NoSQL: Redis, MongoDB, Cassandra, Neo4j und Polystores
- 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
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
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.
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
- SQL-Schlüsselwörter sind nicht case-sensitive, werden aus Lesbarkeitsgründen aber großgeschrieben:
SELECT,FROM,WHERE. - String-Literale stehen in einfachen Hochkommas:
'Metallica'. - Bezeichner wie Tabellen- und Spaltennamen sollten konsistent geschrieben werden. In PostgreSQL werden nicht quoted identifiers standardmäßig kleingeschrieben.
- SQL ist deklarativ: Man beschreibt das gewünschte Ergebnis, nicht den technischen Zugriffspfad.
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
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. |
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';
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;
| 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. |
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
SELECT CURRENT_TIMESTAMP;
SELECT EXTRACT(MONTH FROM '2025-09-12'::DATE);
SELECT CURRENT_DATE + INTERVAL '7 days';
SELECT UPPER('sql'), LOWER('SQL');
SELECT LENGTH('Hochschule');
SELECT TRIM(' Text ');
SELECT SUBSTRING('Datenbank' FROM 6 FOR 4);
SELECT CONCAT('Max', ' ', 'Muster');
SELECT '123'::INTEGER;
SELECT CAST('2025-09-12' AS DATE);
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.
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
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. |
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;
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);
- Bei
LANGUAGE SQLergibt sich der Rückgabewert implizit aus der letzten SQL-Anweisung. $$ ... $$ist Dollar-Quoting und verhindert Probleme mit Hochkommas und Zeilenumbrüchen im Body.- Bei mehreren DML-Anweisungen kann
BEGIN ATOMIC ... ENDAtomarität herstellen. COMMITundROLLBACKsind in Functions nicht zulässig.
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
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. |
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 | 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();
10.4 REST und 3-Schichten-Architektur
| 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-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-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. |
| 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.
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-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)
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.
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
| 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
| 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
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)
);
SELECT al.title
FROM album AS al
JOIN artist AS ar
ON al.artist_id = ar.artist_id
WHERE ar.name = 'Metallica';
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();
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,DELETEsicher formulieren und die Wirkung vonWHEREerklä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_schemaerklä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
- Erstellen Sie eine Tabelle inklusive Primärschlüssel, Fremdschlüssel und
ON DELETE-Verhalten. - Bestimmen Sie das Ergebnis einer SELECT-Abfrage mit
GROUP BYundHAVING. - Formulieren Sie eine SQL-Abfrage über mehrere Tabellen, z. B. Alben eines bestimmten Künstlers.
- Erklären Sie, warum
WHERE count(*) > 1falsch ist und wie es korrekt lautet. - Schreiben oder ergänzen Sie eine PL/pgSQL-Function mit
SELECT ... INTOundRETURN. - Schreiben Sie eine Trigger-Funktion, die bei
INSERTeinen Defaultwert setzt oder eine Regel prüft. - Erklären Sie, warum ein Trigger in PostgreSQL eine separate Trigger-Funktion benötigt.
- Vergleichen Sie Read Committed, Repeatable Read und Serializable anhand erlaubter Anomalien.
- Unterscheiden Sie 2PL und 2PC nach Ziel, Phasen und ACID-Bezug.
- Ergänzen Sie JDBC-Code mit PreparedStatement und korrekter Ressourcenfreigabe.
- Erklären Sie den Unterschied zwischen direktem JDBC-Zugriff und REST-Backend.
- Ordnen Sie JPA, Hibernate und JDBC in einer Architektur ein.
- Erklären Sie CAP und BASE und grenzen Sie CAP-Consistency von ACID-Consistency ab.
- Wählen Sie für ein Szenario Redis, MongoDB, Cassandra oder Neo4j und begründen Sie.
- Erklären Sie bei Cassandra Partition Key, Clustering Columns, UPSERT und Consistency Level.
- 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 |