mirror of
https://github.com/theoleuthardt/hwr-notes.git
synced 2026-06-06 01:21:09 +00:00
2721 lines
105 KiB
Markdown
2721 lines
105 KiB
Markdown
# Datenbanken – Gesamtzusammenfassung
|
||
**Dozent:** Prof. Dr. Arthur Zimmermann | HWR Berlin | 2026 | Semester 6
|
||
|
||
---
|
||
|
||
## Inhaltsverzeichnis
|
||
|
||
- [1. Modellierung](#1-modellierung-b_modellierung)
|
||
- [1.1 Einführung](#11-einführung)
|
||
- [1.2 Codds 12 Regeln](#12-codds-12-regeln)
|
||
- [1.3 Mengenlehre](#13-mengenlehre-b_mengenlehre)
|
||
- [1.4 ANSI-SPARC-Modell](#14-ansi-sparc-modell-drei-schichten-architektur)
|
||
- [1.5 Phasen des Datenbankentwurfs](#15-phasen-des-datenbankentwurfs)
|
||
- [1.6 Anforderungsanalyse](#16-anforderungsanalyse)
|
||
- [1.7 Konzeptueller Entwurf – ERM](#17-konzeptueller-entwurf--entity-relationship-modell-erm)
|
||
- [1.8 Logischer Entwurf – ERM → Tabellen](#18-logischer-entwurf--konvertierung-erm--tabellen)
|
||
- [2. Modellierung – Fallbeispiel](#2-modellierung--fallbeispiel-b_modellierungfb)
|
||
- [Mini-Welt 1 (M:N)](#mini-welt-1)
|
||
- [Mini-Welt 2 (1:N)](#mini-welt-2)
|
||
- [Vergleich der Mini-Welten](#vergleich-der-mini-welten)
|
||
- [3. Relationale Algebra](#3-relationale-algebra-c_algebra)
|
||
- [Grundoperatoren (vollständiger Satz)](#grundoperatoren-vollständiger-satz)
|
||
- [Operatoren im Detail](#operatoren-im-detail)
|
||
- [Zusammenfassung Operatoren](#zusammenfassung-operatoren)
|
||
- [4. SQL](#4-sql-d_sql)
|
||
- [4.1 SQL-Kategorien (DDL/DML/DCL/TCL)](#41-sql-kategorien)
|
||
- [4.2 Datentypen (Oracle)](#42-datentypen)
|
||
- [4.3 Einfache Befehle (CREATE, INSERT, UPDATE, DELETE)](#43-einfache-befehle)
|
||
- [4.4 Erweiterungen (LIKE, IN, GROUP BY, HAVING, NULL)](#44-erweiterungen)
|
||
- [4.5 Anfragen über mehrere Relationen](#45-anfragen-über-mehrere-relationen)
|
||
- [4.6 JOINs (NATURAL, INNER, OUTER, SEMI)](#46-joins)
|
||
- [4.7 Anfragebearbeitung (Parser, Optimizer, RBO/CBO)](#47-anfragebearbeitung)
|
||
- [4.8 Indizes (Binärbaum, Hashing, Bitmap)](#48-indizes)
|
||
- [5. Normalformen](#5-normalformen-e_nfs)
|
||
- [5.1 Einführung & Funktionale Abhängigkeit](#51-einführung)
|
||
- [5.3 1NF – Atomare Werte](#53-erste-normalform--1nf)
|
||
- [5.4 2NF – Volle PK-Abhängigkeit](#54-zweite-normalform--2nf)
|
||
- [5.5 3NF – Keine transitive Abhängigkeit](#55-dritte-normalform--3nf)
|
||
- [5.6 BCNF – Schlüsselkandidaten-Überlappung](#56-boyce-codd-normalform--bcnf)
|
||
- [5.7 4NF – Semantische Trennung](#57-vierte-normalform--4nf)
|
||
- [5.8 5NF – Irreducible Zerlegung](#58-fünfte-normalform--5nf)
|
||
- [5.9 Anomalien ohne Normalisierung](#59-anomalien-ohne-normalisierung)
|
||
- [Durchgängiges Beispiel: Bahnwagen](#durchgängiges-beispiel-bahnwagen)
|
||
- [6. Transaktionen](#6-transaktionen-f_transaktionen)
|
||
- [6.4 ACID-Eigenschaften](#64-acid-eigenschaften)
|
||
- [6.5 Zustände einer Transaktion](#65-zustände-einer-transaktion)
|
||
- [6.7 Probleme bei paralleler Ausführung](#67-probleme-bei-paralleler-ausführung)
|
||
- [6.9 Isolationsstufen nach ANSI/ISO SQL92](#69-isolationsstufen-nach-ansiiso-sql92)
|
||
- [6.11 Synchronisationsverfahren (2PL, Zeitstempel)](#611-synchronisationsverfahren)
|
||
- [7. Speicherstrukturen (Oracle)](#7-speicherstrukturen-g_speicherstrukturen)
|
||
- [7.2 Datenträger (Tablespace, Segmente, Redo-Log)](#72-datenträger)
|
||
- [7.3 Arbeitsspeicher (SGA, PGA, UGA)](#73-arbeitsspeicher)
|
||
- [8. Sicherungskonzepte](#8-sicherungskonzepte-h_sicherungskonzepte)
|
||
- [8.4 Grundprinzipien (Authentifizierung, Autorisierung, Protokollierung)](#84-grundprinzipien-der-sicherheit)
|
||
- [8.5 Integrität (Constraints, Trigger)](#85-integrität)
|
||
- [8.6 Rechte (DAC, MAC, GRANT, REVOKE)](#86-rechte)
|
||
- [8.7 Backup (Arten, Methoden, RAID, Strategie)](#87-backup)
|
||
- [9. Data Warehouse Konzepte](#9-data-warehouse-konzepte-i_dwkonzepte)
|
||
- [9.2 OLAP](#92-olap)
|
||
- [9.3 ROLAP / MOLAP / HOLAP](#93-rolap-molap-holap)
|
||
- [9.5 Vergleich OLTP und OLAP](#95-vergleich-oltp-und-olap)
|
||
- [9.6 ETL – Extract, Transform, Load](#96-etl--extract-transform-load)
|
||
- [9.7 Hypercube-Operationen](#97-hypercube-operationen)
|
||
- [10. Andere Typen von Datenbanken](#10-andere-typen-von-datenbanken-j_anderedb)
|
||
- [10.1 Hierarchische Datenbanken (IMS)](#101-hierarchische-datenbanken)
|
||
- [10.2 Netzartige Datenbanken (UDS)](#102-netzartige-datenbanken)
|
||
- [10.3 Verteilte Datenbanken (Two-Phase-Commit)](#103-verteilte-datenbanken)
|
||
- [10.4 Objektorientierte Datenbanken](#104-objektorientierte-datenbanken)
|
||
- [10.5 No-SQL-Datenbanken (BASE-Prinzip)](#105-no-sql-datenbanken-not-only-sql)
|
||
- [11. Gesamtübersicht & Cheat-Sheet](#11-gesamtübersicht--cheat-sheet)
|
||
- [11.1 Datenbankentwicklungsprozess](#111-datenbankentwicklungsprozess-phasenmodell)
|
||
- [11.2 ERM → Tabellen Kurzreferenz](#112-erm--relationale-tabellen--kurzreferenz)
|
||
- [11.3 Normalformen Kurzreferenz](#113-normalformen--kurzreferenz)
|
||
- [11.4 Relationale Algebra Operatoren](#114-relationale-algebra--vollständiger-operatorensatz)
|
||
- [11.5 SQL SELECT-Syntax](#115-sql--vollständige-select-syntax)
|
||
- [11.6 ACID & Isolationsstufen](#116-transaktionen--acid-und-isolationsstufen)
|
||
- [11.7 Oracle-Speicherstruktur](#117-speicherstrukturen--oracle-hierarchie)
|
||
- [11.8 Backup-Entscheidungsmatrix](#118-backup-entscheidungsmatrix)
|
||
- [11.9 OLTP vs. OLAP](#119-oltp-vs-olap-vs-data-warehouse)
|
||
- [11.10 No-SQL Vergleich](#1110-no-sql-datenbanken--vergleich)
|
||
- [11.11 Begriffe-Schnellreferenz](#1111-wichtige-begriffe--schnellreferenz)
|
||
|
||
---
|
||
|
||
## 1. Modellierung (b_Modellierung)
|
||
### 1.1 Einführung
|
||
#### Definitionen
|
||
|
||
**Charakteristik der Informationen im Unternehmen:**
|
||
- Informationen bilden Entscheidungsgrundlagen
|
||
- Informationen können aus unterschiedlichen Quellen stammen
|
||
- Qualität hängt von Verfügbarkeit, Korrektheit und Vollständigkeit ab
|
||
- Erhebung, Speichern und Verarbeiten erzeugt Aufwände
|
||
- Aufgabengebiete sind durch Informationsbeziehungen verknüpft
|
||
|
||
**Aspekte des Datenmanagements:**
|
||
- Architektur (Datenmodellierung)
|
||
- Datentechnik (Hardware, Installation, Reorganisation, Sicherung)
|
||
- Administration und Datennutzung
|
||
|
||
**Anforderungen an Datenverwaltung:**
|
||
- Zentrale Verwaltung der Daten
|
||
- Vermeidung/Einschränkung von Redundanzen
|
||
- Vermeidung von Inkonsistenzen
|
||
- Gemeinsame Nutzung durch verschiedene Anwendungen
|
||
- Datenschutz und Datensicherung
|
||
- Datenintegrität
|
||
- Datenunabhängigkeit von Anwendungen
|
||
|
||
**Definitionen:**
|
||
- **Daten** = Logisch strukturierte Informationseinheiten
|
||
- **Datenbank** = Einrichtung für langfristige sichere Aufbewahrung von Daten
|
||
|
||
#### Modellierung
|
||
|
||
Ein **Modell** ist ein Abbild der realen Welt, das man mit Absicht erstellt, um bestimmte Probleme zu lösen.
|
||
|
||
**Modellbildungsprozess:**
|
||
Reales Problem → Modell → Analyse/Simulation → Theoretische Lösung → Interpretation → Überprüfung → Reale Lösung
|
||
|
||
**Kriterien eines Modells nach Heinrich Hertz:**
|
||
1. **Richtigkeit** — Nicht beweisbar, nur durch Experimente überprüfbar und widerlegbar
|
||
2. **Zulässigkeit** — Logisch eindeutig formuliert, ohne Widersprüche
|
||
3. **Zweckmäßigkeit** — Keine überflüssigen Anteile; so einfach wie möglich, so kompliziert wie nötig
|
||
|
||
**Modellierungsansätze:** Verschiedene Modellierungssprachen führen zu verschiedenen semantischen Datenmodellen. Praktische Bedeutung haben insbesondere **Entity-Relationship-Modellierung (ERM)** und **UML**. Gängige Vorgehensweise: Erst ER-Modell, dann Konvertierung in relationales Modell.
|
||
|
||
#### Datenhaltung
|
||
|
||
Zwei grundsätzliche Formen:
|
||
1. **Herkömmliche Form (Dateien):** Datenverwaltung in die Anwendung integriert → enormer Entwicklungsaufwand, kaum Datenaustausch
|
||
2. **Datenbanken:** Datenbank = Datenmanagement + Daten. DBMS übernimmt Speicherung, Aufruf, Änderungen, Sortieren, Sicherungen
|
||
|
||
**Vorteile von Datenbanken gegenüber Dateien:**
|
||
- Reduktion der Entwicklungskosten
|
||
- Flexible Verarbeitung und Darstellung
|
||
- Vermeidung von Redundanzen, Inkonsistenzen, Datenverlust
|
||
- Zugriffskontrolle
|
||
- Mehrbenutzerbetrieb
|
||
- Hohe Verfügbarkeit
|
||
|
||
**Dateien statt Datenbanken empfohlen bei:**
|
||
- Sehr kleinen, nicht-kommerziellen Anwendungen
|
||
- Systemnahen Anwendungen
|
||
- Verschiedenen Testumgebungen
|
||
- Groben konzeptuellen Entwicklungen
|
||
|
||
#### Architektur
|
||
|
||
**Client/Server-Architektur:**
|
||
- **Client** nimmt die Ressource in Anspruch (z. B. Darstellung)
|
||
- **Server** stellt die Ressource zur Verfügung (z. B. Bearbeitung)
|
||
|
||
**Oracle-Architektur:**
|
||
- SQL-Plus, SQL-Developer, Oracle Instant Client → Listener → Dispatcher → DBMS-Instanzen → Datenbestände
|
||
- Multi-Tenant-Container und Real Application Cluster (RAC)
|
||
|
||
**SQLite-Architektur (keine Client/Server-Architektur):**
|
||
- DBMS-Instanz direkt in die Anwendung eingebettet
|
||
- Datenbestand als Dateien im Dateisystem
|
||
|
||
#### Datenbankbenutzer
|
||
|
||
| Rolle | Aufgaben |
|
||
|---|---|
|
||
| **DBA (Datenbankadministrator)** | DB-Design, Softwareinstallation/-wartung, Speicherplatzverwaltung, Sicherheitsmechanismen, Backup/Recovery, Reorganisation, Systembeobachtung/Tuning |
|
||
| **Anwendungsentwickler** | Systemanalyse, SQL, Standard-Abfragen, Anwendungsentwicklung |
|
||
| **Endanwender** | Benutzung erstellter Programme, vorgefertigte/Ad-Hoc-Abfragen, QBE-Werkzeuge |
|
||
|
||
#### Entwicklung
|
||
|
||
- **1960er Jahre:** Jede Anwendung hat eigenes Datenmanagement und eigene Daten
|
||
- **1970er Jahre:** Gemeinsames Datenmanagement, aber noch getrennte Datenbestände
|
||
- **Heute:** Gemeinsames Datenmanagement und gemeinsame Datenbestände
|
||
|
||
Zugriff auf Datenbanken erfolgt programmatisch z. B. über **JDBC** (Java Database Connectivity).
|
||
|
||
#### Arten von Datenbanken
|
||
|
||
| Art | Status |
|
||
|---|---|
|
||
| Hierarchische Datenbanken | Heute selten verwendet |
|
||
| Netzartige Datenbanken | Heute selten verwendet |
|
||
| Dokumentenbasierte Datenbanken | Selten verwendet (z. B. MongoDB) |
|
||
| Key-Value-Datenbanken | Begrenzte Bedeutung (z. B. BerkeleyDB) |
|
||
| Objektorientierte Datenbanken | Vorhanden |
|
||
| **Relationale Datenbanken** | **Heute fast ausschließlich verwendet** |
|
||
|
||
**Warum relationale Datenbanken dominieren:**
|
||
- Beziehungen und Entitäten werden gleich dargestellt → derselbe Verarbeitungsmechanismus
|
||
- Relationale Algebra liefert umfangreiche und fortgeschrittene Operationen
|
||
- Alle anderen DB-Typen lassen sich damit emulieren
|
||
|
||
### 1.2 Codds 12 Regeln
|
||
|
||
Die **12 Regeln von Codd** definieren eine relationale Datenbank:
|
||
|
||
1. Vollständige Verwaltung über relationale Fähigkeiten
|
||
2. **Darstellung von Informationen:** Alle Informationen als Werte in Tabellen
|
||
3. **Zugriff auf Daten:** Über Tabellenname + Primärschlüssel + Spaltenname
|
||
4. **Systematische Behandlung von Nullwerten:** Durchgängig gleich als unbekannt/fehlend
|
||
5. **Struktur:** Systemkatalog auf derselben logischen Ebene wie die Daten
|
||
6. **Abfragesprache:** Mindestens eine Sprache mit vollständigem Befehlssatz (DDL, DML, Integrität, Autorisierung, Transaktionen)
|
||
7. **Aktualisieren von Sichten:** Theoretisch aktualisierbare Sichten müssen vom System aktualisierbar sein
|
||
8. **Abfragen und Bearbeiten:** Unterstützung für Einfügen, Aktualisieren und Löschen ganzer Tabellen
|
||
9. **Physikalische Datenunabhängigkeit:** Logischer Zugriff unabhängig von physikalischen Methoden
|
||
10. **Logische Datenunabhängigkeit:** Tabellenstruktur-Änderungen ohne Einfluss auf Anwendungslogik
|
||
11. **Unabhängigkeit der Integrität:** Integritätsregeln in der DB-Sprache definierbar, nicht umgehbar
|
||
12. **Verteilungsunabhängigkeit:** Logischer Zugriff unverändert bei verteilten Datenbanken
|
||
|
||
### 1.3 Mengenlehre (b_Mengenlehre)
|
||
|
||
Die Mengenlehre bildet die **mathematische Grundlage** der Theorie relationaler Datenbanken. Sie wurde von **Georg Cantor** entwickelt.
|
||
|
||
#### Definition (G. Cantor, 1895)
|
||
|
||
> Eine **Menge** ist die Zusammenfassung von bestimmten **wohlunterschiedenen Objekten** unserer Anschauung oder unseres Denkens zu einem Ganzen.
|
||
|
||
#### Eigenschaften einer Menge
|
||
|
||
1. Die **Natur der Elemente** ist unerheblich
|
||
2. Alle Elemente sind **unterschiedlich** (keine Duplikate)
|
||
3. **Bezeichnung:** M = { e₁, e₂, ..., eₙ, ... }, eᵢ ∈ M
|
||
4. Die **Reihenfolge der Elemente** spielt keine Rolle
|
||
|
||
**Beispiele:** Menge aller Computer im Unternehmen · Menge der positiven Zahlen · Menge der Elektronen im Universum
|
||
|
||
**Anzahl der Elemente:**
|
||
- **endlich** (z. B. Mitarbeiter einer Firma)
|
||
- **unendlich:**
|
||
- **abzählbar** (z. B. ℕ, ℤ)
|
||
- **unabzählbar** (z. B. ℝ)
|
||
|
||
#### Quantoren
|
||
|
||
| Symbol | Bedeutung |
|
||
|---|---|
|
||
| **∀** | Für alle Elemente (Allquantor) |
|
||
| **∃** | Es existiert mindestens ein Element (Existenzquantor) |
|
||
|
||
Quantoren werden verwendet, um Aussagen in der Mengenlehre (und generell in der Mathematik) formal zu schreiben.
|
||
|
||
#### Operationen über Mengen
|
||
|
||
Folgende allgemeine Operationen sind über Mengen definiert:
|
||
|
||
**Kartesisches Produkt (Kreuzprodukt)**
|
||
```
|
||
A × B = { (a, b) | ∀ a ∈ A und ∀ b ∈ B }
|
||
```
|
||
Beispiel: A = { +, − }, B = { 1, 2, 3 }
|
||
→ A × B = { (+,1), (−,1), (+,2), (−,2), (+,3), (−,3) } = { +1, −1, +2, −2, +3, −3 }
|
||
|
||
**Kartesisches Produkt mehrerer Mengen:**
|
||
```
|
||
M₁ × M₂ × ... × Mₙ = { (m₁, m₂, ..., mₙ) | ∀ mᵢ ∈ Mᵢ, ∀ i ∈ [1,...,n] }
|
||
```
|
||
|
||
Die Elemente heißen **n-Tupel**:
|
||
- n = 2: **Paar** (Dupel)
|
||
- n = 3: **Tripel**
|
||
- n = 4: **Quadrupel**
|
||
- n = 5: **Quintupel**
|
||
|
||
**Vereinigung**
|
||
```
|
||
A ∪ B = { e | ∀ e, e ∈ A oder e ∈ B }
|
||
```
|
||
Zur Vereinigung gehören alle Elemente aus A und alle aus B (keine Verdoppelung der Elemente).
|
||
|
||
**Durchschnitt (Schnittmenge)**
|
||
```
|
||
A ∩ B = { e | ∀ e, e ∈ A und e ∈ B }
|
||
```
|
||
Zum Durchschnitt gehören die Elemente, die gleichzeitig zu A und zu B gehören.
|
||
|
||
**Differenz**
|
||
```
|
||
A — B = { e | ∀ e, e ∈ A und e ∉ B }
|
||
```
|
||
Zur Differenz gehören die Elemente aus A, die zu B nicht gehören.
|
||
|
||
#### Zahlenmengen
|
||
|
||
| Symbol | Name | Definition |
|
||
|---|---|---|
|
||
| **ℕ** | Natürliche Zahlen | = { 0, 1, 2, 3, ... } |
|
||
| **ℤ** | Ganze Zahlen | = { ..., −3, −2, −1, 0, 1, 2, 3, ... } |
|
||
| **ℚ** | Rationale Zahlen | = { q \| ∃ x,y ∈ ℤ ⟹ q = x/y } |
|
||
| **ℐ** | Irrationale Zahlen | = { s \| ∀ x,y ∈ ℤ, y≠0 ⟹ s ≠ x/y } |
|
||
| **ℝ** | Reelle Zahlen | = ℚ ∪ ℐ |
|
||
| **ℂ** | Komplexe Zahlen | = { z = a+b×i \| ∀ a,b ∈ ℝ, i×i = −1 } |
|
||
|
||
**Inklusionen:** ℕ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ
|
||
|
||
**Operationen auf ganzen Zahlen:** Addition, Subtraktion, Multiplikation, ganzzahlige Division (liefert Quotient und Rest – zwei unterschiedliche Operationen)
|
||
|
||
**Operationen auf reellen Zahlen:** Addition, Subtraktion, Multiplikation, reelle Division (liefert nur Quotient; kein Rest definiert)
|
||
|
||
Alle Mengen außer ℂ haben eine **natürliche (lineare) Ordnung**.
|
||
|
||
#### Dimensionen
|
||
|
||
Gegeben zwei Mengen R₁ und R₂ mit dim(R₁) = k und dim(R₂) = n:
|
||
|
||
| Operation | Dimension des Ergebnisses |
|
||
|---|---|
|
||
| R₁ × R₂ | k · n |
|
||
| R₁ ∪ R₂ | ∈ { max{k,n}, ..., k+n } |
|
||
| R₁ ∩ R₂ | ∈ { 0, 1, ..., min{k,n} } |
|
||
| R₁ — R₂ | k − dim{ R₁ ∩ R₂ } |
|
||
|
||
#### Relevanz für Datenbanken
|
||
|
||
- Eine **Relation** (Tabelle) ist eine Untermenge des kartesischen Produkts mehrerer Datentypen
|
||
- **Keine Duplikate** in Mengen → in relationaler Algebra gibt es keine doppelten Tupel (in SQL daher `DISTINCT` nötig)
|
||
- Die Mengenlehre erklärt direkt, warum im Fallbeispiel (Mini-Welt 1) gleiche [RechnPosNr, Menge]-Kombinationen zusammengefasst werden müssen
|
||
|
||
### 1.4 ANSI-SPARC-Modell (Drei-Schichten-Architektur)
|
||
|
||
Das ANSI-SPARC-Modell gewährleistet Unabhängigkeit der Datenbank von Programmiersprache und Hardware:
|
||
|
||
| Ebene | Bezeichnung | Inhalt |
|
||
|---|---|---|
|
||
| **Externe Ebene** | Anwendungs-Ebene | Benutzeroberflächen, Datensichten, API, Schnittstellen. Jede Sicht zeigt nur einen Teil der Daten |
|
||
| **Konzeptionelle Ebene** | Logische Ebene | Beziehungen, Daten. Relationales Datenmodell, ERM-Diagramme, Integritätsbedingungen, Zugriffsrechte |
|
||
| **Interne Ebene** | Physische Ebene | Art und Form der Speicherung. Dateien, Partitionen, Tablespaces, Zugriffsmechanismen |
|
||
|
||
### 1.5 Phasen des Datenbankentwurfs
|
||
|
||
1. **Anforderungsanalyse** → Spezifikation (Pflichtenheft)
|
||
2. **Konzeptueller Entwurf** → Konzeptuelles Schema (ERM)
|
||
3. **Logischer Entwurf** → Logisches Schema (Tabellen)
|
||
4. **Physischer Entwurf** → Physisches Schema (Datenträger)
|
||
|
||
### 1.6 Anforderungsanalyse
|
||
|
||
Im Laufe der Anforderungsanalyse wird erfasst:
|
||
- Welche Abteilungen mit der DB arbeiten
|
||
- Welche Geschäftsprozesse unterstützt werden
|
||
- Welche Daten involviert werden
|
||
- Wie die Daten strukturiert sind
|
||
- Qualitative und quantitative Anforderungen
|
||
|
||
**Schritte nach A. Kemper:**
|
||
1. Identifikation von Organisationseinheiten
|
||
2. Identifikation der zu unterstützenden Aufgaben
|
||
3. Anforderungs-Sammelplan (zu befragende Personen)
|
||
4. Anforderungs-Sammlung
|
||
5. Filterung (Verständigkeit und Eindeutigkeit prüfen)
|
||
6. Satzklassifikationen (Objekte, Beziehungen, Operationen, Ereignisse)
|
||
7. Formalisierung/Systematisierung (ins Pflichtenheft übertragen)
|
||
|
||
**Ergebnisse der Anforderungsanalyse:**
|
||
- **Informationsanforderungen:** Beschreibung von Objekten/Attributen und Beziehungen/Attributen
|
||
- **Datenverarbeitungsanforderungen:** Beschreibung von Prozessen
|
||
|
||
**Drei Arten von Beschreibungen:**
|
||
|
||
**Objektbeschreibung** (z. B. Uni-Angestellte):
|
||
|
||
| Attribut | Typ | Länge | Identifizierend | Beispiel |
|
||
|---|---|---|---|---|
|
||
| PersonalNr | Char | 10 | ja | 1234561234 |
|
||
| Gehalt | Dezimal | 8.2 | nein | 9000.11 |
|
||
| Rang | String | 4 | nein | W3 |
|
||
|
||
**Beziehungsbeschreibung** (z. B. prüfen):
|
||
- Beteiligte Objekte: Professor (Prüfer), Student (Prüfling), Vorlesung (Lehrstoff)
|
||
- Attribute: Datum, Uhrzeit, Note
|
||
|
||
**Prozessbeschreibung** (z. B. Zeugnisausstellung):
|
||
- Häufigkeit, Priorität, benötigte Daten, Datenmenge
|
||
|
||
### 1.7 Konzeptueller Entwurf – Entity-Relationship-Modell (ERM)
|
||
|
||
Auf Basis der Anforderungsanalyse wird ein konzeptuelles ERM erstellt. Das konkrete DBMS wird noch nicht betrachtet.
|
||
|
||
#### Modellierungsstrukturen in Peter-Chen-Notation
|
||
|
||
| Element | Grafische Darstellung | Bedeutung |
|
||
|---|---|---|
|
||
| **Entitätstypen** | Rechteck | Objekte der realen Welt |
|
||
| **Beziehungstypen** | Raute | Bindungen zwischen Entitäten |
|
||
| **Attribute** | Oval/Kreis | Charakteristiken von Entitäten und Beziehungen |
|
||
| **Funktionalitäten** | Beschriftung an Verbindungslinien | Kardinalität der Beziehungen |
|
||
| **Schlüssel** | Unterstrichene Attribute | Identifizierende Attribute |
|
||
| **Rollen** | Beschriftung bei rekursiven Beziehungen | Rolle einer Entität in der Beziehung |
|
||
|
||
#### Entitätstypen
|
||
|
||
Gegenstände sind Objekte der realen Welt, die zu **Gegenstandstypen (Entitätstypen)** abstrahiert werden:
|
||
- "Zimmermann", "Merkel", "Meier" → **Mensch**
|
||
- "VW", "Mercedes", "BMW" → **Auto**
|
||
|
||
Man arbeitet ausschließlich mit Entitätstypen (abstrakte Klassen), nicht mit einzelnen Instanzen.
|
||
|
||
#### Beziehungstypen
|
||
|
||
Beziehungen drücken Bindungen zwischen Entitäten aus. Nicht alle Entitätstypen müssen verbunden sein, aber ein alleinstehender Entitätstyp ohne Beziehung ist verdächtig.
|
||
|
||
#### Attribute
|
||
|
||
**Attributierte Beziehungen:** Wenn beide Entitätstypen semantisch gleiche Attribute haben, werden diese dem Beziehungstyp zugeordnet (z. B. Betrag bei "Kredit geben" zwischen Kunde und Bank).
|
||
|
||
**Entscheidung Entitätstyp vs. Attribut:**
|
||
- Wird etwas durch anderes beschrieben → das Beschriebene ist Entitätstyp, das Beschreibende ist Attribut
|
||
- Kann etwas durch nichts weiteres beschrieben werden → es ist ein Attribut
|
||
|
||
**Attributtypen:**
|
||
|
||
| Typ | Beschreibung | Beispiel |
|
||
|---|---|---|
|
||
| **Einfach** | Ein Wert zu einem Zeitpunkt | Name = "Müller" |
|
||
| **Mehrwertig** | Mehrere Werte gleichzeitig | Ampel: rot + gelb |
|
||
| **Zusammengesetzt** | Besteht aus Teilattributen | Adresse: PLZ + Ort + Straße |
|
||
| **Abgeleitet** | Aus anderen Attributen berechnet | Bruttopreis = Netto × (1 + MwSt) |
|
||
|
||
#### Schlüssel und Primärschlüssel
|
||
|
||
- **Schlüssel:** Attributmenge, deren Werte eine Entität eindeutig identifizieren
|
||
- **Schlüsselkandidaten:** Mehrere mögliche Schlüssel
|
||
- **Primärschlüssel (PK):** Der Kandidat mit minimaler Länge, im ERM unterstrichen
|
||
- **Minimaler Schlüssel:** Keine Untermenge des PK bildet selbst einen Schlüssel
|
||
- **Wichtig:** Wahl eines anderen PK ändert das gesamte Modell
|
||
|
||
#### Rekursive Beziehungen
|
||
|
||
Beziehungen zwischen Entitäten desselben Entitätstyps. Dabei werden **Rollen** zugeschrieben.
|
||
|
||
**Beispiele:**
|
||
- Vorlesungen → voraussetzen (Vorgänger/Nachfolger)
|
||
- Softwareprodukt → Versionsnummer
|
||
- Polizisten → im Zweierteam patrouillieren
|
||
|
||
#### Funktionalitäten
|
||
|
||
Funktionalität gibt an, wie viele Instanzen in einer Beziehung teilnehmen:
|
||
|
||
| Typ | Beschreibung | Beispiel |
|
||
|---|---|---|
|
||
| **1:1** | Einer Entität aus E1 entspricht höchstens eine aus E2 (und umgekehrt) | Persönliche Daten ↔ Ansprechdaten |
|
||
| **1:N** | Einer aus E1 entsprechen mehrere aus E2, aber einer aus E2 höchstens eine aus E1 | Schüler → Fahrausweise |
|
||
| **N:M** | Mehrere aus E1 entsprechen mehreren aus E2 | Studenten ↔ Vorlesungen (hören) |
|
||
|
||
**Auflösung einer M:N-Beziehung:** Wird in zwei 1:N-Beziehungen aufgebrochen durch Einführung eines neuen Entitätstyps (z. B. Hersteller ↔ Lieferant → Hersteller → Herstlr_Liefrnt ← Lieferant).
|
||
|
||
#### (min,max)-Notation
|
||
|
||
Genauere Angabe der Kardinalitäten als Standardfunktionalitäten:
|
||
- **min = 0:** Entitäten, die an keiner Beziehung teilnehmen
|
||
- **max = *:** Beliebig viele Entitäten
|
||
|
||
**Beispiel Polyeder:**
|
||
- Polyeder (4,*) — Hülle — (1,1) Flächen
|
||
- Flächen (3,*) — Grenze — (2,2) Kanten
|
||
- Kanten (2,2) — StartEnde — (3,*) Punkte
|
||
|
||
#### Mehrstellige Beziehungen
|
||
|
||
- **Ternäre Beziehung:** Zwischen 3 Entitätstypen
|
||
- **n-äre Beziehung:** Zwischen n Entitätstypen
|
||
- Sollten möglichst in binäre Beziehungen umgewandelt werden
|
||
- Beispiel: "prüfen" (Student, Vorlesung, Professor) → neuer Entitätstyp "Prüfungen" mit binären Beziehungen
|
||
|
||
#### Spezielle Konzepte
|
||
|
||
**Komposition / Schwache Entitäten (has-a):**
|
||
Existenz eines Entitätstyps ist von der Existenz eines anderen abhängig.
|
||
- Beispiel: Konto existiert nur in Zusammenhang mit einer Bank
|
||
|
||
**Generalisierung (is-a):**
|
||
Abstraktion auf Ebene der Entitätstypen. Gemeinsame Eigenschaften werden in einen **Obertyp** ausgelagert, spezifische bleiben bei den **Untertypen**.
|
||
- Beispiel: Lebensmittel (gültig bis) und Eisenwaren (Garantiefrist) → Obertyp **Produkt** (Bezeichnung, Hersteller)
|
||
|
||
**Aggregation (has-a):**
|
||
Verschiedene Entitätstypen bilden in ihrer Gemeinsamkeit einen neuen Entitätstyp.
|
||
- Beispiel: Fahrrad besteht aus Rahmen (Rohre, Lenker) und Rad (Speiche, Felge)
|
||
|
||
### 1.8 Logischer Entwurf – Konvertierung ERM → Tabellen
|
||
|
||
#### Definitionen
|
||
|
||
- **Datentyp** = Werte + Operationen (z. B. integer: +, -, *, /, mod)
|
||
- **Relation** = Untermenge des kartesischen Produktes mehrerer Datentypen = **Tabelle**
|
||
- **Tupel** = Zeile (Record, Datensatz)
|
||
- **Feld** = Spalte (Attribut, Eigenschaft)
|
||
- **Schema** = Namen aller Felder + Datentypen + Länge + Reihenfolge
|
||
|
||
**Vorteile des relationalen Modells:**
|
||
- Entitäten und Beziehungen werden gleich als Tabellen dargestellt
|
||
- Dieselben algebraischen Operationen für beide
|
||
- Mathematisch begründet durch E.F. Codd
|
||
|
||
**Notation:**
|
||
```
|
||
RelationsName = { [ Feld1:Datentyp1, Feld2:Datentyp2, ... ] }
|
||
```
|
||
Beispiel: `Auto = { [ KFZ:string, Modell:string, Gewicht:real, Baujahr:integer ] }`
|
||
Primärschlüssel wird unterstrichen.
|
||
|
||
#### Konvertierungsregeln
|
||
|
||
**Regeln für Entitätstypen:**
|
||
1. Neue Tabelle (Entitäts-Tabelle) bilden
|
||
2. Alle Attribute des Entitätstyps inkludieren
|
||
|
||
**Regeln für Beziehungstypen:**
|
||
1. Neue Tabelle (Beziehungs-Tabelle) bilden
|
||
2. Primärschlüssel aller verbundenen Entitätstypen inkludieren → bilden i.d.R. den PK der Beziehungstabelle
|
||
3. Attribute des Beziehungstyps inkludieren
|
||
|
||
#### Vereinfachung der Darstellungen
|
||
|
||
**1:1-Beziehungen** – Zwei Optionen:
|
||
- **Option A:** Beide Entitäts-Tabellen zu einer Tabelle zusammenführen + Beziehungsattribute. Vorsicht: Datensätze können zu groß werden
|
||
- **Option B:** Beziehungs-Tabelle weglassen, PK einer Entitäts-Tabelle als FK in die andere aufnehmen
|
||
|
||
**1:N-Beziehungen:**
|
||
- Beziehungs-Tabelle weglassen
|
||
- In die Tabelle auf der **N-Seite** den PK der Tabelle auf der **1-Seite** als **Fremdschlüssel (FK)** einfügen
|
||
- Beziehungsattribute ebenfalls in die N-Seiten-Tabelle
|
||
|
||
**Schwache Entitäten:**
|
||
- Eigene Tabelle für schwache Entität
|
||
- PK der referenzierten (starken) Entität wird **Teil des PK** der schwachen Entität (Unterschied zu normalen 1:N-Beziehungen, wo der FK nicht Teil des PK wird)
|
||
|
||
#### Beispiel: Uni-Schema als Tabellen
|
||
|
||
| Tabelle | Felder |
|
||
|---|---|
|
||
| Professoren | PersNr, Name, Rang, Raum |
|
||
| Studenten | MatrNr, Name, Semester |
|
||
| Vorlesungen | VorlNr, Titel, SWS, gelesenVon (FK→Professoren) |
|
||
| Assistenten | PersNr, Name, Fachgebiet, Boss (FK→Professoren) |
|
||
| hören | MatrNr (FK), VorlNr (FK) |
|
||
| voraussetzen | Vorgänger (FK), Nachfolger (FK) |
|
||
| prüfen | MatrNr (FK), VorlNr (FK), PersNr (FK), Note |
|
||
|
||
#### Wichtige Bemerkung
|
||
|
||
**Keine Felder/PK/FK willkürlich in Tabellen hinzufügen!** Nur laut Vereinfachungsregeln.
|
||
|
||
**Ausnahmen:**
|
||
- ERM-bezogene Gründe (z. B. PID, MonsterID)
|
||
- Auditing/Richtlinien (z. B. "Alle Zeilen müssen fortlaufend nummeriert werden")
|
||
- Administrative Gründe (z. B. Fusion großer Datenmengen)
|
||
- Anwendungsbezogene Gründe (z. B. OO-DB pflegen PK selbst)
|
||
|
||
**Kontroverse um künstliche IDs:**
|
||
Einige Autoren empfehlen ausdrücklich künstliche IDs, weil:
|
||
- PK soll keine semantischen Informationen enthalten
|
||
- PK darf sich nicht mit der Zeit ändern
|
||
- PK soll einfach aufgebaut sein (nicht aus mehreren Feldern)
|
||
|
||
---
|
||
|
||
## 2. Modellierung – Fallbeispiel (b_ModellierungFB)
|
||
|
||
### Überblick
|
||
|
||
Modellierung einer Rechnung: Beispiel-Rechnungen betrachten → Mini-Welten beschreiben → Konzeptuellen Entwurf erstellen → Logischen Entwurf erstellen → Fazit
|
||
|
||
### Identifizierte Entitätstypen
|
||
|
||
**Artikel:**
|
||
- Artikelnummer (kann fehlen), Beschreibung (immer vorhanden), Einzelpreis (Netto), MwSt-Satz und MwSt-Betrag
|
||
|
||
**Rechnungsposition:**
|
||
- Reihenfolgenummer (kann fehlen, aber wichtig), Menge / Anzahl der Artikel
|
||
|
||
**Rechnung (übergeordnet):**
|
||
- Rechnungsnummer, Datum, Gesamtsumme (abgeleitetes Attribut), MwSt-Betrag der ganzen Rechnung (abgeleitetes Attribut)
|
||
|
||
**Formale Notation:**
|
||
```
|
||
Rechnung = { [ RgNr, Datum, Gesamtpreis, GesamtMwSt ] }
|
||
Artikel = { [ ArtNr, ArtBezeichnung, EP, MwStSatz ] }
|
||
```
|
||
|
||
### Mini-Welt 1
|
||
|
||
Alle Rechnungen werden **durchgehend** betrachtet. Gleiche Kombinationen [RechnPosNr, Menge] werden **zusammengefasst** (laut Mengenlehre nach G. Cantor: keine doppelten Elemente).
|
||
|
||
```
|
||
Rechnungsposition = { [ RechnPosNr, Menge, Zwischensumme, ZwischenMwSt ] }
|
||
```
|
||
|
||
**Konzeptueller Entwurf:**
|
||
|
||
| Beziehung | Funktionalität |
|
||
|---|---|
|
||
| Rechnung — besteht aus — Rechnungsposition | **M : N** |
|
||
| Rechnungsposition — beinhaltet — Artikel | **N : 1** |
|
||
|
||
**Logischer Entwurf:**
|
||
```
|
||
Rechnung = { [ RgNr, Datum, Gesamtpreis, GesamtMwSt ] }
|
||
Artikel = { [ ArtNr, EP, MwStSatz, ArtBezeichnung ] }
|
||
Rechnungsposition = { [ RechnPosNr, Menge, Zwischensumme, ZwischenMwSt ] }
|
||
besteht_aus = { [ RgNr, RechnPosNr, Menge ] }
|
||
beinhaltet = { [ ArtNr, RechnPosNr, Menge ] }
|
||
```
|
||
|
||
**Vereinfachung** (1:N-Beziehung "beinhaltet" auflösen):
|
||
```
|
||
Rechnungsposition = { [ ArtNr, RechnPosNr, Menge, Zwischensumme, ZwischenMwSt ] }
|
||
```
|
||
|
||
### Mini-Welt 2
|
||
|
||
**Alle** Rechnungspositionen aus allen Rechnungen werden individuell erfasst, auch wenn [RechnPosNr, Menge] gleich sind. Da Duplikate nach Cantor nicht zulässig sind, wird ein neues Attribut **LaufendeNummer (LfndNr)** eingeführt.
|
||
|
||
**Konsequenz:** Mehr Entitäten im Entitätstyp, mehr Redundanz, aber die **Zuordnung jeder Position zu einer Rechnung bleibt erhalten**.
|
||
|
||
```
|
||
Rechnungsposition = { [ LfndNr, RechnPosNr, Menge, Zwischensumme, ZwischenMwSt ] }
|
||
```
|
||
|
||
**Konzeptueller Entwurf:**
|
||
|
||
| Beziehung | Funktionalität |
|
||
|---|---|
|
||
| Rechnung — besteht aus — Rechnungsposition | **1 : N** |
|
||
| Rechnungsposition — beinhaltet — Artikel | **N : 1** |
|
||
|
||
**Logischer Entwurf (nach Vereinfachung beider 1:N-Beziehungen):**
|
||
```
|
||
Rechnungsposition = { [ ArtNr, RgNr, LfndNr, RechnPosNr, Menge,
|
||
Zwischensumme, ZwischenMwSt ] }
|
||
```
|
||
|
||
**Hinweis:** LfndNr wird nicht für Verknüpfungen (Join-Prädikat) verwendet, hat wenig Semantik, muss aber gepflegt werden.
|
||
|
||
### Vergleich der Mini-Welten
|
||
|
||
| Aspekt | Mini-Welt 1 | Mini-Welt 2 |
|
||
|---|---|---|
|
||
| Beziehung Rechnung↔Position | M:N | 1:N |
|
||
| Duplikate | Keine (zusammengefasst) | Individuell (via LfndNr) |
|
||
| Zuordnung Position→Rechnung | Geht verloren | Bleibt erhalten |
|
||
| Redundanz | Weniger | Mehr |
|
||
| Tabellen nach Vereinfachung | 3 + besteht_aus | 3 (alles in einer) |
|
||
|
||
**Empfehlung:** Beide Modelle implementieren und Antwortzeiten bei größerem Datenumfang vergleichen.
|
||
|
||
---
|
||
|
||
## 3. Relationale Algebra (c_Algebra)
|
||
|
||
### Formale Sprachen für Relationen
|
||
|
||
| Sprache | Beschreibung |
|
||
|---|---|
|
||
| **Relationale Algebra** | Definiert Operationen über Relationen; Ergebnis ist wieder eine Relation (Geschlossenheit). Definiert **was** man will, nicht **wie** |
|
||
| **Relationenkalkül** | Deklarative Beschreibung gewünschter Ergebnisse |
|
||
|
||
Die relationale Algebra bildet die **Basis für SQL**.
|
||
|
||
**Beispiele Relationenkalkül:**
|
||
```
|
||
{ k | k ∈ KUNDEN ∧ k.STATUS = "Aktiv" }
|
||
{ [a.NAME, f.TITEL] | a∈ACTOR ∧ f∈FILM ∧ a.ID=f.A_ID }
|
||
```
|
||
|
||
### Grundoperatoren (vollständiger Satz)
|
||
|
||
| Operator | Notation | Beschreibung |
|
||
|---|---|---|
|
||
| **Selektion** | σ_Prädikat(Relation) | Zeilen filtern nach Bedingung |
|
||
| **Projektion** | π_Attribute(Relation) | Spalten auswählen |
|
||
| **Kartesisches Produkt** | R1 × R2 | Alle Kombinationen von Zeilen |
|
||
| **Umbenennung** | ρ_Alias(Relation) | Relation oder Attribute umbenennen |
|
||
| **Vereinigung** | R1 ∪ R2 | Tupel aus beiden Relationen zusammenfassen |
|
||
| **Differenz** | R1 — R2 | Tupel aus R1, die nicht in R2 vorkommen |
|
||
|
||
**Wichtig:** Dieser Satz ist **vollständig** — alle anderen Operatoren lassen sich durch diese ausdrücken.
|
||
|
||
### Operatoren im Detail
|
||
|
||
#### Selektion σ
|
||
|
||
Filtert Zeilen einer Relation anhand eines Prädikats. Das Prädikat wird für **jede Zeile** geprüft.
|
||
|
||
```
|
||
σ_{Semester > 10}(Studenten)
|
||
→ Ergebnis: MatrNr 24002 (Xenokrates, 18), MatrNr 25403 (Jonas, 12)
|
||
|
||
σ_{Name = 'Sokrates'}(Professoren)
|
||
→ Ergebnis: PersNr 2125, Sokrates, C4, Raum 226
|
||
```
|
||
|
||
#### Projektion π
|
||
|
||
Wählt bestimmte Spalten aus einer Relation aus.
|
||
|
||
```
|
||
π_{MatrNr, Name}(Studenten)
|
||
→ Ergebnis: Nur MatrNr und Name aller Studenten
|
||
|
||
π_{Rang}(Professoren)
|
||
→ Ergebnis: C3, C4 (Duplikate werden in relationaler Algebra eliminiert!)
|
||
```
|
||
|
||
**Wichtig:** In relationaler Algebra gibt es **keine Duplikate**, in SQL schon (deshalb `DISTINCT`).
|
||
|
||
#### Zusammenhang Algebra ↔ SQL
|
||
|
||
| Relationale Algebra | SQL |
|
||
|---|---|
|
||
| **π** (Projektion) | **SELECT** |
|
||
| **σ** (Selektion) | **WHERE** |
|
||
|
||
| Anfrage | Algebra | SQL |
|
||
|---|---|---|
|
||
| Wie heißen die Professoren? | π_{Name}(Professoren) | `SELECT Name FROM Professoren;` |
|
||
| Name des Studenten mit MatrNr 25403? | π_{Name}(σ_{MatrNr=25403}(Studenten)) | `SELECT Name FROM Studenten WHERE MatrNr = 25403` |
|
||
| Studenten mit >6 Semestern? | π_{Name,MatrNr}(σ_{Semester>6}(Studenten)) | `SELECT Name, MatrNr FROM Studenten WHERE Semester > 6` |
|
||
|
||
#### Reihenfolge der Operatoren
|
||
|
||
**Grundsätzlich dürfen relationale Operatoren in zusammengesetzten Ausdrücken nicht vertauscht werden!**
|
||
|
||
```
|
||
π_{Name,MatrNr}(σ_{Semester>6}(Studenten)) ← korrekt
|
||
σ_{Semester>6}(π_{Name,MatrNr}(Studenten)) ← FALSCH (Semester ist nach Projektion weg!)
|
||
```
|
||
|
||
#### Umbenennung ρ
|
||
|
||
Notwendig wenn:
|
||
- Relationen gleich benannte Attribute besitzen, die beide in der Abfrage benötigt werden
|
||
- Eine Relation **mehrfach** in einer Abfrage vorkommt (rekursive Beziehungen)
|
||
|
||
**Umbenennung ist immer temporär (operatorbezogen).**
|
||
|
||
```
|
||
ρ_{Relation-Alias}(Relation) ← Relation umbenennen
|
||
ρ_{Attribut-Alias ← Attribut}(Relation) ← Attribut umbenennen
|
||
```
|
||
|
||
#### Vereinigung ∪
|
||
|
||
**Voraussetzungen (Vereinigungskompatibilität):**
|
||
- Gleiche Anzahl von Attributen
|
||
- Attribute gleich benannt
|
||
- Gleichnamige Attribute haben denselben Datentyp
|
||
|
||
Zum Erfüllen der Kriterien können Projektion und Umbenennung verwendet werden.
|
||
|
||
**Ergebnis:** Selbes Schema wie die Operanden, Tupel zusammengefasst, **Duplikate eliminiert**.
|
||
|
||
```sql
|
||
SELECT Name FROM Studenten UNION
|
||
SELECT Name FROM Assistenten UNION
|
||
SELECT Name FROM Professoren;
|
||
```
|
||
|
||
**Beispiel:**
|
||
```
|
||
R = { [1, abc, 1.5], [2, def, 2.3] }
|
||
S = { [7, xyz, 4.4], [8, uvw, 6.7] }
|
||
R ∪ S = { [1, abc, 1.5], [2, def, 2.3], [7, xyz, 4.4], [8, uvw, 6.7] }
|
||
```
|
||
|
||
#### Differenz —
|
||
|
||
**Gleiche Voraussetzungen** wie bei Vereinigung.
|
||
|
||
**Ergebnis:** Selbes Schema, enthält Tupel aus R1, die in R2 **nicht** vorkommen.
|
||
|
||
```
|
||
R = { [1, abc, 1.5], [2, def, 2.3] }
|
||
S = { [2, def, 2.3], [7, xyz, 4.4] }
|
||
R — S = { [1, abc, 1.5] }
|
||
```
|
||
|
||
**SQL-Umsetzung:**
|
||
```sql
|
||
-- Variante 1: NOT IN
|
||
SELECT Name FROM Studenten WHERE MatrNr NOT IN
|
||
(SELECT DISTINCT MatrNr FROM hoeren);
|
||
|
||
-- Variante 2: MINUS
|
||
SELECT MatrNr FROM Studenten
|
||
MINUS
|
||
SELECT DISTINCT MatrNr FROM hoeren;
|
||
```
|
||
|
||
#### Schnittmenge ∩
|
||
|
||
Die Schnittmenge ist **kein Grundoperator**, kann aber abgeleitet werden:
|
||
|
||
```
|
||
A ∩ B = A — (A — B) = B — (B — A)
|
||
```
|
||
|
||
**SQL-Umsetzung:**
|
||
```sql
|
||
-- Variante 1: INTERSECT
|
||
SELECT gelesenVon AS PersNr FROM Vorlesungen
|
||
INTERSECT
|
||
SELECT PersNr FROM Professoren WHERE Rang = 'C4';
|
||
|
||
-- Variante 2: IN (falls INTERSECT nicht verfügbar)
|
||
SELECT gelesenVon AS PersNr FROM Vorlesungen
|
||
WHERE PersNr IN
|
||
(SELECT PersNr FROM Professoren WHERE Rang = 'C4');
|
||
```
|
||
|
||
#### Kartesisches Produkt × und Join
|
||
|
||
Komplexe Abfragen nutzen das kartesische Produkt mit anschließender Selektion (**Equi-Join**):
|
||
|
||
**Anfrage:** "Welche Studenten hören welche Vorlesungen?"
|
||
|
||
```
|
||
π_{s.Name, v.Titel}(σ_{h.VorlNr=v.VorlNr ∧ s.MatrNr=h.MatrNr}(
|
||
Studenten s × Vorlesungen v × hoeren h))
|
||
```
|
||
|
||
### Zusammenfassung Operatoren
|
||
|
||
| Operator | Symbol | SQL-Entsprechung | Grundoperator? |
|
||
|---|---|---|---|
|
||
| Selektion | σ | WHERE | Ja |
|
||
| Projektion | π | SELECT | Ja |
|
||
| Kartesisches Produkt | × | FROM (Cross Join) | Ja |
|
||
| Umbenennung | ρ | AS | Ja |
|
||
| Vereinigung | ∪ | UNION | Ja |
|
||
| Differenz | — | MINUS / NOT IN | Ja |
|
||
| Schnittmenge | ∩ | INTERSECT / IN | Nein (ableitbar) |
|
||
| Join | ⋈ | JOIN ... ON | Nein (σ + ×) |
|
||
|
||
---
|
||
|
||
## 4. SQL (d_SQL)
|
||
|
||
### 4.1 SQL-Kategorien
|
||
|
||
| Kategorie | Abkürzung | Befehle |
|
||
|---|---|---|
|
||
| **Data Definition Language** | DDL | ALTER, COMMENT, CREATE, DROP, RENAME, TRUNCATE |
|
||
| **Data Manipulation Language** | DML | CALL, DELETE, EXPLAIN, INSERT, LOCK, MERGE, SELECT, UPDATE |
|
||
| **Data Control Language** | DCL | GRANT, REVOKE |
|
||
| **Transaction Control Language** | TCL | COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION |
|
||
|
||
### 4.2 Datentypen
|
||
|
||
**Datentyp = Werte + Operationen**
|
||
|
||
#### Oracle-Datentypen
|
||
|
||
| Datentyp | Beschreibung |
|
||
|---|---|
|
||
| **VARCHAR(n) / VARCHAR2(n)** | Zeichenkette variabler Länge |
|
||
| **CHAR(n)** | Zeichenkette fester Länge |
|
||
| **NUMBER(p, s)** | Dezimale Zahl, p=Stellen (1–38), s=Nachkomma (-84–127), Werte bis ±10^125 |
|
||
| **DECIMAL(p, s)** | Dezimale Zahl, Werte bis ±10^308 |
|
||
| **INTEGER** | Ganze Zahl, -2.147.483.648 bis 2.147.483.647 |
|
||
| **DATE** | Datum/Uhrzeit (sekundengenau) |
|
||
| **RAW(n)** | Binärdaten, 1–2000 Bytes |
|
||
| **LONG RAW** | Binärdaten bis 2 GiB |
|
||
| **CLOB** | Zeichenketten bis 4 GiB |
|
||
| **BLOB** | Binärdaten bis 4 GiB |
|
||
| **CFILE / BFILE** | Zeiger auf externe Dateien (Text/Binär) |
|
||
|
||
### 4.3 Einfache Befehle
|
||
|
||
#### DDL – Tabellen anlegen und löschen
|
||
|
||
```sql
|
||
CREATE TABLE Professoren (
|
||
PersNr INTEGER NOT NULL,
|
||
Name VARCHAR(30) NOT NULL,
|
||
Rang CHARACTER(2),
|
||
PRIMARY KEY(PersNr)
|
||
);
|
||
|
||
DROP TABLE Professoren;
|
||
```
|
||
|
||
#### DML – Einfügen, Löschen, Ändern
|
||
|
||
```sql
|
||
-- Einzelnes Tupel einfügen
|
||
INSERT INTO Professoren (PersNr, Name, Rang)
|
||
VALUES (30314, 'Cantor', 'W2');
|
||
|
||
-- Mehrere Tupel gleichzeitig
|
||
INSERT INTO Professoren (PersNr, Name, Rang) VALUES
|
||
(30314, 'Cantor', 'W2'),
|
||
(30315, 'Leibniz', 'W1'),
|
||
(30316, 'Plank', 'W1');
|
||
|
||
-- Einfügen mit verschachtelter Abfrage
|
||
INSERT INTO hoeren
|
||
SELECT MatrNr, VorlNr
|
||
FROM Studenten, Vorlesungen
|
||
WHERE Titel = 'Datenbanken';
|
||
|
||
-- Teilweises Einfügen (Rang wird NULL)
|
||
INSERT INTO Professoren (PersNr, Name)
|
||
VALUES (30317, 'Feuerbach');
|
||
|
||
-- Löschen
|
||
DELETE FROM Professoren;
|
||
DELETE FROM Professoren WHERE Rang = 'W3';
|
||
|
||
-- Ändern
|
||
UPDATE Studenten SET Semester = Semester + 1;
|
||
```
|
||
|
||
#### Inline-View
|
||
|
||
Eine SELECT-Anweisung mit einer weiteren SELECT-Anweisung in der FROM-Klausel:
|
||
|
||
```sql
|
||
SELECT p.Name, p.Raum
|
||
FROM Professoren p,
|
||
(SELECT DISTINCT Boss FROM Assistenten) a
|
||
WHERE p.PersNr = a.Boss;
|
||
```
|
||
|
||
#### Allgemeine SELECT-Syntax
|
||
|
||
```sql
|
||
SELECT column1, column2
|
||
FROM table1, table2
|
||
WHERE condition
|
||
GROUP BY column1, column2
|
||
HAVING condition
|
||
ORDER BY column1, column2;
|
||
```
|
||
|
||
### 4.4 Erweiterungen
|
||
|
||
#### Sortieren
|
||
```sql
|
||
SELECT PersNr, Name, Rang FROM Professoren
|
||
ORDER BY Rang DESC, Name ASC;
|
||
```
|
||
|
||
#### Duplikate eliminieren
|
||
```sql
|
||
SELECT DISTINCT Rang FROM Professoren;
|
||
```
|
||
|
||
#### Platzhalter (nur mit LIKE)
|
||
- `_` — genau ein Zeichen
|
||
- `%` — beliebig viele Zeichen (auch keines)
|
||
|
||
```sql
|
||
SELECT * FROM Professoren WHERE Rang LIKE 'W_';
|
||
SELECT * FROM Professoren WHERE Name LIKE 'T%eophrastos';
|
||
```
|
||
|
||
#### IN / NOT IN
|
||
```sql
|
||
SELECT Name FROM Studenten WHERE Semester IN (1, 2, 3);
|
||
|
||
SELECT Name FROM Professoren
|
||
WHERE PersNr NOT IN (SELECT gelesenVon FROM Vorlesungen);
|
||
```
|
||
|
||
#### ALL / ANY
|
||
```sql
|
||
-- ALL: Alle Bedingungen müssen erfüllt sein (AND)
|
||
SELECT Name FROM Studenten WHERE Semester >= ALL (7, 8, 9);
|
||
|
||
-- ANY: Mindestens eine Bedingung (OR)
|
||
SELECT Name FROM Studenten WHERE Semester >= ANY (7, 8, 9);
|
||
```
|
||
|
||
#### Aggregatfunktionen
|
||
|
||
Aggregatfunktionen berechnen einen **einzelnen Wert** aus einer Menge von Zeilen:
|
||
|
||
| Funktion | Beschreibung | Beispiel |
|
||
|---|---|---|
|
||
| **COUNT(\*)** | Anzahl aller Zeilen | Anzahl aller Studenten |
|
||
| **COUNT(Spalte)** | Anzahl nicht-NULL-Werte | Anzahl Studenten mit gesetztem Semester |
|
||
| **SUM(Spalte)** | Summe der Werte | Summe aller Gehälter |
|
||
| **AVG(Spalte)** | Durchschnitt | Durchschnittsnote |
|
||
| **MIN(Spalte)** | Kleinster Wert | Niedrigstes Semester |
|
||
| **MAX(Spalte)** | Größter Wert | Höchstes Semester |
|
||
|
||
```sql
|
||
-- Anzahl aller Studenten
|
||
SELECT COUNT(*) FROM Studenten;
|
||
|
||
-- Durchschnittsnote
|
||
SELECT AVG(Note) FROM pruefen;
|
||
|
||
-- Anzahl verschiedener Ränge
|
||
SELECT COUNT(DISTINCT Rang) FROM Professoren;
|
||
```
|
||
|
||
#### GROUP BY
|
||
|
||
`GROUP BY` gruppiert Zeilen nach gemeinsamen Attributwerten, sodass Aggregatfunktionen **pro Gruppe** berechnet werden:
|
||
|
||
```sql
|
||
-- Anzahl Vorlesungen pro Professor
|
||
SELECT gelesenVon, COUNT(*) AS Anzahl
|
||
FROM Vorlesungen
|
||
GROUP BY gelesenVon;
|
||
|
||
-- Durchschnittsnote pro Vorlesung
|
||
SELECT VorlNr, AVG(Note) AS Schnitt
|
||
FROM pruefen
|
||
GROUP BY VorlNr;
|
||
```
|
||
|
||
**Wichtig:** In der SELECT-Klausel dürfen bei GROUP BY nur:
|
||
- Spalten aus GROUP BY und/oder
|
||
- Aggregatfunktionen stehen
|
||
|
||
#### HAVING
|
||
|
||
`HAVING` filtert **Gruppen** (analog zu WHERE für Zeilen). Wird immer **nach** GROUP BY angewendet:
|
||
|
||
```sql
|
||
-- Nur Professoren, die mehr als 2 Vorlesungen halten
|
||
SELECT gelesenVon, COUNT(*) AS Anzahl
|
||
FROM Vorlesungen
|
||
GROUP BY gelesenVon
|
||
HAVING COUNT(*) > 2;
|
||
```
|
||
|
||
**Reihenfolge der Klauseln:**
|
||
```sql
|
||
SELECT ... -- 5. Projektion
|
||
FROM ... -- 1. Tabellen bestimmen
|
||
WHERE ... -- 2. Zeilen filtern
|
||
GROUP BY ... -- 3. Gruppen bilden
|
||
HAVING ... -- 4. Gruppen filtern
|
||
ORDER BY ... -- 6. Sortieren
|
||
```
|
||
|
||
#### NULL-Werte
|
||
|
||
- `NULL` bedeutet **unbekannt / nicht vorhanden**
|
||
- Vergleiche mit NULL sind immer `NULL` (nicht TRUE oder FALSE)
|
||
- Prüfung auf NULL: `IS NULL` / `IS NOT NULL`
|
||
|
||
```sql
|
||
-- Professoren ohne Raum
|
||
SELECT Name FROM Professoren WHERE Raum IS NULL;
|
||
|
||
-- Professoren mit Raum
|
||
SELECT Name FROM Professoren WHERE Raum IS NOT NULL;
|
||
```
|
||
|
||
- Aggregatfunktionen **ignorieren** NULL-Werte (außer COUNT(\*))
|
||
|
||
### 4.5 Anfragen über mehrere Relationen
|
||
|
||
**Vorgehensweise:**
|
||
1. Kreuzprodukt aus Tabellen bilden
|
||
2. Relevante Zeilen und Felder ausschneiden
|
||
|
||
**Wichtigste Voraussetzung:** Information über Verbindung zwischen Tabellen (Join-Prädikat).
|
||
|
||
```sql
|
||
SELECT p.Name Professor, a.Name Assistent
|
||
FROM Professoren p, Assistenten a
|
||
WHERE p.PersNr = a.Boss; -- join-Prädikat (access-Prädikat)
|
||
```
|
||
|
||
**Aliasse** sind praktikabel und notwendig, wenn Felder mit gleichen Namen aus verschiedenen Tabellen involviert sind.
|
||
|
||
### 4.6 JOINs
|
||
|
||
#### Motivation
|
||
|
||
Ohne JOIN stehen Join- und Filter-Prädikate zusammen in WHERE. Der JOIN-Operator **trennt** diese:
|
||
- **JOIN ... ON**: Join-Prädikat
|
||
- **WHERE**: Filter-Prädikat
|
||
|
||
→ Erleichtert dem Optimizer die Arbeit.
|
||
|
||
#### Innere JOINs
|
||
|
||
Tupel **ohne Partner gehen verloren**.
|
||
|
||
**Natürlicher Verbund (NATURAL JOIN):**
|
||
- Voraussetzung: Gleich benannte Attribute mit gleichem Datentyp
|
||
- Verknüpft automatisch über gleichnamige Spalten
|
||
- Join-Attribute erscheinen nur einmal im Ergebnis
|
||
|
||
```sql
|
||
SELECT MatrNr, Name, Titel
|
||
FROM Studenten NATURAL JOIN hoeren NATURAL JOIN Vorlesungen;
|
||
```
|
||
|
||
**Allgemeiner Verbund (Theta-JOIN / INNER JOIN):**
|
||
- Beliebige Attribute und Bedingungen
|
||
- Keine Attribute werden eliminiert
|
||
|
||
```sql
|
||
SELECT p.Name Professor, a.Name Assistent
|
||
FROM Professoren p JOIN Assistenten a ON p.PersNr = a.Boss;
|
||
```
|
||
|
||
#### Äußere JOINs
|
||
|
||
Tupel **ohne Partner werden mit NULL ergänzt** und bleiben im Ergebnis.
|
||
|
||
| Typ | Beschreibung | SQL |
|
||
|---|---|---|
|
||
| **LEFT OUTER JOIN** | Alle Tupel der **linken** Relation bleiben, rechts ggf. NULL | `L LEFT OUTER JOIN R ON ...` |
|
||
| **RIGHT OUTER JOIN** | Alle Tupel der **rechten** Relation bleiben, links ggf. NULL | `L RIGHT OUTER JOIN R ON ...` |
|
||
| **FULL OUTER JOIN** | Alle Tupel **beider** Relationen bleiben, ggf. NULL | `L FULL OUTER JOIN R ON ...` |
|
||
|
||
**Beispiel LEFT OUTER JOIN:**
|
||
|
||
| L.A | L.B | L.C | R.D | R.E |
|
||
|---|---|---|---|---|
|
||
| a1 | b1 | c1 | d1 | e1 |
|
||
| a2 | b2 | c2 | **NULL** | **NULL** |
|
||
|
||
#### Semi-JOINs
|
||
|
||
Liefern Tupel **nur aus einer** der beiden Relationen.
|
||
|
||
| Operator | Symbol | Beschreibung | Formel |
|
||
|---|---|---|---|
|
||
| Semi-JOIN L mit R | L ⋉ R | Tupel aus L, die Partner in R haben | π_L(L ⋈ R) |
|
||
| Semi-JOIN R mit L | L ⋊ R | Tupel aus R, die Partner in L haben | π_R(L ⋈ R) |
|
||
| Anti-Semi-JOIN L | L ⊲ R | Tupel aus L **ohne** Partner in R | L — (L ⋉ R) |
|
||
| Anti-Semi-JOIN R | L ⊳ R | Tupel aus R **ohne** Partner in L | R — (L ⋊ R) |
|
||
|
||
```sql
|
||
-- Semi-JOIN
|
||
SELECT L.* FROM L INNER JOIN R ON L.x = R.x;
|
||
SELECT L.* FROM L INNER JOIN R USING (x);
|
||
```
|
||
|
||
#### SQL-Schlüsselwörter
|
||
|
||
| SQL-Schlüsselwort | Entsprechung |
|
||
|---|---|
|
||
| CROSS JOIN | Kartesisches Produkt |
|
||
| NATURAL JOIN | Natürlicher Verbund |
|
||
| INNER JOIN | Allgemeiner Verbund (Theta-JOIN) |
|
||
| LEFT OUTER JOIN | Linker äußerer Verbund |
|
||
| RIGHT OUTER JOIN | Rechter äußerer Verbund |
|
||
| FULL OUTER JOIN | Vollständiger äußerer Verbund |
|
||
|
||
### 4.7 Anfragebearbeitung
|
||
|
||
#### Ablauf einer SQL-Anweisung
|
||
|
||
1. **Parser** → Syntax prüfen
|
||
2. **Optimizer** → Optimalen Zugriffsplan erstellen
|
||
3. **Row Source Generator** → Ausführungsplan auf physische Ressourcen
|
||
4. **Execution Engine** → Ergebnisse erzeugen
|
||
|
||
#### Optimizer-Algorithmen
|
||
|
||
| Typ | Beschreibung |
|
||
|---|---|
|
||
| **RBO (Rule-Based)** | Intern festgelegte Regeln; veraltet |
|
||
| **CBO (Cost-Based)** | Interne Statistiken über Tabellen/Indizes; empfohlen |
|
||
|
||
**Wichtig:** Statistiken müssen regelmäßig aktualisiert werden (Befehl `ANALYZE`). Optimizer-Hints möglich: `/*+CHOOSE */`, `/*+ORDERED */`
|
||
|
||
#### Suchverfahren
|
||
|
||
| Methode | Voraussetzung | Geschwindigkeit |
|
||
|---|---|---|
|
||
| **Full Table Scan** | Keine geeigneten Indizes | Langsamste |
|
||
| **Index-Scan** | Geeigneter Index vorhanden | Schnellste (Rückgabe: RowID) |
|
||
| **Hash-Scan** | Keine Indizes; Hash-Werte werden generiert | Mittel |
|
||
|
||
#### Join-Verfahren
|
||
|
||
| Verfahren | Beschreibung |
|
||
|---|---|
|
||
| **Verschachtelte Schleifen** (Nested Loops) | Äußere Schleife + innere Schleife für jede Zeile |
|
||
| **Sort-Merge-Join** | Beide Tabellen sortieren, dann zusammenführen |
|
||
| **Hash-Join** | Hash-Tabelle für eine Tabelle, Suche mit Werten der anderen |
|
||
| **Kartesisches Produkt** | Bei fehlenden Verbindungsbedingungen |
|
||
| **Index-Join** | Indizes statt Tabellen verknüpfen (nur bei einspaltigen Indizes) |
|
||
|
||
### 4.8 Indizes
|
||
|
||
#### Überblick
|
||
|
||
| Index-Typ | Geeignet für | Beispiel |
|
||
|---|---|---|
|
||
| **Konventionell (Binärbaum)** | Spalten mit vielen unterschiedlichen Werten | PersID, Matrikelnummer |
|
||
| **Bitmap** | Spalten mit vielen gleichen Werten (geringe Kardinalität) | Geschlecht, Kategorie |
|
||
|
||
**Allgemeiner Aufbau:** `{ [ Suchfeld, RowID ] }`
|
||
|
||
#### Lineare Listen
|
||
|
||
**Einfach verkettete Liste:** Jedes Element hat Daten + Zeiger auf nächstes Element.
|
||
**Doppelt verkettete Liste:** Zusätzlicher Rückwärts-Zeiger.
|
||
|
||
**Operationen:**
|
||
- Anhängen am Ende (keine Sortierung): O(1)
|
||
- Sortiertes Einfügen: O(n)
|
||
- Löschen: Zeiger des Vorgängers auf Nachfolger setzen, Speicher freigeben
|
||
|
||
#### Binärbäume
|
||
|
||
**Terminologie:**
|
||
|
||
| Begriff | Bedeutung |
|
||
|---|---|
|
||
| **Wurzel (Root)** | Einziger Knoten ohne Vorgänger |
|
||
| **Blatt** | Knoten ohne Nachfolger |
|
||
| **Innerer Knoten** | Weder Wurzel noch Blatt |
|
||
| **Kante** | Gerichtete Verbindung (Vorgänger → Nachfolger) |
|
||
| **Ebene** | Knoten mit gleicher Pfadlänge zur Wurzel |
|
||
| **Tiefe** | Gesamtzahl der Ebenen |
|
||
| **Grad** | Maximale Anzahl direkter Nachfolger |
|
||
|
||
**Suchaufwand:** Logarithmisch O(log n) — aber kann zu O(n) degradieren wenn Baum entartet.
|
||
|
||
**AVL-Baum:** Höhe beider Teilbäume an jedem Knoten unterscheidet sich höchstens um 1.
|
||
|
||
**Balancierter Baum:** Höchstens letzte Ebene nicht vollständig besetzt. Jeder balancierte Baum ist ein AVL-Baum, aber nicht umgekehrt.
|
||
|
||
**Durchlauf-Reihenfolgen:**
|
||
|
||
| Reihenfolge | Kürzel | Verwendung |
|
||
|---|---|---|
|
||
| **Preorder** | WLR | Baum linear auf Datenträger speichern |
|
||
| **Inorder** | LWR | Sortierte Liste erstellen → balancierten Baum erzeugen |
|
||
| **Postorder** | LRW | Geräte programmieren (erst Parameter, dann Operation) |
|
||
|
||
**Balancierung:**
|
||
- **Offline:** Kopie → Inorder-Liste → Binär einfügen → Ausgeglichener Baum. Einfach, aber Zugriffe gesperrt.
|
||
- **Online:** Zur Laufzeit rekursiv ausgleichen. Kann kurzfristig zu Fehlern führen.
|
||
|
||
#### Hashing
|
||
|
||
**Funktionsprinzip:**
|
||
1. Für jeden Datensatz wird ein Schlüssel gebildet
|
||
2. Hash-Funktion ordnet dem Schlüssel einen kurzen Hash-Wert zu
|
||
3. Hash-Wert dient als Index in der Hash-Tabelle
|
||
4. Hash-Tabelle enthält Verweise auf Datensätze
|
||
|
||
**Kollision:** Zwei unterschiedliche Schlüssel erzeugen denselben Hash-Wert.
|
||
|
||
**Kollisionsbehandlung:**
|
||
- **Hashing mit Verkettung:** Verkettete Listen an Hash-Tabellen-Einträgen
|
||
- **Lineares Hashing:** Dynamische Tabellenerweiterung bei hohem Belegungsfaktor
|
||
- **Sondierung:** Linear/quadratisch/zufällig in der Tabelle selbst suchen
|
||
|
||
**Anforderungen an Hash-Funktionen:**
|
||
- Effizient berechenbar, geringer Speicherbedarf
|
||
- Wenig Kollisionen (Gleichverteilung der Hash-Werte)
|
||
- Einwegfunktion (Hash → Schlüssel nicht berechenbar)
|
||
- Surjektivität (kein Hash-Wert unmöglich)
|
||
- **Lawineneffekt:** 1 Bit Unterschied → mindestens halbe Bits der Hash-Werte unterschiedlich
|
||
|
||
**Hash-Funktions-Beispiele:**
|
||
1. **Modulo:** HW = Key % Basis (Primzahlen empfohlen)
|
||
2. **Abschneiden:** Key² berechnen, dann von links/rechts kürzen
|
||
3. **Zerlegung & Addition:** Key in gleich große Teile zerlegen und addieren
|
||
|
||
**Binärbäume vs. Hashing:**
|
||
- Bäume: Garantie im Worst Case, Sortierung möglich, dynamische Größe
|
||
- Hashing: Schneller im Durchschnitt O(1) vs. O(log n)
|
||
|
||
#### Bitmap-Indizes
|
||
|
||
**Geeignet für:**
|
||
- Geringe Kardinalität (0,1%–1% unterschiedliche Werte)
|
||
- Wenige Änderungen (Data Warehouse / OLAP)
|
||
|
||
**Aufbau:** Für jeden einzigartigen Wert eine Bit-Spalte. Pro Zeile steht 1 (Treffer) oder 0 (kein Treffer).
|
||
|
||
**Vorteile:**
|
||
- Stark komprimiert → schnell lesbar
|
||
- Mehrere Indizes kombinierbar
|
||
- Logische Operationen (AND, OR) sehr schnell im Prozessor
|
||
|
||
**Nachteile:**
|
||
- Immenser Wartungsaufwand bei Änderungen
|
||
- Bandbreite der Prozessor-Kanäle wichtig
|
||
- Können Deadlocks verursachen
|
||
|
||
---
|
||
|
||
## 5. Normalformen (e_NFs)
|
||
|
||
### 5.1 Einführung
|
||
|
||
**Normalisierung** = Aufteilung von Attributen in mehrere Relationen (Tabellen) mithilfe der Normalisierungsregeln, sodass eine Struktur entsteht, die **keine vermeidbaren Redundanzen** mehr enthält.
|
||
|
||
**Ziele:**
|
||
|
||
| Ziel | Beschreibung |
|
||
|---|---|
|
||
| **Redundanzbeseitigung** | Nur notwendige Redundanz bleibt erhalten |
|
||
| **Anomalienvermeidung** | Funktionelle und transitive Abhängigkeiten werden aufgelöst |
|
||
| **Klare Struktur** | Erstellung eines klar strukturierten Datenbankmodells |
|
||
|
||
**Praktische Bedeutung:**
|
||
- Praktisch wichtig sind nur die **ersten drei Normalformen** (1NF, 2NF, 3NF)
|
||
- Manchmal ist es sinnvoll, auf Normalformen aus **Performancegründen** zu verzichten
|
||
- Jede nächste Normalform **basiert auf der vorigen**
|
||
|
||
### 5.2 Funktionale Abhängigkeit
|
||
|
||
**Definition:** Y ist von X **funktional abhängig** (X → Y), wenn für alle Tupel t1 und t2 gilt:
|
||
```
|
||
Wenn t1 ∩ X = t2 ∩ X, dann gilt auch t1 ∩ Y = t2 ∩ Y
|
||
```
|
||
|
||
- Y hängt von X ab, wenn X die Werte von Y **eindeutig bestimmt**
|
||
- X bestimmt alle anderen Attribute → X ist ein **Superschlüssel**
|
||
- Ist X auch **minimal**, dann ist X ein **Kandidat für Primärschlüssel**
|
||
|
||
**Arten der Abhängigkeit:**
|
||
|
||
| Art | Notation | Beschreibung |
|
||
|---|---|---|
|
||
| **Funktionale Abhängigkeit** | X → Y | X bestimmt Y eindeutig |
|
||
| **Mehrwertige Abhängigkeit** (multivalued) | X →→ Y | X bestimmt eine Menge von Y-Werten |
|
||
|
||
### 5.3 Erste Normalform – 1NF
|
||
|
||
Eine Tabelle liegt in **1NF** vor, wenn ihre Zellen nur **atomare Werte** beinhalten, d. h. sie enthalten nicht mehr als einen Wert (keine Auflistungen).
|
||
|
||
**"Atomar"** bedeutet: Die Werte können nicht weiter in kleinere Komponenten zerlegt werden, die **einzeln einen Sinn** im Anwendungsbereich ergeben.
|
||
|
||
**Regeln:**
|
||
- Wiederholungsgruppen werden vermieden, indem jede Gruppe in eine **separate Tabelle** eingefügt und durch eine **1:N-Beziehung** verbunden wird
|
||
- Ob ein Attribut atomar ist, hängt **stark von der Mini-Welt** ab
|
||
- Laut E. F. Codd müssen Tabellen in 1NF **nicht unbedingt einen Primärschlüssel** haben
|
||
|
||
**Mini-Welt-Beispiele: Adresse:**
|
||
|
||
| Mini-Welt | Kontext | Atomar? |
|
||
|---|---|---|
|
||
| **Logistik-Firma (Müll-Abfuhr)** | PLZ, Straße, Hausnummer werden einzeln für Routenberechnung benötigt | PLZ, Straße, Hausnummer sind **jeweils atomar** |
|
||
| **Buchhaltung (Gehaltsabrechnung)** | Nur die gesamte Adresse wird für Briefversand benötigt | Gesamte Adresse ist **als Ganzes atomar** |
|
||
|
||
**Beispiel Bahnwagen:**
|
||
|
||
Ausgangstabelle (nicht in 1NF): Feld "Beschreibung" enthält `'Wagentyp, Leergewicht, Kapazität, Hersteller, Baujahr'` → **nicht atomar**
|
||
|
||
In 1NF gebracht:
|
||
```
|
||
W1 = { [ WagenID, Status, Ankunft, Station, WagenType,
|
||
Leergewicht, Kapazitaet, Hersteller, Baujahr ] }
|
||
```
|
||
|
||
**Beispiel Vertragsdaten:**
|
||
|
||
Ausgangstabelle (nicht in 1NF):
|
||
|
||
| Vertragsdatum | Kunde | Produkt |
|
||
|---|---|---|
|
||
| 01.02.2010 | Kohl | VW 30.000, BMW 40.000, Opel 40.000 |
|
||
| 03.01.2012 | Schröder | VW 32.000, Mercedes 35.000 |
|
||
|
||
In 1NF gebracht:
|
||
|
||
| Vertragsdatum | Kunde | Produkt | Preis |
|
||
|---|---|---|---|
|
||
| 01.02.2010 | Kohl | VW | 30.000 |
|
||
| 01.02.2010 | Kohl | BMW | 40.000 |
|
||
| 01.02.2010 | Kohl | Opel | 40.000 |
|
||
| 03.01.2012 | Schröder | VW | 32.000 |
|
||
| 03.01.2012 | Schröder | Mercedes | 35.000 |
|
||
|
||
### 5.4 Zweite Normalform – 2NF
|
||
|
||
Eine Tabelle liegt in **2NF** vor, wenn sie:
|
||
1. In **1NF** vorliegt
|
||
2. Jedes Feld, das **nicht** zum Primärschlüssel gehört, vom **ganzen** Primärschlüssel abhängt
|
||
|
||
**Regel:** Besteht der Primärschlüssel nur aus **einem Feld**, liegt die Tabelle **automatisch in 2NF** vor.
|
||
|
||
**Vorgang:** Felder, die nur vom **Teil des Primärschlüssels** abhängig sind, werden zusammen mit dem Teilschlüssel in **neue Tabellen ausgelagert**.
|
||
|
||
**Beispiel Bahnwagen:**
|
||
Die Felder [WagenType], [Leergewicht], [Kapazitaet], [Hersteller], [Baujahr] hängen nur von [WagenID] ab, aber **nicht** von [Ankunft] → nicht in 2NF.
|
||
|
||
Aufteilung in 2NF:
|
||
```
|
||
W11 = { [ WagenID, Ankunft, Status, Station ] } ← PK = [WagenID, Ankunft]
|
||
W12 = { [ WagenID, WagenType, Leergewicht, Kapazitaet,
|
||
Hersteller, Baujahr ] } ← PK = [WagenID]
|
||
```
|
||
|
||
**Beispiel Vertragsdaten:**
|
||
PK = [Vertragsdatum, Kunde, Produkt]
|
||
- [Herkunftsland] hängt nur von [Produkt] ab → verletzt 2NF
|
||
- [Lieferadresse] hängt nur von [Kunde] ab → verletzt 2NF
|
||
- [V-Art] hängt nur von [Produkt] ab → verletzt 2NF
|
||
|
||
**Beispiel Bestellungen:**
|
||
Bei ArtNr : LagerOrt = 1:1 gibt es **zwei Schlüsselkandidaten**: [RNr, ArtNr] und [RNr, LagerOrt]. Die 2NF ist in beiden Fällen verletzt.
|
||
|
||
**ERM-Bezug:** Wenn man vom **ERM ausgeht** und den konzeptuellen Entwurf korrekt in den logischen umwandelt, kommt man direkt zu Tabellen, die die 2NF nicht verletzen.
|
||
|
||
### 5.5 Dritte Normalform – 3NF
|
||
|
||
Eine Tabelle liegt in **3NF** vor, wenn sie:
|
||
1. In **2NF** vorliegt
|
||
2. Alle Felder, die **nicht** zum Primärschlüssel gehören, **voneinander unabhängig** sind
|
||
|
||
**Regel:** Wenn nur **ein Nichtschlüsselfeld** in der Tabelle vorhanden ist, liegt die Tabelle **automatisch in 3NF** vor.
|
||
|
||
**Wichtig:** In der Praxis ist die 3NF oft ausreichend für eine perfekte Balance aus **Redundanz, Performance und Flexibilität**.
|
||
|
||
**Vorgang:** Funktionale Abhängigkeiten unter Nicht-PK-Feldern werden durch **Aufteilung der Tabelle** aufgelöst.
|
||
|
||
**Beispiel Bahnwagen:**
|
||
Aus 2NF: `W12 = { [ WagenID, WagenType, Leergewicht, Kapazitaet, Hersteller, Baujahr ] }`
|
||
[Leergewicht], [Kapazitaet], [Hersteller] und ggf. [Baujahr] sind vom Feld [WagenType] abhängig → nicht in 3NF.
|
||
|
||
Variante a (Baujahr vom WagenType abhängig):
|
||
```
|
||
W121a = { [ WagenID, WagenType ] }
|
||
W122a = { [ WagenType, Leergewicht, Kapazitaet, Hersteller, Baujahr ] }
|
||
```
|
||
|
||
Variante b (Baujahr vom WagenType unabhängig):
|
||
```
|
||
W121b = { [ WagenID, WagenType, Baujahr ] }
|
||
W122b = { [ WagenType, Leergewicht, Kapazitaet, Hersteller ] }
|
||
```
|
||
|
||
### 5.6 Boyce-Codd-Normalform – BCNF
|
||
|
||
Eine Tabelle liegt in **BCNF** vor, wenn sie:
|
||
1. In **3NF** vorliegt
|
||
2. **Kein Teil** eines Schlüsselkandidaten funktional von keinem Teil eines **anderen** Schlüsselkandidaten abhängig ist
|
||
|
||
**Kern:** BCNF behandelt die **Abhängigkeiten zwischen Teilen mehrerer Schlüsselkandidaten**, falls diese sich teilweise **überlappen**.
|
||
|
||
**Regel:** Gibt es nur **einen Schlüsselkandidaten** oder liegt **keine Überlappung** vor, befindet sich die Tabelle **automatisch in BCNF**.
|
||
|
||
**Beispiel Sportvereine:**
|
||
|
||
| Name | Sportart | Verein |
|
||
|---|---|---|
|
||
| Schulz | Fußball | FC Berlin |
|
||
| Mayer | Fußball | FC Berlin |
|
||
| Zimmermann | Fußball | FC Marzahn |
|
||
| Mayer | Volleyball | VC Hamburg |
|
||
|
||
Beziehung: Sportart : Verein = 1 : N. Schlüsselkandidaten: [Name, Sportart] und [Name, Verein] → **Überlappung** (Name). [Sportart] hängt vom Nicht-Schlüssel-Feld [Verein] ab → verletzt BCNF.
|
||
|
||
Lösung:
|
||
```
|
||
Tabelle 1 = { [ Name, Verein ] }
|
||
Tabelle 2 = { [ Sportart, Verein ] }
|
||
```
|
||
|
||
### 5.7 Vierte Normalform – 4NF
|
||
|
||
Eine Tabelle liegt in **4NF** vor, wenn sie:
|
||
1. In **BCNF** vorliegt
|
||
2. Nur **semantisch verbundene** Nichtschlüsselattribute sich in der Tabelle befinden
|
||
|
||
Die 4NF trennt **semantisch (thematisch, inhaltlich) unabhängige** Entitäten durch Aufteilung.
|
||
|
||
**Beispiel Bahnwagen:**
|
||
[Leergewicht] und [Kapazitaet] werden **viel öfter** verwendet als [Hersteller] und [Baujahr] (historische Bedeutung) → **unterschiedliche Semantik**.
|
||
|
||
```
|
||
W122a1 = { [ WagenType, Leergewicht, Kapazitaet ] } ← technische Daten
|
||
W122a2 = { [ WagenType, Hersteller, Baujahr ] } ← historische Daten
|
||
```
|
||
|
||
### 5.8 Fünfte Normalform – 5NF
|
||
|
||
Eine Tabelle liegt in **5NF** vor, wenn sie:
|
||
1. In **4NF** vorliegt
|
||
2. Nicht mehr in Tabellen eines **geringeren Grades** zerlegt werden kann
|
||
|
||
**Kern:** Die neuen Tabellen können jederzeit den ursprünglichen Zustand **ohne Informationsverlust** wieder herstellen (durch JOIN).
|
||
|
||
**Nachteil:** Man braucht in der Praxis ständig die ganzen Informationen und muss daher ständig die vereinfachten Tabellen wieder **vereinigen** (JOIN).
|
||
|
||
**Beispiel Touristik-Firma:**
|
||
```
|
||
T10 = { [ PersID, TourNr, Trans-Unternehmen ] } ← PK = alle drei Attribute
|
||
```
|
||
Zerlegbar in:
|
||
```
|
||
T11 = { [ PersID, TourNr ] }
|
||
T12 = { [ PersID, Trans-Unternehmen ] }
|
||
T13 = { [ TourNr, Trans-Unternehmen ] }
|
||
```
|
||
|
||
**Beispiel Hersteller-Produkt-Person:**
|
||
```
|
||
TA = { [ HerstID, ProduktID ] }
|
||
TB = { [ PersID, ProduktID ] }
|
||
TC = { [ HerstID, PersID ] }
|
||
```
|
||
|
||
### 5.9 Anomalien ohne Normalisierung
|
||
|
||
**Beispiel:** Tabelle mit Mitarbeitern, Abteilungen und Projekten (nicht normalisiert):
|
||
|
||
| PersID | Name | AbtNr | Abteilung | ProjNr | ProjBeschreibung |
|
||
|---|---|---|---|---|---|
|
||
| 1 | Anna | 42 | Second Level | BE | Bergland ... |
|
||
| 1 | Anna | 42 | Second Level | NO | Nordsee ... |
|
||
| 2 | Arnold | 42 | Second Level | NO | Nordsee ... |
|
||
| 2 | Arnold | 42 | Second Level | OG | Ostgipfel ... |
|
||
| 3 | Betty | 53 | First Dept | OG | Ostgipfel ... |
|
||
| 3 | Betty | 53 | First Dept | WO | West-Ozean ... |
|
||
| 4 | Chris | 53 | First Dept | WO | West-Ozean ... |
|
||
|
||
| Anomalie | Problem |
|
||
|---|---|
|
||
| **Einfüge-Anomalie** | Neuer Mitarbeiter mit mehreren Projekten → mehrere Zeilen, Vertippen möglich |
|
||
| **Änderungs-Anomalie** | Projektumbenennung → mehrere Zeilen ändern, Übersehen möglich |
|
||
| **Lösch-Anomalie** | Mitarbeiter löschen → mehrere Zeilen entfernen, Übersehen möglich |
|
||
|
||
**Normalisierung → 3NF:**
|
||
```
|
||
Mitarbeiter = { [ PersID, Name, AbtNr ] }
|
||
Abteilung = { [ AbtNr, Abteilung ] }
|
||
arbeitet_an = { [ PersID, ProjNr ] }
|
||
Projekt = { [ ProjNr, ProjBeschreibung ] }
|
||
```
|
||
|
||
### 5.10 ERM als Alternative zur Normalisierung
|
||
|
||
**Wichtige Erkenntnis:** Wenn man vom **ERM ausgeht** und den konzeptuellen Entwurf korrekt in den logischen umwandelt (inkl. Vereinfachung), bekommt man **ziemlich wahrscheinlich** Tabellen in 3NF. ERM und Normalisierung sind **komplementäre Ansätze** zum gleichen Ziel.
|
||
|
||
### Übersicht Normalformen
|
||
|
||
| NF | Voraussetzung | Regel | Automatisch erfüllt wenn... |
|
||
|---|---|---|---|
|
||
| **1NF** | — | Nur atomare Werte in Zellen | Keine Auflistungen vorhanden |
|
||
| **2NF** | 1NF | Jedes Nicht-PK-Feld hängt vom **ganzen** PK ab | PK besteht aus nur einem Feld |
|
||
| **3NF** | 2NF | Nicht-PK-Felder sind **voneinander unabhängig** | Nur ein Nicht-PK-Feld vorhanden |
|
||
| **BCNF** | 3NF | Keine Abhängigkeiten zwischen Teilen verschiedener Schlüsselkandidaten | Nur ein Schlüsselkandidat oder keine Überlappung |
|
||
| **4NF** | BCNF | Nur semantisch verbundene Nicht-PK-Attribute zusammen | Alle Attribute thematisch zusammengehörig |
|
||
| **5NF** | 4NF | Nicht weiter in Tabellen geringeren Grades zerlegbar | Zerlegung würde Informationsverlust verursachen |
|
||
|
||
### Durchgängiges Beispiel: Bahnwagen
|
||
|
||
```
|
||
Ausgangstabelle: { [ WagenID, Beschreibung, Status, Ankunft, Station ] }
|
||
→ 1NF: W1 = { [ WagenID, Status, Ankunft, Station, WagenType, Leergewicht, Kapazitaet, Hersteller, Baujahr ] }
|
||
→ 2NF: W11 = { [ WagenID, Ankunft, Status, Station ] }
|
||
W12 = { [ WagenID, WagenType, Leergewicht, Kapazitaet, Hersteller, Baujahr ] }
|
||
→ 3NF: W11 = { [ WagenID, Ankunft, Status, Station ] }
|
||
W121 = { [ WagenID, WagenType ] }
|
||
W122 = { [ WagenType, Leergewicht, Kapazitaet, Hersteller, Baujahr ] }
|
||
→ 4NF: W122a1 = { [ WagenType, Leergewicht, Kapazitaet ] }
|
||
W122a2 = { [ WagenType, Hersteller, Baujahr ] }
|
||
```
|
||
|
||
---
|
||
|
||
## 6. Transaktionen (f_Transaktionen)
|
||
|
||
### 6.1 Definition
|
||
|
||
**Integrität (Konsistenz)** der Datenbank = Zustand der Daten, in dem sie **korrekt, vollständig und widerspruchsfrei** sind.
|
||
|
||
**Transaktion** = Mehrere Operationen, die:
|
||
- Entweder **alle erfolgreich** durchgeführt werden
|
||
- Oder, falls ein Fehler vorliegt, die schon durchgeführten **rückgängig gemacht** werden müssen
|
||
|
||
**Eigenschaften:**
|
||
- Transaktionen gewährleisten einen **konsistenten Zustand** der Datenbank
|
||
- Sie versetzen den Datenbestand von einem konsistenten Zustand in einen **anderen konsistenten Zustand**
|
||
- Eine Transaktion wird als **atomare (ununterbrechbare) Operation** betrachtet
|
||
- Bei Fehlern werden Komponenten nicht rückgängig gemacht (zeitintensiv), sondern der **zuvor gespeicherte Zustand** wird wiederhergestellt
|
||
|
||
### 6.2 Beispiel
|
||
|
||
Zwei ganze Zahlen A und B:
|
||
```
|
||
T1 = { A=A+100; B=B+100; }
|
||
T2 = { A=A*2; B=B*2; }
|
||
```
|
||
|
||
- **Sequenzielle Ausführung** → Konsistenz gewährleistet
|
||
- **Gemischte Operationen** → Konsistenz **nicht** mehr gewährleistet
|
||
|
||
### 6.3 Anforderungen
|
||
|
||
| Anforderung | Beschreibung |
|
||
|---|---|
|
||
| Gleichzeitige Verarbeitung | Mehrere Transaktionen müssen **quasi-parallel** verarbeitet werden |
|
||
| Fehlerbehandlung | Abgeschlossene Transaktionen bleiben bestehen, offene werden rückgängig gemacht |
|
||
| Organisation | Manuell (im Source-Code) oder automatisch |
|
||
| Zwischenpunkte | Daten erfolgreich durchgeführter Operationen können gespeichert werden |
|
||
| Abschlussarten | Nur **COMMIT** (erfolgreich) oder **ROLLBACK** (erfolglos) |
|
||
|
||
**Gründe für ROLLBACK:** Systemfehler, Integritätsverletzungen, Deadlock, Benutzeranweisung.
|
||
|
||
### 6.4 ACID-Eigenschaften
|
||
|
||
| Eigenschaft | Beschreibung |
|
||
|---|---|
|
||
| **A**tomicity (Atomarität) | Entweder **alle** Befehle oder **gar keine** werden ausgeführt |
|
||
| **C**onsistency (Konsistenz) | Transaktion hinterlässt nach Beendigung einen **konsistenten Datenzustand**, ansonsten komplettes Zurücksetzen |
|
||
| **I**solation | Nebenläufige Transaktionen beeinflussen sich **nicht gegenseitig**; jede wird logisch so ausgeführt, als wäre sie die einzig aktive |
|
||
| **D**urability (Dauerhaftigkeit) | Wirkung einer erfolgreich abgeschlossenen Transaktion bleibt **dauerhaft** erhalten, auch nach Systemfehler |
|
||
|
||
### 6.5 Zustände einer Transaktion
|
||
|
||
```
|
||
BoT → Active → Committing → Änderungen festgeschrieben → EoT
|
||
↓ ↓
|
||
Waiting for ERROR
|
||
resources ↓
|
||
↓ Rolling back → Änderungen rückgängig gemacht → EoT
|
||
DEADLOCK
|
||
↓
|
||
ROLLBACK → Rolling back
|
||
```
|
||
|
||
| Zustand | Beschreibung |
|
||
|---|---|
|
||
| **BoT** | Begin of Transaction |
|
||
| **Active** | Transaktion führt Operationen aus |
|
||
| **Waiting for resources** | Wartet auf gesperrte Ressourcen |
|
||
| **DEADLOCK** | Gegenseitige Blockierung erkannt |
|
||
| **Committing** | Änderungen werden festgeschrieben (COMMIT) |
|
||
| **Rolling back** | Änderungen werden rückgängig gemacht (ROLLBACK) |
|
||
| **EoT** | End of Transaction |
|
||
|
||
### 6.6 Synchronisation
|
||
|
||
**Synchronisation (Mehrbenutzersynchronisation)** = Koordinierung von mehreren Benutzerprozessen, eng verbunden mit der Ausführung der Transaktionen.
|
||
|
||
| Art | Beschreibung | Eigenschaft |
|
||
|---|---|---|
|
||
| **Seriell** | Transaktionen nacheinander | Absolut sicher, aber **langsam**; blockiert nachfolgende Transaktionen |
|
||
| **Parallel** | Transaktionen gleichzeitig | Nutzt Ressourcen **besser** aus |
|
||
| **Serialisierung** | Anordnung paralleler Operationen | Entspricht in der Wirkung der seriellen Ausführung, garantiert Konsistenz |
|
||
|
||
### 6.7 Probleme bei paralleler Ausführung
|
||
|
||
Bei Zugriff auf **denselben Datenbestand** können folgende Probleme entstehen:
|
||
|
||
#### Lost Update
|
||
|
||
Die von einer Transaktion geänderten Daten werden von einer anderen Transaktion überschrieben.
|
||
|
||
**Variante 1 – Direkt:**
|
||
```
|
||
T1: update TabX set V=42; T2: ...
|
||
T1: ... T2: update TabX set V=53;
|
||
T1: ... T2: commit;
|
||
T1: commit; T2: ...
|
||
```
|
||
→ Update von T2 geht verloren. Kommt in Datenbanken **nicht vor**, da T2 auf Freigabe wartet.
|
||
|
||
**Variante 2 – Über lokale Variable:**
|
||
```
|
||
T1: select V from TabX into W; T2: ...
|
||
T1: W := W+1; T2: update TabX set V=53;
|
||
T1: update TabX set V=W; T2: commit;
|
||
T1: commit; T2: ...
|
||
```
|
||
→ Update von T2 geht verloren. Kann durch **höhere Isolationsstufe** vermieden werden.
|
||
|
||
**Lösung:** `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;`
|
||
- Die Transaktion merkt sich die Daten, die zum **Start der Transaktion** festgeschrieben waren
|
||
- Ändert eine andere Transaktion diese Daten, bricht die erste ab
|
||
- Fehler: `ORA-08177: can't serialize access for this transaction`
|
||
|
||
#### Dirty Read
|
||
|
||
Eine Transaktion liest Daten, die eine andere Transaktion geändert, aber **noch nicht festgeschrieben** hat.
|
||
|
||
```
|
||
T1: ... T2: update TabX set V=42;
|
||
T1: select V from TabX; T2: ... ← T1 liest V=42
|
||
T1: ... T2: rollback; ← V=42 war ungültig!
|
||
```
|
||
|
||
**Lösung:** Standard-Isolationsstufe in Oracle ist **READ COMMITTED** → verhindert Dirty Read automatisch. Dirty Read ist nur möglich mit `READ UNCOMMITTED` (in Oracle nicht verfügbar).
|
||
|
||
#### Non-Repeatable Read
|
||
|
||
Eine Transaktion liest **zweimal dieselben Daten** und bekommt **unterschiedliche Ergebnisse**.
|
||
|
||
```
|
||
T1: select V from TabX; T2: ...
|
||
T1: ... T2: update TabX set V=42;
|
||
T1: ... T2: commit;
|
||
T1: select V from TabX; T2: ... ← anderer Wert!
|
||
```
|
||
|
||
**Lösung:** Isolationsstufe **SERIALIZABLE** (Standard READ COMMITTED lässt dies zu).
|
||
|
||
#### Phantom Read
|
||
|
||
Ähnlich Non-Repeatable Read, aber mit **Anzahl der Zeilen** statt Werten.
|
||
|
||
```
|
||
T1: select count(*) from TabX; T2: ...
|
||
T1: ... T2: insert into TabX ...;
|
||
T1: ... T2: commit;
|
||
T1: select count(*) from TabX; T2: ... ← anderer Count!
|
||
```
|
||
|
||
**Lösung:** Isolationsstufe **SERIALIZABLE**.
|
||
|
||
### 6.8 Trade-off der Isolationsstufen
|
||
|
||
| Niedrigere Stufe | Höhere Stufe |
|
||
|---|---|
|
||
| Erlaubt gleichzeitigen Zugriff | Vermindert Probleme |
|
||
| Mehr mögliche Nebenwirkungen | Mehr Systemressourcen |
|
||
| Höhere Performance | Höhere Blockierungswahrscheinlichkeit |
|
||
|
||
### 6.9 Isolationsstufen nach ANSI/ISO SQL92
|
||
|
||
| Isolationsstufe | Verhindert | Besonderheit |
|
||
|---|---|---|
|
||
| **READ UNCOMMITTED** | — | Dirty Read erlaubt; **fehlt in Oracle** |
|
||
| **READ COMMITTED** | Dirty Read | Standard in Oracle; Lesesperren werden kurz gesetzt und aufgehoben |
|
||
| **REPEATABLE READ** | Dirty Read, Non-Repeatable Read | Sperren für gesamte Transaktion; **fehlt in Oracle** |
|
||
| **SERIALIZABLE** | Dirty Read, Non-Repeatable Read, Phantom Read, Lost Update | Höchste Stufe; keine weiteren schreibenden Transaktionen auf dieselben Daten |
|
||
|
||
**Hinweis:**
|
||
- Die Isolationsstufe betrifft den **Schreibvorgang nicht** – eine Transaktion bekommt immer eine **exklusive Sperre** für alle zu ändernden Daten
|
||
- Die Isolationsstufe wirkt auf die **Lesevorgänge** – definiert, wie Lesevorgänge von anderen Transaktionen abhängig sind
|
||
- Der SQL-Standard schreibt diese Stufen vor, aber konkrete Datenbanken unterstützen sie **unterschiedlich**
|
||
|
||
### 6.10 Synchronisationsstrategien
|
||
|
||
Der **Scheduler** steuert die Ausführungsreihenfolge von Operationen verschiedener Transaktionen.
|
||
|
||
| Strategie | Beschreibung |
|
||
|---|---|
|
||
| **Pessimistisch** | Scheduler **verzögert** Operationen, legt optimale Reihenfolge fest |
|
||
| **Optimistisch** | Scheduler schickt Operationen **sofort** zur Ausführung |
|
||
|
||
### 6.11 Synchronisationsverfahren
|
||
|
||
#### Sperrbasierte Synchronisation
|
||
|
||
Wird **oft eingesetzt**.
|
||
|
||
| Regel | Beschreibung |
|
||
|---|---|
|
||
| Jedes Datenobjekt hat eine Sperre | Tabelle, Datensatz, Attribut, Index, View |
|
||
| Sperren vor Benutzung | Jedes Objekt muss vor Zugriff gesperrt werden |
|
||
| Warten bei Sperre | Ist Objekt schon gesperrt, muss die Transaktion warten |
|
||
| Exklusivität | Nur **eine** Transaktion kann die Sperre halten |
|
||
| **Lesesperre** (shared lock) | Andere Transaktionen dürfen die Daten **lesen** |
|
||
| **Schreibsperre** (exclusive lock) | Andere Transaktionen dürfen Daten **weder lesen noch ändern** |
|
||
| Sperren aufheben | Am Ende der Transaktion werden **alle Sperren** aufgehoben |
|
||
|
||
**Löst:** Alle Probleme **außer Phantom Read**.
|
||
|
||
#### 2-Phasen-Sperrprotokoll – 2PL
|
||
|
||
| Phase | Beschreibung | Sicherste Variante |
|
||
|---|---|---|
|
||
| **Wachstumsphase** | Viele Sperren werden **angefordert**, wenige freigegeben | Sperren werden nur **gesetzt**, nicht aufgehoben |
|
||
| **Minderungsphase** (Schrumpfphase) | Viele Sperren werden **freigegeben**, wenige angefordert | Sperren werden nur **aufgehoben**, nicht gesetzt |
|
||
|
||
#### Zeitstempelbasierte Synchronisation
|
||
|
||
Wird **selten eingesetzt**.
|
||
|
||
| Regel | Beschreibung |
|
||
|---|---|
|
||
| Eindeutiger Zeitstempel | Jede Transaktion bekommt einen eindeutigen Zeitstempel |
|
||
| Ordnung | Scheduler ordnet konkurrierende Operationen nach Zeitstempel |
|
||
| Objektstempel | Zu jedem Datenobjekt wird der Zeitstempel der letzten Operation gespeichert |
|
||
| Abweisung | Operation mit **früherem** Zeitstempel als der des Objektes wird **abgewiesen** |
|
||
| Reihenfolge | Transaktionen müssen laut Zeitstempelreihenfolge beendet werden |
|
||
|
||
**Löst:** Alle Probleme **außer Phantom Read**.
|
||
|
||
---
|
||
|
||
## 7. Speicherstrukturen (g_Speicherstrukturen)
|
||
|
||
### 7.1 Überblick
|
||
|
||
Oracle verwaltet eigene Speicherstrukturen auf dem **Datenträger** und im **Arbeitsspeicher** zwecks effizienter und konsistenter Datenbearbeitung.
|
||
|
||
| Ort | Strukturen |
|
||
|---|---|
|
||
| **Datenträger** | Tablespaces, Datenbankdateien, Segmente, Redo-Log-Dateien |
|
||
| **Arbeitsspeicher** | System Global Area (SGA), Program Global Area (PGA), User Global Area (UGA) |
|
||
|
||
### 7.2 Datenträger
|
||
|
||
#### Tablespace
|
||
|
||
Ein Tablespace enthält theoretisch mehrere **Tabellen** und **Indizes**, verteilt auf mehrere **Datenbankdateien**.
|
||
|
||
```
|
||
Tablespace
|
||
├── Tabelle A, Tabelle B, Tabelle C
|
||
├── Index D, Index E
|
||
├── Datenbankdatei 1
|
||
└── Datenbankdatei 2
|
||
```
|
||
|
||
#### Hierarchie der Strukturen
|
||
|
||
Ein separates Tablespace ist für **jede Anwendung** gedacht (alle User, Tabellen, Indizes, Prozeduren).
|
||
|
||
| Ebene | Beschreibung |
|
||
|---|---|
|
||
| **Datenbank** | Besteht aus mehreren **Tablespaces** |
|
||
| **Tablespace** | Besteht aus mehreren **Datenbankdateien** |
|
||
| **Datenbankdatei** | Besteht aus mehreren **Segmenten** (Extenten), zugeordnet zu Tabellen oder Indizes |
|
||
| **Segment** | Besteht aus mehreren **Blöcken** |
|
||
| **Block** | Kleinste Einheit, die gelesen/geschrieben werden kann |
|
||
|
||
Ist eine Tabelle voll, kann sie durch ein **Segment (Extent)** erweitert werden.
|
||
|
||
#### Logische vs. Physische Objekte
|
||
|
||
| Typ | Beispiele |
|
||
|---|---|
|
||
| **Logische Objekte** | Tabellen, Indizes, User, Prozeduren |
|
||
| **Physische Objekte** | Tablespace, Datenbankdatei, Segment (Extent), Block |
|
||
|
||
#### CREATE TABLE mit Storage-Klausel
|
||
|
||
```sql
|
||
CREATE TABLE T (
|
||
A INTEGER, B VARCHAR2(20)
|
||
)
|
||
TABLESPACE myTabSpc STORAGE (
|
||
INITIAL 1M -- Anfangssegment
|
||
NEXT 500K -- Extente (weitere Segmente)
|
||
MINEXTENTS 1 -- minimale Anzahl der Segmente
|
||
MAXEXTENTS 100 -- maximale Anzahl der Segmente
|
||
PCTINCREASE 10 -- Größe der Segmente wächst um 10%
|
||
);
|
||
```
|
||
|
||
#### Tablespace-Verwaltung
|
||
|
||
```sql
|
||
-- Tablespace anzeigen
|
||
SELECT * FROM user_tablespaces;
|
||
SELECT * FROM dba_tablespaces;
|
||
|
||
-- Tablespace erstellen
|
||
CREATE TABLESPACE orion
|
||
DATAFILE 'c:\oracle\oradata\ora\orion.dbf'
|
||
SIZE 10M
|
||
AUTOEXTEND ON NEXT 200K MAXSIZE 200M;
|
||
|
||
-- Datenbankdatei hinzufügen
|
||
ALTER TABLESPACE orion
|
||
ADD DATAFILE 'c:\oracle\oradata\ora\orion2.dbf'
|
||
SIZE 10M AUTOEXTEND ON NEXT 100K MAXSIZE 800M;
|
||
|
||
-- Tablespace offline/online schalten
|
||
ALTER TABLESPACE orion OFFLINE IMMEDIATE;
|
||
ALTER TABLESPACE orion ONLINE;
|
||
|
||
-- Einzelne Datenbankdateien offline/online
|
||
ALTER DATABASE DATAFILE '...\orion3.dbf' OFFLINE DROP;
|
||
ALTER DATABASE DATAFILE '...\orion4.dbf' ONLINE;
|
||
```
|
||
|
||
#### Rollback-Segmente und Redo-Log-Dateien
|
||
|
||
| Struktur | Funktion |
|
||
|---|---|
|
||
| **Rollback-Segmente** | Speichern Daten **vor** Änderungen; Anfragen lesen aus Rollback-Segmenten, solange Änderungen noch nicht COMMIT sind; in Oracle automatisch via **Undo-Management** im UNDO-Tablespace verwaltet |
|
||
| **Redo-Log-Dateien** | Enthalten **schon durchgeführte** Änderungen; ermöglichen Nachvollziehen der gesamten Datenänderungsgeschichte; werden **zyklisch beschrieben** und automatisch archiviert |
|
||
|
||
### 7.3 Arbeitsspeicher
|
||
|
||
#### System Global Area – SGA
|
||
|
||
| Komponente | Beschreibung |
|
||
|---|---|
|
||
| **Database-Buffer-Cache** | Enthält Datenblöcke (z. B. Zeilen einer Tabelle), die angezeigt/geändert werden müssen; lädt mehrere Zeilen (auch benachbarte) für hohe Zugriffsgeschwindigkeit; wird von speziellen Algorithmen verwaltet (Verdrängung nicht benötigter Daten) |
|
||
| **Dirty List** | Liste mit Blockadressen aus dem Database-Buffer-Cache, deren Daten **geändert** wurden; geänderte Blöcke werden nach COMMIT anhand der Dirty List in die Datenbank geschrieben |
|
||
| **Redo-Log-Buffer** | Protokolliert Daten vom Database-Buffer-Cache für den Fall eines **unerwarteten Systemabsturzes** |
|
||
| **Shared Pool** | Verarbeitet SQL-Anweisungen: Benutzerrechte prüfen, Existenz von Tabellen/Spalten prüfen, Syntax prüfen, Optimierung; nutzt Metadaten aus dem **Data Dictionary** (Tablespace SYSTEM) |
|
||
| **Large Pool** | Speicherplatz für System-Komponenten wie z. B. **Recovery-Manager** |
|
||
| **Java Pool** | Virtuelle Umgebung für **Java-Anwendungen** |
|
||
|
||
#### Program Global Area – PGA
|
||
|
||
Beinhaltet Informationen, die für die **Steuerung der gesamten Oracle-Prozesse** notwendig sind.
|
||
|
||
#### User Global Area – UGA
|
||
|
||
Beinhaltet Informationen, die einem **aktuell verbundenen Benutzer** zugeordnet sind (Sitzung).
|
||
|
||
---
|
||
|
||
## 8. Sicherungskonzepte (h_Sicherungskonzepte)
|
||
|
||
### 8.1 Datensicherheit
|
||
|
||
**Datensicherheit** = Alle technischen und organisatorischen Maßnahmen zum Schutz der Daten vor **Verfälschung, Zerstörung und unzulässiger Weitergabe**.
|
||
|
||
- Informationssicherheit ist nicht nur Technik, sondern auch abhängig von **organisatorischen und personellen** Rahmenbedingungen
|
||
- Das **BSI** (Bundesamt für Sicherheit in der Informationstechnik) veröffentlicht das IT-Grundschutzhandbuch
|
||
|
||
### 8.2 Schadenskategorien
|
||
|
||
| Kategorie | Beschreibung | Beispiel |
|
||
|---|---|---|
|
||
| **Verlust der Verfügbarkeit** | Grundlegende Informationen nicht vorhanden | Keine Geldtransaktionen, Online-Bestellungen oder Produktionsprozesse möglich |
|
||
| **Verlust der Vertraulichkeit** | Ungewollte Offenlegung von Informationen | Personenbezogene Daten, Umsatz, Marketing, Forschungsdaten gelangen an Konkurrenz |
|
||
| **Verlust der Integrität** | Gefälschte Daten | Fehlbuchungen, falsche Lieferungen, fehlerhafte Produkte |
|
||
| **Verlust der Authentizität** | Daten falscher Person zugeordnet | Zahlungsanweisungen zu Lasten Dritter, falsche digitale Willenserklärungen |
|
||
|
||
### 8.3 Relevante Gesetze
|
||
|
||
| Gesetz | Kürzel | Jahr |
|
||
|---|---|---|
|
||
| Bundesdatenschutzgesetz | BDSG | 1990/2003/2009 |
|
||
| Telekommunikationsgesetz | TKG | 2004 |
|
||
| Telemediengesetz | TMG | 2007 |
|
||
| Signaturgesetz | SigG | 2001 |
|
||
| Diverse Landesdatenschutzgesetze | — | — |
|
||
|
||
### 8.4 Grundprinzipien der Sicherheit
|
||
|
||
| Prinzip | Beschreibung |
|
||
|---|---|
|
||
| **Authentifizierung** | Subjekte (Benutzer, Rechner, Dienste) müssen ein Konto besitzen und sich mit gültigem Anmeldenamen + Kennwort anmelden; moderne DB erlauben auch Betriebssystem-Authentifizierung und Zertifikate |
|
||
| **Autorisierung** | System muss Zugriffsrechte implementieren: Leserechte (ohne Änderung), Änderungsrechte (inkl. Lesen), volle Rechte (inkl. Weitergabe); Verweigerung/Entziehung möglich |
|
||
| **Protokollierung** | Alle wichtigen Vorgänge müssen überwacht werden: Lesen/Ändern/Löschen, Anmeldung, DB-Start/Stop, Kontenverwaltung; Mindestangaben: **wer**, **was**, **wann**; in Oracle: **Auditing** |
|
||
|
||
**Beispiel Verletzung:** Web-Server ordnet alle Anfragen einem pauschalen Konto zu → Verletzung der Authentifizierung → potenzieller Angreifer kann unsinnige Anfragen senden.
|
||
|
||
### 8.5 Integrität
|
||
|
||
**Integrität (Konsistenz)** = Zustand der Daten, in dem sie korrekt, vollständig und widerspruchsfrei sind.
|
||
|
||
| Art | Beschreibung |
|
||
|---|---|
|
||
| **Semantische Integrität** | Werte gehören zum Wertebereich, richtige Datentypen, keine Tippfehler |
|
||
| **Referentielle Integrität** | Korrektheit der Primär- und Fremdschlüssel, Existenz der Verweise |
|
||
| **Logische Integrität** | Transaktionen, zusammengehörende Operationen |
|
||
|
||
#### Gewährleistung der Integrität
|
||
|
||
| Ebene | Beschreibung |
|
||
|---|---|
|
||
| **Datenbank** (bessere Lösung) | Klauseln in DDL-Anweisungen |
|
||
| **Anwendung** (zusätzliche Lösung) | Programmcode der Anwendung |
|
||
|
||
**Vorteile der DB-Ebene:**
|
||
- DB selbst gewährleistet Konsistenz → inkonsistente Zustände unmöglich
|
||
- Ein-/Ausschaltbar (z. B. beim Import)
|
||
- Standardisierte Möglichkeiten
|
||
- Unabhängig von einzelnen Anwendungen
|
||
- Schnellere Anwendungsentwicklung
|
||
|
||
#### Integritätsverletzende Operationen
|
||
|
||
- **DML:** INSERT, UPDATE, DELETE
|
||
- **DDL:** ALTER, DROP, RENAME
|
||
|
||
#### Aktionen bei Integritätsverletzung
|
||
|
||
| Aktion | Beschreibung |
|
||
|---|---|
|
||
| **Rollback** | Abbrechen der Operation und Zurücksetzen auf Zustand davor |
|
||
| **Cascade** | Propagieren der Operation auf alle beteiligten Tabellen |
|
||
| **Set Null** | Betroffene Attribute auf NULL setzen |
|
||
|
||
#### Referentielle Integrität
|
||
|
||
Die Werte eines **Fremdschlüssels** müssen auch als Werte des **Primärschlüssels** vorhanden sein.
|
||
|
||
#### Constraint-Typen
|
||
|
||
| Constraint | Beschreibung |
|
||
|---|---|
|
||
| **PRIMARY KEY** | Attribut(e) bilden primären Schlüssel; automatisch wird Index angelegt (Oracle) |
|
||
| **FOREIGN KEY** | Attribut(e) bilden PK in einer anderen Tabelle |
|
||
| **ON DELETE CASCADE** | Löschen in PK-Tabelle löscht auch FK-Datensätze |
|
||
| **NOT NULL** | Attribut muss einen Wert haben |
|
||
| **UNIQUE** | Werte sind einmalig |
|
||
| **CHECK** | Logischer Ausdruck muss wahr sein |
|
||
|
||
#### Beispiele
|
||
|
||
```sql
|
||
CREATE TABLE Studenten (
|
||
MatrNr INTEGER PRIMARY KEY,
|
||
Name VARCHAR(30) NOT NULL,
|
||
Semester INTEGER CHECK Semester BETWEEN 1 AND 13
|
||
);
|
||
|
||
CREATE TABLE Professoren (
|
||
PersNr INTEGER PRIMARY KEY,
|
||
Name VARCHAR(30) NOT NULL,
|
||
Rang CHAR(2) CHECK (Rang IN ('C2', 'C3', 'C4')),
|
||
Raum INTEGER UNIQUE
|
||
);
|
||
|
||
CREATE TABLE voraussetzen (
|
||
Vorgaenger INTEGER REFERENCES Vorlesungen(VorlNr) ON DELETE CASCADE,
|
||
Nachfolger INTEGER REFERENCES Vorlesungen(VorlNr) ON DELETE NO ACTION,
|
||
PRIMARY KEY (Vorgaenger, Nachfolger)
|
||
);
|
||
|
||
CREATE TABLE pruefen (
|
||
MatrNr INTEGER REFERENCES Studenten ON DELETE CASCADE,
|
||
VorlNr INTEGER REFERENCES Vorlesungen,
|
||
PersNr INTEGER REFERENCES Professoren,
|
||
Note NUMERIC(2,1) CHECK (Note BETWEEN 0.7 AND 5.0),
|
||
PRIMARY KEY (MatrNr, VorlNr)
|
||
);
|
||
```
|
||
|
||
#### Trigger
|
||
|
||
**Trigger** = Prozedur/Funktion, die bei bestimmten Ereignissen **automatisch** gestartet wird.
|
||
|
||
**Auslöser:**
|
||
- DML: INSERT, DELETE, UPDATE
|
||
- DDL: CREATE, ALTER, DROP
|
||
- An-/Abmeldung, Start/Stop der DB
|
||
|
||
**Zeitpunkt:**
|
||
|
||
| Zeitpunkt | Beschreibung |
|
||
|---|---|
|
||
| **BEFORE** | Vor der Änderung |
|
||
| **AFTER** | Nach der Änderung |
|
||
| **INSTEAD OF** | Statt der Änderung |
|
||
|
||
### 8.6 Rechte
|
||
|
||
#### User/Schema-Konzept in Oracle
|
||
|
||
- Zentral: **User (Benutzer)**, auch **Schema** genannt
|
||
- Oracle-DB besteht aus verschiedenen Schemen, innerhalb derer ERM realisiert sind
|
||
- Vordefinierte Benutzer: **SYS** und **SYSTEM** (alle Rechte)
|
||
- Alle anderen Benutzer müssen erstellt und mit Rechten versehen werden
|
||
|
||
#### Zugriffsrichtlinien
|
||
|
||
Klare Richtlinien sollten festlegen: wer darf zugreifen, auf welche Ressourcen, welche Zugriffsart, an welchen Tagen/Uhrzeiten, von welchen Computern, wer erlaubt/informiert/protokolliert/abrechnet.
|
||
|
||
#### Sicherheitsmechanismen
|
||
|
||
| Mechanismus | Beschreibung |
|
||
|---|---|
|
||
| **DAC** (Discretionary Access Control) | Regel: {O, S, R, P, F} – Objekte, Subjekte, Zugriffsrechte, Prädikat, Recht zur Rechtevergabe |
|
||
| **MAC** (Mandatory Access Control) | Hierarchie der Prozesse mit Markierungen (Einstufung); Kommunikation nur bei gleichem Niveau |
|
||
|
||
#### Privilegien
|
||
|
||
| Typ | Beispiele |
|
||
|---|---|
|
||
| **Systemprivilegien** | Anmeldung, Anlegen/Löschen von Tabellen/Benutzern/Prozeduren, Abfragen von Systemtabellen, Verwaltung von Tablespaces |
|
||
| **Objektprivilegien** | Abfragen von Tabellen, Ändern von Inhalten, Verwenden von Funktionen |
|
||
|
||
**Empfehlung:** Sinnvolle **Rollenmatrix** erstellen; Benutzer bekommen keine Privilegien direkt, sondern über **Rollen**.
|
||
|
||
#### Benutzerverwaltung
|
||
|
||
```sql
|
||
-- Benutzer erstellen
|
||
DROP USER Student07;
|
||
CREATE USER Student07 IDENTIFIED BY system
|
||
DEFAULT TABLESPACE users
|
||
TEMPORARY TABLESPACE temp
|
||
QUOTA UNLIMITED ON users;
|
||
|
||
-- Passwort ändern
|
||
ALTER USER Student07 IDENTIFIED BY System01;
|
||
|
||
-- Rolle erstellen und Rechte vergeben
|
||
DROP ROLE StudentRole;
|
||
CREATE ROLE StudentRole;
|
||
GRANT CREATE session, CREATE table, CREATE view,
|
||
CREATE synonym, CREATE procedure, CREATE trigger
|
||
TO StudentRole;
|
||
GRANT StudentRole TO Student07;
|
||
|
||
-- Objektprivilegien (direkt, nicht empfohlen)
|
||
GRANT SELECT ON Tabelle13 TO Student07, Student08;
|
||
GRANT INSERT, SELECT ON Student03.TabelleA TO Student07;
|
||
GRANT ALL ON database TO dba_user02;
|
||
|
||
-- Spalten-basierte Rechte
|
||
GRANT UPDATE (Spalte1), INSERT (Spalte2, Spalte3)
|
||
ON Tabelle52 TO Student07;
|
||
```
|
||
|
||
**Befehle:** Nur **GRANT** (Rechte vergeben) und **REVOKE** (Rechte entziehen).
|
||
|
||
### 8.7 Backup
|
||
|
||
#### Definition
|
||
|
||
**Backup (Datensicherung)** = Speicherung der Daten, mit der ein System nicht direkt arbeitet.
|
||
|
||
**Eigenschaften:**
|
||
- Kann mehrere Dateien und Verzeichnisse beinhalten
|
||
- Kann wie eine oder mehrere Dateien aussehen
|
||
- Kann verschlüsselt und/oder komprimiert sein
|
||
- Kann sich über mehrere Datenträger verbreiten
|
||
|
||
**Backup-Archiv** = Sammlung von mehreren Backups.
|
||
|
||
**Zwecke:**
|
||
1. Wiederherstellung nach Absturz
|
||
2. Wiederherstellung eines bestimmten Zeitpunkts für Statistik (z. B. Jahresbericht)
|
||
3. Wiederherstellung für planmäßige Funktionalität (z. B. Forschungsprojekte)
|
||
|
||
**Regel:** In allen nicht privaten Systemen muss man immer Backup planen und regelmäßig durchführen.
|
||
|
||
#### RAID
|
||
|
||
**RAID** (Redundant Array of Inexpensive/Independent Disks) ist **kein Backup!**
|
||
|
||
| Eigenschaft | Beschreibung |
|
||
|---|---|
|
||
| Funktion | Redundante Speicherung auf mehreren Festplatten |
|
||
| Bei Ausfall | Daten können von anderer Platte gelesen/geschrieben werden |
|
||
| Hot-Swap | Kaputte Platte im laufenden Betrieb austauschbar |
|
||
| Software-RAID | Von fast allen Betriebssystemen unterstützt |
|
||
| Hardware-RAID | Betriebssystemunabhängig |
|
||
|
||
- RAID erfüllt **keine** Backup-Funktionen
|
||
- RAID kann als **Speicherort** für Backup verwendet werden
|
||
|
||
#### Oracle Backup-Tools
|
||
|
||
| Tool | Beschreibung |
|
||
|---|---|
|
||
| **exp/imp** | Ältere Versionen |
|
||
| **expdp/impdp** | Neuere Versionen (Data Pump) |
|
||
| **RMAN** | Recovery Manager |
|
||
|
||
**Weitere Tools:** Linux (cp, tar, bzip, gzip, dd), Windows (copy, Server-Sicherung), Drittanbieter (Acronis, Paragon, Fwbackups, Bacula).
|
||
|
||
#### Backup-Medien
|
||
|
||
| Medium | Beschreibung |
|
||
|---|---|
|
||
| **DAS** | Direct Attached Storage (lokale Festplatte) |
|
||
| **NAS** | Network Attached Storage (Netzwerk) |
|
||
| **SAN** | Storage Area Network (Netzwerk) |
|
||
| Magnetband | Bandlaufwerk mit Roboter, bis zu 4 GiB |
|
||
| CD/DVD/Blu-Ray | Optische Medien |
|
||
| USB-Geräte | Externe Speicher |
|
||
| FireWire-Geräte | Externe Speicher |
|
||
| Cloud | Sicherheit bedenklich |
|
||
|
||
**Generationsprinzip (Großvater-Vater-Sohn):**
|
||
- 3 Datenträger rotierend: 1. Sicherung → Großvater, 2. → Vater, 3. → Sohn
|
||
- 4. Sicherung: Großvater wird zum Sohn überschrieben, Rollen rotieren
|
||
- Je mehr Datenträger, desto sicherer
|
||
|
||
#### Backup-Methoden
|
||
|
||
| Methode | Beschreibung |
|
||
|---|---|
|
||
| **Online/Hot Backup** | DB läuft weiter, Daten werden im laufenden Betrieb gesichert; Gefahr: nicht-konsistenter Zustand; DB liefert spezifische Lösungen |
|
||
| **Offline/Cold Backup** | DB wird heruntergefahren, geschlossene Dateien kopiert; Datenbestand ist **immer konsistent** |
|
||
|
||
#### Sicherungsarten
|
||
|
||
| Art | Umfang | Markierung? | Wiederherstellung | Vorteil/Nachteil |
|
||
|---|---|---|---|---|
|
||
| **Normal** | Alle ausgewählten Daten | Ja (als gesichert) | Nur diese Sicherung | Einfach, aber groß |
|
||
| **Kopie** | Wie Normal | Nein | — | Keine Auswirkung auf andere Strategien |
|
||
| **Täglich** | Nur heute geänderte Daten | Ja | — | Klein, tagesbezogen |
|
||
| **Inkrementell** | Nur seit letzter Sicherung geänderte Daten | Ja | Letzte Normal + alle Inkrementellen in Reihenfolge | Wenig Zeit/Speicher, aber aufwändige Wiederherstellung |
|
||
| **Differenziell** | Nur seit letzter normaler Sicherung geänderte Daten | Nein | Letzte Normal + letzte Differenzielle | Einfache Wiederherstellung, aber wachsende Größe |
|
||
|
||
#### Sicherungsstrategien
|
||
|
||
| Strategie | Beispiel |
|
||
|---|---|
|
||
| Nur normale Sicherungen | Monatlich |
|
||
| Normal + Inkrementell | Jährlich normal, monatlich inkrementell |
|
||
| Normal + Differenziell | Jährlich normal, monatlich differenziell |
|
||
|
||
**Wichtig:** Anforderungen des Unternehmens und Speicherbedarf müssen berücksichtigt werden.
|
||
|
||
---
|
||
|
||
## 9. Data Warehouse Konzepte (i_DWKonzepte)
|
||
|
||
### 9.1 Konzepte
|
||
|
||
Drei Verarbeitungsarten:
|
||
- **Batch-Verarbeitung** – klassische Stapelverarbeitung
|
||
- **OLTP** = Online Transaction Processing – Tagesgeschäft
|
||
- **OLAP** = Online Analytical Processing – Analyse und Auswertung
|
||
|
||
OLAP-Systeme sind unverzichtbare Instrumente zur **Analyse umfangreicher und mehrdimensionaler Daten**. Sie gewähren anwendungsspezifische Sichten und werden primär von **Managern unterschiedlicher Ebenen** verwendet.
|
||
|
||
### 9.2 OLAP
|
||
|
||
**Gründe für OLAP:**
|
||
- Trennung von Tagesgeschäft und Auswertungen
|
||
- Historisierte Daten mit Zeitraum-Bezug
|
||
- Große Mengen von **Nur-Lese-Daten** (Permanenz)
|
||
- **Multidimensionale Datenmodelle**
|
||
- Gezielte **Denormalisierung** des ganzen Modells
|
||
|
||
**Eigenschaften von OLAP:**
|
||
- Intuitive und interaktive Analyse der Daten
|
||
- Flexible Darstellung aus unterschiedlichen Perspektiven
|
||
- Basis: **Hypercube** (kartesisches Produkt)
|
||
- Besondere Operationen: Rotation, Slice, Dice, Drill-Through, Drill-Across, Roll-Up, Drill-Down
|
||
- Clients: Spezielle Programme oder Tabellenkalkulationstools (z.B. Excel)
|
||
|
||
**Data Warehouse als OLAP-Datenbank dient:**
|
||
- Unterstützung strategischer Entscheidungen
|
||
- Analyse von Tendenzen und Mustern über große Zeiträume
|
||
- Bessere Entscheidungen durch bessere Informationen
|
||
- Flexiblere Analysemöglichkeiten
|
||
- Verlagerung der Analyse in Fachabteilungen
|
||
- Geringere Berichterstellungskosten
|
||
- Gemeinsame Informationsbasis im Unternehmen
|
||
|
||
### 9.3 ROLAP, MOLAP, HOLAP
|
||
|
||
#### ROLAP – Relationales OLAP
|
||
|
||
- Basiert auf **relationalen Datenbanken** (Oracle, DB2)
|
||
- Verwendet **Star-Schema** (Fakten- und Dimensionstabellen, 3NF bei Dimensionstabellen verletzt) und **Snowflake-Schema** (normalisiert)
|
||
- Für hohes Datenvorkommen und große Nutzerzahlen geeignet
|
||
|
||
**Vorteile:**
|
||
- Bewährte relationale Technologien für Abfragen, Verwaltung, Speicherung, Recovery, Archivierung
|
||
- Sperrmechanismen und Transaktionen nicht benötigt
|
||
|
||
**Nachteile:**
|
||
- Umfangreiche JOINs, Indizes, Table Scans nötig
|
||
- Umfangreiche Aggregationen und Berechnungen
|
||
|
||
#### MOLAP – Multidimensionales OLAP
|
||
|
||
- Basiert auf **herstellerspezifischen Datenbanken**
|
||
- Optimiert für hohe Performance in multidimensionalen Datenstrukturen
|
||
- Schnelle Aggregationen
|
||
|
||
**Vorteile:**
|
||
- Hohe Performance
|
||
- Am multidimensionalen Modell ausgerichtet
|
||
|
||
**Nachteile:**
|
||
- Hoher Schulungsaufwand
|
||
- Proprietäre Verwaltung
|
||
- Oft fehlende Standardschnittstellen
|
||
|
||
#### HOLAP – Hybrides OLAP
|
||
|
||
Variante aus ROLAP und MOLAP.
|
||
|
||
### 9.4 Lebenszyklus eines Data Warehouse
|
||
|
||
**Schritt A – Planung:**
|
||
- Analyse von Architektur und Infrastruktur
|
||
- Definition der Ressourcen und Zeitvorgaben
|
||
- Archivierungsstrategien
|
||
- Verbindungsmöglichkeiten und Ladeprogramme
|
||
|
||
**Schritt B – Spezifikation & Modellierung:**
|
||
- Ermittlung der Entitäten und Attribute
|
||
- Geschäftsprozesse und -anwendungsfälle identifizieren
|
||
- Ein-/Ausgabedaten und Detailierungsgrad festlegen
|
||
- **Logisches Datenmodell** entsteht
|
||
|
||
**Schritt C – Physischer Datenbankentwurf:**
|
||
- Star-Schema / Snowflake-Schema entwerfen
|
||
- Aufheben der Normalisierung
|
||
- Schlüssel, Indizierungsstrategien, Partitionierung festlegen
|
||
|
||
**Schritt D – Befüllen des DWH:**
|
||
- Definition der Quellsysteme
|
||
- Umformungsspezifikationen
|
||
- Aktualisierungszyklus festlegen
|
||
- **ETL-Prozeduren** definieren und testen
|
||
- Automatisierung der Ladevorgänge, Backup- und Recovery-Prozeduren
|
||
- Anwendungsentwicklung (Berichte, Dokumentation, Test)
|
||
|
||
**Schritt E – Betrieb:**
|
||
- Test und Überprüfung der Daten
|
||
- Schulung, Produktabnahme, Wartung
|
||
- Verbesserungen und Weiterentwicklung
|
||
- Performance-Untersuchungen
|
||
|
||
### 9.5 Vergleich OLTP und OLAP
|
||
|
||
| Merkmal | OLTP | OLAP |
|
||
|---|---|---|
|
||
| Abfragen | Vorhersehbar, einzelne Datensätze | Komplex, unvorhersehbar |
|
||
| Daten | Ständige Änderungen | Statisch, unveränderbar |
|
||
| Datenstruktur | Normalisiertes Modell (nur notwendige Redundanz) | Denormalisiertes Modell (verständlich) |
|
||
| Fokus | Hohe Transaktionsrate | Aggregation – viele Fakten zu einem Fakt |
|
||
|
||
### 9.6 ETL – Extract, Transform, Load
|
||
|
||
#### Extraktion
|
||
- Periodischer, ereignisgesteuerter oder anfragegesteuerter Abzug
|
||
- Komplette oder Delta-Übertragungen
|
||
- Protokollierung der Änderungen und Übertragungen
|
||
|
||
#### Transformation (im Arbeitsbereich)
|
||
- Datentypkonvertierung
|
||
- Wertumsetzung
|
||
- Schlüsselvergabe, -anpassung, -bereinigung
|
||
- Zeitstempelvergabe
|
||
- Datenverdichtung, -bereinigung
|
||
|
||
#### Laden
|
||
- Übertragung der Daten aus dem Arbeitsbereich in das Data Warehouse
|
||
|
||
### 9.7 Hypercube-Operationen
|
||
|
||
Grundlage: **Mehrdimensionaler Hypercube** mit Dimensionen wie Zeitperioden, Produkte, Abteilungen und Werten wie Absatzvolumen.
|
||
|
||
#### Navigationsoperationen
|
||
|
||
| Operation | Beschreibung |
|
||
|---|---|
|
||
| **Rotation** | Auswahl zweier konkreter Dimensionen (Drehung des Würfels) |
|
||
| **Slice** | Voller zweidimensionaler Ausschnitt aus dem Würfel |
|
||
| **Dice** | Mehrdimensionaler Ausschnitt (Untermenge, kleiner Würfel) |
|
||
| **Drill-Across** | Verbindung mehrerer Würfel gleicher Dimension zu einer Kette |
|
||
|
||
#### Hierarchische Navigation
|
||
|
||
| Operation | Beschreibung |
|
||
|---|---|
|
||
| **Drill-Down** | Von oberer zu tieferer Ebene der Hierarchie |
|
||
| **Roll-Up** | Von tieferer zu oberer Ebene der Hierarchie |
|
||
| **Drill-Through** | Wenn Drill-Down nicht mehr möglich, wird neue Datenquelle (Würfel) angeschlossen |
|
||
|
||
### 9.8 Varianten
|
||
|
||
- **Data Marts** – Begrenzter Anwendungsbereich (z.B. eine Abteilung). Einfacher einzurichten als DWH, aber Konsistenzprobleme bei mehreren Data Marts
|
||
- **Operation Data Stores** – Für aktuelle (tägliche) Auswertungen, unterstützen kaum langfristige Abfragen
|
||
|
||
---
|
||
|
||
## 10. Andere Typen von Datenbanken (j_AndereDB)
|
||
|
||
### 10.1 Hierarchische Datenbanken
|
||
|
||
#### Konzept
|
||
- Vermutlich die **ältesten Datenbanken**, heute nur noch historische Bedeutung
|
||
- Bei Bedarf durch relationale Datenbanken simulierbar
|
||
- Datenbestand: Datensätze mit fester oder variabler Struktur
|
||
- Semantische Beziehungen sind **fest programmmäßig durch Verweise** implementiert (Vorgänger-Nachfolger-Prinzip)
|
||
|
||
#### Vorteile
|
||
- Theoretisch sehr schnelle Such-, Einfüge- und Änderungsvorgänge
|
||
|
||
#### Nachteile
|
||
- **Unflexible baumartige Struktur**
|
||
- Mit der Zeit werden Zugriffe langsamer (Einfüge-/Löschoperationen) → Baum muss in Gleichgewicht gebracht werden (zeit- und speicheraufwendig)
|
||
|
||
#### Merkmale
|
||
- Gut geeignet für: **Dateisysteme**, LDAP, Internet-Domänen, Stücklisten
|
||
- Datensätze können mehr als zwei Verweise enthalten → nicht nur binäre, sondern auch **n-äre Bäume**
|
||
- Knoten können auf Bäume mit anders strukturierten Datensätzen verweisen (Bäume/Unterbäume = Entitätstypen)
|
||
- Nicht-hierarchische Beziehungen: durch verkettete Listen implementiert
|
||
|
||
#### IMS von IBM
|
||
- Älteste, bis heute eingesetzte hierarchische Datenbank
|
||
- Komponenten: Datenbank, IMS Explorer, IMS SOAP Gateway, IMS Java Connector, IMS Data Provider .NET
|
||
|
||
### 10.2 Netzartige Datenbanken
|
||
|
||
#### Konzept
|
||
- Entstehen aus hierarchischen DB durch **Verweisfelder für Rückwärtsbewegung**
|
||
- **Verallgemeinerung** der hierarchischen Datenbanken
|
||
- Unterschiedliche Entitätstypen vertreten, Beziehungen durch besondere Art der Datensätze modelliert
|
||
|
||
#### Vorteile
|
||
- Theoretisch vielfältige Verweise möglich
|
||
|
||
#### Nachteile
|
||
- Unflexible netzartige Struktur
|
||
- Modellierung der Beziehungen eingeschränkt
|
||
- Saubere Trennung der Entitätstypen kaum möglich
|
||
|
||
#### Merkmale
|
||
- Geeignet für: **geografische Elemente**, Makrostrukturen des Internets
|
||
- Jeder Knoten kann mehrere Vorgänger und Nachfolger haben
|
||
- Semantische Darstellung der Beziehungen meist programmiert
|
||
- Bekannter Vertreter: **UDS** (Universal Datenbank System) von Siemens
|
||
- Ca. 20 Jahre im Einsatz, dann durch **relationale Datenbanken verdrängt**
|
||
|
||
### 10.3 Verteilte Datenbanken
|
||
|
||
#### Konzept
|
||
- **Verbund von mehreren** (meist relationalen) Datenbanken
|
||
- Zusammenfassung von Informationseinheiten auf **mehreren Knoten** (Computern), über ein Netzwerk verbunden
|
||
- **Metadaten** (Zugriffsdaten) in einer übergeordneten Datenbank zusammengefasst
|
||
- Verteilte Transaktionen bestehen aus Teil-Transaktionen in den Komponenten-Datenbanken
|
||
|
||
#### Vorteile
|
||
- Optimale Darstellung der Unternehmensstruktur durch lokale Datenbestände
|
||
- Unabhängigkeit der Teil-Datenbanken voneinander
|
||
- Orts-, Plattform- und Netzwerkunabhängigkeit
|
||
- Ständiger Betrieb
|
||
- Effizienz durch parallele Verarbeitung
|
||
- Transparenz der Anfragen und Anweisungen
|
||
- Ergebnis- statt Sourcedaten-Transfer
|
||
|
||
#### Nachteile
|
||
- Vorbereitungsaufwand (Konzepte, Planung, Koordination)
|
||
- Zusätzliche Administration der Metadaten (Backup/Restore, Konsistenz)
|
||
- Aufwendige Entwicklung der Abfragen
|
||
- Abhängigkeit von Lauffähigkeit der einzelnen Teil-Datenbanken
|
||
|
||
#### Entwurf
|
||
|
||
Wie bei konventionellen relationalen DB, plus zusätzliche Schritte:
|
||
1. **Fragmentierungsschema** erstellen
|
||
2. **Zuordnungsschema** erstellen
|
||
|
||
#### Fragmentierung
|
||
|
||
Relationen werden in disjunkte Fragmente zerlegt:
|
||
- **Horizontale Zerlegung** – Datensätze nach Kriterien zusammengefasst (z.B. Status='Prof')
|
||
- **Vertikale Zerlegung** – Attribute zusammengefasst (z.B. Vorname + Nachname)
|
||
- **Kombinierte Zerlegung** – horizontal + vertikal
|
||
|
||
Anforderungen:
|
||
- **Vollständigkeit** – Rekonstruktion ergibt vollständige Datenbank
|
||
- **Disjunktion** – Fragmente überlappen sich nicht
|
||
|
||
#### Zuordnung (Allocation)
|
||
- Fragmente auf Knoten verteilen (theoretisch redundanzfrei)
|
||
- Aus Sicherheits-/Leistungsgründen: **Replikation**
|
||
- Benutzer arbeiten idealerweise nur mit dem Gesamtschema (Transparenz)
|
||
|
||
#### Verteilte Transaktionen
|
||
- DBMS muss globale Transaktion in **Teil-Transaktionen** zerlegen
|
||
- Entweder alle erfolgreich oder alle zurückgesetzt
|
||
- Jede Teil-DB muss **UNDO- und REDO-Funktionalität** beherrschen
|
||
- **Two-Phase-Commit**: prepare → ready/failed → commit/abort
|
||
|
||
### 10.4 Objektorientierte Datenbanken
|
||
|
||
#### Konzept
|
||
- Idee der OO: Daten und Aktionen (Methoden) zusammen bringen → **Kapselung**
|
||
- Idee der DB: Daten und deren **Beziehungen** modellieren, unabhängig von Aktionen
|
||
- Diese beiden Ideen sind **schwer zu vereinbaren**
|
||
|
||
#### Eigenschaften
|
||
- Vorteilhaft bei **Klassenhierarchien** unter Daten
|
||
- Komplexe Objekte speicher- und abrufbar
|
||
- **Keine Normalisierung**
|
||
- Abfragen langsamer als bei relationalen DB
|
||
- Geringe Kompatibilität zu allgemeinen Anwendungen
|
||
|
||
#### Beispiele
|
||
- **db4o** – geringe Speichergröße, für Java/.NET, keine SQL-Abfragesprache (QBE wird unterstützt), unterstützt Transaktionen (COMMIT, ROLLBACK)
|
||
- **Oracle** – objektrelationaler Ansatz: Objekttypen (analog zu Klassen) mit Daten, Funktionen und Prozeduren, instanziierbar in PL/SQL
|
||
|
||
### 10.5 No-SQL-Datenbanken (Not only SQL)
|
||
|
||
#### Konzept
|
||
- **No-SQL = Not only SQL** – betont die Existenz anderer Datenbanken neben relationalen
|
||
- Relationale DB bleiben wichtig für Anwendungen mit strengen Konsistenz-/Sicherheitsanforderungen
|
||
|
||
#### Gründe für No-SQL
|
||
- Enorm große Datenvolumen (TiB- und PiB-Bereiche)
|
||
- Kurze Laufzeiten der Abfragen nötig
|
||
- Konsistenz nicht vorrangig (Daten meist nur abgefragt)
|
||
- **Verfügbarkeit vor Konsistenz** (z.B. DNS)
|
||
- Speicher für relationale DB wird teuer
|
||
|
||
#### Eigenschaften
|
||
- Einfaches/schwaches/kein Schema
|
||
- Einfache horizontale und vertikale **Skalierung** (horizontal bevorzugt)
|
||
- **BASE-Prinzip** statt ACID
|
||
- Keine Normalformen, keine JOINs, denormalisiert
|
||
- Hohe Leistung und Verfügbarkeit dank **Replikation**
|
||
|
||
#### BASE vs. ACID
|
||
|
||
| BASE | ACID |
|
||
|---|---|
|
||
| **B**asically **A**vailable – Verfügbarkeit ggf. auf Kosten der Konsistenz | **A**tomic – Transaktion ununterbrechbar |
|
||
| **S**oft State – Konsistenz an Entwickler delegiert | **C**onsistent – konsistenter Zustand gewährleistet |
|
||
| **E**ventually Consistent – Abfragen auch bei inkonsistentem Zustand | **I**solated – Transaktionen verletzen einander nicht |
|
||
| | **D**urable – ausgefallene Transaktion gefährdet eigene Daten nicht |
|
||
|
||
#### Document-Stores
|
||
- **Schemafrei**, Daten in Dokumenten mit eindeutiger ID
|
||
- Keine einheitliche Struktur, verschachtelbar
|
||
- Felder können verschiedene Datentypen und Arrays haben
|
||
- Hohe Skalierbarkeit
|
||
- Beispiele: **MongoDB, CouchDB** (halb-strukturierte Formate: XML, JSON)
|
||
- Nachteil: keine Normalisierung → Datenredundanz möglich, Konsistenz durch Anwendung
|
||
|
||
#### Key-Value-Stores
|
||
- Nur **Schlüssel und zugehörige Werte** gespeichert
|
||
- Einfaches Schema, Schlüssel sortierbar
|
||
- Werte: Zahlen, Zeichenketten, Listen, Dokumente, Tabellen (nicht einheitlich)
|
||
- Daten im **Hauptspeicher (In-Memory)** oder auf Datenträger (On-Disc)
|
||
- Beispiele: **Berkeley DB, Redis, Amazon DynamoDB**
|
||
- Schnelle einfache Abfragen, aber komplexe Beziehungen schwer zu implementieren
|
||
|
||
#### Wide-Column-Stores
|
||
- Datensätze haben **unterschiedliche Struktur** (schemafrei)
|
||
- Milliarden von Feldern pro Datensatz möglich
|
||
- Feldstruktur: Spaltenname (Schlüssel), Daten, Zeitstempel
|
||
- **Column Families** für zusammenhängende Spalten
|
||
- Beispiele: **MS Azure Cosmos DB, Cassandra**
|
||
- Gut für Big Data Analytics / DWH
|
||
- Nicht verwechseln mit spaltenorientierten relationalen DB (die haben festes Schema)
|
||
|
||
#### XML-Datenbanken
|
||
- Daten im **XML-Format** gespeichert
|
||
- Abfragesprache: **XPath**
|
||
- Beispiel: **BaseX**
|
||
- Schnell für ganze Dokumente, langsam bei großen Datenmengen
|
||
- Fehlende Operationen wie COMMIT, ROLLBACK
|
||
- Eher **Verarbeitungssysteme für XML-Dokumente** als echte Datenbanken
|
||
|
||
#### Graph-Datenbanken
|
||
- Daten in drei Klassen: **Knoten, Attribut, Kante** (Graph-Struktur)
|
||
- Knoten = Tupel (Datensätze), Kanten = Beziehungen
|
||
- Effektiv für **"wer-kennt-wen"**-Informationen
|
||
- Nachteile: keine einheitliche Abfragesprache, keine direkten Zugriffe auf Knoten via Attributen
|
||
|
||
### Fazit
|
||
|
||
Die No-SQL-Datenbanken sind **sehr effektiv in ihrem Spezialgebiet**. Relationale DB bleiben wichtig für Anwendungen mit strengen Konsistenz-/Sicherheitsanforderungen.
|
||
|
||
---
|
||
|
||
## 11. Gesamtübersicht & Cheat-Sheet
|
||
|
||
### 11.1 Datenbankentwicklungsprozess (Phasenmodell)
|
||
|
||
```
|
||
Anforderungsanalyse
|
||
↓
|
||
Konzeptueller Entwurf → ERM (Peter-Chen-Notation)
|
||
↓
|
||
Logischer Entwurf → Relationale Tabellen (Konvertierungsregeln)
|
||
↓
|
||
Normalisierung → 1NF → 2NF → 3NF → BCNF → 4NF → 5NF
|
||
↓
|
||
Physischer Entwurf → Tablespaces, Indizes, Storage-Parameter
|
||
↓
|
||
Implementierung → SQL (DDL + DML) + Constraints + Trigger
|
||
↓
|
||
Betrieb → Transaktionen, Backup, Rechte, Monitoring
|
||
```
|
||
|
||
### 11.2 ERM → Relationale Tabellen – Kurzreferenz
|
||
|
||
| ERM-Element | Konvertierungsregel |
|
||
|---|---|
|
||
| Entitätstyp | Eigene Tabelle; alle Attribute inkl. PK |
|
||
| N:M-Beziehung | Eigene Beziehungstabelle; PKs beider Seiten = PK der Beziehungstabelle |
|
||
| 1:N-Beziehung | Kein eigene Tabelle; PK der 1-Seite als FK in die N-Seite |
|
||
| 1:1-Beziehung | Option A: Zusammenführen; Option B: FK in eine der Tabellen |
|
||
| Schwache Entität | Eigene Tabelle; PK der starken Entität wird **Teil des PK** |
|
||
| Generalisierung | Obertyp-Tabelle + je eine Untertyp-Tabelle (PK des Obertyps als FK) |
|
||
| Mehrwertige Attribute | Eigene Tabelle + 1:N-Beziehung zur Entitätstabelle |
|
||
|
||
### 11.3 Normalformen – Kurzreferenz
|
||
|
||
| NF | Verletzung erkennen | Lösung |
|
||
|---|---|---|
|
||
| **1NF** | Zelle enthält mehrere Werte / Liste | Aufteilen in separate Zeilen oder Tabelle |
|
||
| **2NF** | Nicht-PK-Feld hängt nur von *Teil* des zusammengesetzten PK ab | Auslagern in neue Tabelle mit Teilschlüssel als PK |
|
||
| **3NF** | Nicht-PK-Feld hängt von einem anderen Nicht-PK-Feld ab (transitive Abhängigkeit) | Auslagern; abhängiges Feld wird PK neuer Tabelle |
|
||
| **BCNF** | Teil eines Schlüsselkandidaten hängt von Teil eines anderen Schlüsselkandidaten ab (Überlappung) | Aufteilen nach Schlüsselkandidaten |
|
||
| **4NF** | Nicht-PK-Felder sind semantisch unabhängig (unterschiedliche Verwendungshäufigkeit) | Nach Semantik trennen |
|
||
| **5NF** | Tabelle kann verlustfrei in kleinere Tabellen zerlegt werden | Vollständig zerlegen (JOIN-Rekonstruktion muss möglich sein) |
|
||
|
||
### 11.4 Relationale Algebra – Vollständiger Operatorensatz
|
||
|
||
| Operator | Notation | SQL | Grundoperator |
|
||
|---|---|---|---|
|
||
| **Selektion** | σ_P(R) | WHERE P | Ja |
|
||
| **Projektion** | π_A(R) | SELECT A | Ja |
|
||
| **Kartesisches Produkt** | R₁ × R₂ | CROSS JOIN | Ja |
|
||
| **Umbenennung** | ρ_alias(R) | AS alias | Ja |
|
||
| **Vereinigung** | R₁ ∪ R₂ | UNION | Ja |
|
||
| **Differenz** | R₁ — R₂ | MINUS / EXCEPT | Ja |
|
||
| **Schnittmenge** | R₁ ∩ R₂ | INTERSECT | Nein (= R₁ — (R₁ — R₂)) |
|
||
| **Join (Theta/Inner)** | R₁ ⋈_P R₂ | INNER JOIN ... ON P | Nein (= σ_P(R₁ × R₂)) |
|
||
| **Natural Join** | R₁ ⋈ R₂ | NATURAL JOIN | Nein |
|
||
| **Left Outer Join** | R₁ ⟕ R₂ | LEFT OUTER JOIN | Nein |
|
||
| **Right Outer Join** | R₁ ⟖ R₂ | RIGHT OUTER JOIN | Nein |
|
||
| **Full Outer Join** | R₁ ⟗ R₂ | FULL OUTER JOIN | Nein |
|
||
| **Semi-JOIN L** | L ⋉ R | SELECT L.* ... INNER JOIN | Nein |
|
||
| **Anti-Semi-JOIN L** | L ⊲ R | NOT IN / NOT EXISTS | Nein |
|
||
|
||
### 11.5 SQL – Vollständige SELECT-Syntax
|
||
|
||
```sql
|
||
SELECT [DISTINCT] spalten | * -- Projektion (π)
|
||
[, aggregatfunktion(spalte) [AS alias]]
|
||
FROM tabelle1 [alias1] -- Quellen (×)
|
||
[JOIN tabelle2 ON bedingung] -- Verbund (⋈)
|
||
[(SELECT ...) AS inline_view] -- Inline View
|
||
WHERE filterbedingung -- Selektion (σ)
|
||
[AND | OR | NOT weiteresBedingung]
|
||
[AND spalte LIKE 'muster']
|
||
[AND spalte IN (wert1, wert2)]
|
||
[AND spalte IS [NOT] NULL]
|
||
GROUP BY gruppierungsspalten -- Gruppierung
|
||
HAVING aggregatbedingung -- Gruppenfilter
|
||
ORDER BY sortierspalte [ASC | DESC]; -- Sortierung
|
||
```
|
||
|
||
### 11.6 Transaktionen – ACID und Isolationsstufen
|
||
|
||
| Problem | Tritt auf bei | Gelöst durch |
|
||
|---|---|---|
|
||
| **Lost Update** | Zwei parallele Updates auf gemeinsamer Variable | SERIALIZABLE |
|
||
| **Dirty Read** | Lesen nicht-committeter Änderungen | READ COMMITTED (Oracle-Standard) |
|
||
| **Non-Repeatable Read** | Zweifaches Lesen liefert andere Werte | SERIALIZABLE |
|
||
| **Phantom Read** | Zweifaches COUNT liefert andere Anzahl | SERIALIZABLE |
|
||
|
||
| Isolationsstufe | Lost Update | Dirty Read | NR Read | Phantom | Oracle |
|
||
|---|---|---|---|---|---|
|
||
| READ UNCOMMITTED | ✗ | möglich | möglich | möglich | nicht verfügbar |
|
||
| READ COMMITTED | ✗ | verhindert | möglich | möglich | **Standard** |
|
||
| REPEATABLE READ | ✗ | verhindert | verhindert | möglich | nicht verfügbar |
|
||
| SERIALIZABLE | verhindert | verhindert | verhindert | verhindert | verfügbar |
|
||
|
||
### 11.7 Speicherstrukturen – Oracle-Hierarchie
|
||
|
||
```
|
||
Datenbank
|
||
└── Tablespace (eine pro Anwendung)
|
||
└── Datenbankdatei (.dbf)
|
||
└── Segment / Extent (erweiterbare Speichereinheit)
|
||
└── Block (kleinste I/O-Einheit)
|
||
|
||
Arbeitsspeicher:
|
||
├── SGA (System Global Area)
|
||
│ ├── Database-Buffer-Cache (aktuelle Datenblöcke)
|
||
│ ├── Dirty List (geänderte, noch nicht geschriebene Blöcke)
|
||
│ ├── Redo-Log-Buffer (Änderungsprotokoll für Crash-Recovery)
|
||
│ ├── Shared Pool (SQL-Parsing, Data Dictionary)
|
||
│ ├── Large Pool (Recovery Manager)
|
||
│ └── Java Pool (Java-Anwendungen)
|
||
├── PGA (Program Global Area) – Prozesssteuerung
|
||
└── UGA (User Global Area) – Sitzungsdaten je Benutzer
|
||
```
|
||
|
||
### 11.8 Backup-Entscheidungsmatrix
|
||
|
||
| Kriterium | Normal | Inkrementell | Differenziell | Kopie |
|
||
|---|---|---|---|---|
|
||
| Umfang | Alle ausgewählten Daten | Seit letzter Sicherung | Seit letzter Normal | Wie Normal |
|
||
| Als gesichert markiert? | Ja | Ja | Nein | Nein |
|
||
| Wiederherstellung | Diese Sicherung allein | Letzte Normal + alle Inkrementellen | Letzte Normal + letzte Differenzielle | — |
|
||
| Speicherbedarf | Hoch | Gering | Mittel | Hoch |
|
||
| Wiederherstellungsaufwand | Gering | Hoch | Mittel | — |
|
||
|
||
### 11.9 OLTP vs. OLAP vs. Data Warehouse
|
||
|
||
| Merkmal | OLTP | OLAP / DWH |
|
||
|---|---|---|
|
||
| Zweck | Tagesgeschäft | Analyse / Entscheidungsunterstützung |
|
||
| Abfragen | Vorhersehbar, einfach, einzelne Sätze | Komplex, ad-hoc, viele Zeilen |
|
||
| Daten | Ständige Änderungen | Statisch, historisiert, Nur-Lesen |
|
||
| Schema | Normalisiert (3NF) | Denormalisiert (Star/Snowflake) |
|
||
| Transaktionen | Häufig, kurz | Selten / keine |
|
||
| Benutzer | Viele operative Benutzer | Wenige Analytiker / Manager |
|
||
| Index-Typ | Konventionell (B-Tree) | Bitmap-Indizes (geringe Kardinalität) |
|
||
|
||
### 11.10 No-SQL-Datenbanken – Vergleich
|
||
|
||
| Typ | Struktur | Beispiele | Stärke | Schwäche |
|
||
|---|---|---|---|---|
|
||
| **Document-Store** | Dokumente (JSON/XML) | MongoDB, CouchDB | Flexibles Schema | Keine Normalisierung |
|
||
| **Key-Value-Store** | Schlüssel → Wert | Redis, DynamoDB, Berkeley DB | Extrem schnell | Keine komplexen Beziehungen |
|
||
| **Wide-Column-Store** | Spaltenorientiert, schemafrei | Cassandra, Azure Cosmos DB | Milliarden Felder, Big Data | Kein festes Schema |
|
||
| **XML-Datenbank** | XML + XPath | BaseX | Dokumentverarbeitung | Kein COMMIT/ROLLBACK |
|
||
| **Graph-Datenbank** | Knoten + Kanten | Neo4j u.a. | Beziehungsgeflechte | Keine einheitliche Abfragesprache |
|
||
| **Relational** | Tabellen, Normalisierung | Oracle, PostgreSQL, MySQL | ACID, SQL, Flexibilität | Skalierung bei extremen Datenmengen |
|
||
|
||
### 11.11 Wichtige Begriffe – Schnellreferenz
|
||
|
||
| Begriff | Definition |
|
||
|---|---|
|
||
| **Relation** | Untermenge des kartesischen Produkts mehrerer Datentypen = Tabelle |
|
||
| **Tupel** | Zeile / Datensatz in einer Relation |
|
||
| **Attribut / Feld** | Spalte in einer Relation |
|
||
| **Schema** | Namen aller Felder + Datentypen + Länge + Reihenfolge |
|
||
| **Primärschlüssel (PK)** | Minimaler Schlüssel, der Tupel eindeutig identifiziert |
|
||
| **Fremdschlüssel (FK)** | Attribut, das auf PK einer anderen Tabelle verweist |
|
||
| **Kardinalität** | Anzahl der Tupel in einer Relation |
|
||
| **Grad** | Anzahl der Attribute einer Relation |
|
||
| **Funktionale Abhängigkeit** | X → Y: X bestimmt Y eindeutig |
|
||
| **Transaktion** | Atomare Folge von Operationen (alles oder nichts) |
|
||
| **ACID** | Atomicity, Consistency, Isolation, Durability |
|
||
| **BASE** | Basically Available, Soft State, Eventually Consistent |
|
||
| **Deadlock** | Zwei Transaktionen warten gegenseitig aufeinander |
|
||
| **Serialisierbarkeit** | Parallele Ausführung entspricht in der Wirkung einer seriellen |
|
||
| **ETL** | Extract, Transform, Load (Befüllung eines DWH) |
|
||
| **OLTP** | Online Transaction Processing (Tagesgeschäft) |
|
||
| **OLAP** | Online Analytical Processing (Analyse) |
|
||
| **Hypercube** | Mehrdimensionaler Datenwürfel als Basis für OLAP |
|
||
| **Tablespace** | Logischer Container für Datenbankobjekte in Oracle |
|
||
| **Redo-Log** | Protokoll durchgeführter Änderungen (für Crash-Recovery) |
|
||
| **Rollback-Segment** | Speicher für Datenzustand vor Änderungen (für UNDO) |
|