Datenbanktypen#

Midjourney: Database Tree, ref. Gustav Klimt

Eventually, you have to throw the data over a wall.

— Pat Helland

Folien/PDF#

Grundlagen und Definitionen#

In vielen Softwarelösungen sind die zu verwaltenden Daten so groß, dass es nicht mehr effizient ist, sie in Dateien zu verwalten. Stattdessen speichert man sie in Datenbanken. Datenbanken ermöglichen es verschiedenen Anwendungen, gleichzeitig auf dieselben Daten zuzugreifen, ohne dass Konflikte entstehen. Sie können sehr große Datenmengen verwalten und organisieren diese in strukturierte Formate. Datenbanken sind wie folgt definiert:

📘 Definition: Datenbank

Unter einer Datenbank (DB) versteht man die logisch zusammengehörenden Daten, die von einem DBMS (Datenbankmanagementsystem) verwaltet werden

📘 Definition: Datenbanksystem

Datenbank und Datenbankmanagementsystem zusammen bezeichnet man als Datenbanksystem

Eine Datenbank umfasst alle logisch zusammengehörenden Daten, die von einem Datenbankmanagementsystem verwaltet werden. Das Datenbanksystem bezeichnet die Kombination aus Datenbank und DBMS. Zur Datenbank gehören neben den eigentlichen Nutzdaten auch alle verwaltungstechnischen Objekte wie Indizes und Logdateien, die das System für eine effiziente Verwaltung benötigt. Die langfristige Speicherung wird durch Persistierung gewährleistet, während Indexierung schnelle Suchvorgänge ermöglicht. Transaktionen sorgen für sichere Datenänderungen, und Logs dokumentieren alle Operationen nachvollziehbar.

Für Ingenieure bedeutet dies beispielsweise, dass Projektdaten, Kostenschätzungen und Zeitpläne zentral verwaltet werden können, wobei verschiedene Teammitglieder gleichzeitig arbeiten können, ohne dass Dateninkonsistenzen auftreten.

Dateien versus Datenbanken#

Bei dateibasierten Systemen strukturiert jede Anwendung ihre Daten individuell nach eigenen Anforderungen. Dies führt häufig zu Redundanzen und Inkonsistenzen, da dieselben Informationen in verschiedenen Formaten mehrfach gespeichert werden. Datenbanken lösen dieses Problem durch eine einheitliche Datenstruktur, auf die alle Anwendungen zugreifen. Das DBMS koordiniert alle Zugriffe und stellt sicher, dass Änderungen synchronisiert und protokolliert werden.

Ein praktisches Beispiel aus dem Bauingenieurwesen zeigt den Unterschied deutlich: Traditionell könnte die Buchhaltung Kostendaten in Excel verwalten, während die Projektleitung separate Zeitpläne in spezieller Software führt. Bei einem datenbankbasierten Ansatz greifen beide auf dieselbe zentrale Datenquelle zu, wodurch automatisch konsistente und aktuelle Berichte über Projektkosten und Fortschritt erstellt werden können.

Die Codd’schen Regeln#

Edgar Codd definierte neun grundlegende Prinzipien für Datenbanksysteme. Seine Motivation war es, klare, überprüfbare Kriterien zu definieren, die Datenbanken erfüllen müssen. Aus dieser Überprüfung leitete er präzise Regeln ab, die sicherstellen sollten, dass ein System Konsistenz, Datenunabhängigkeit und deklarativen Zugriff konsequent umsetzt.

  • Integration: einheitliche, nichtredundante Datenverwaltung

  • Operationen: Speichern, Suchen, Ändern

  • Katalog: Zugriffe auf Datenbankbeschreibungen im Data Dictionary

  • Benutzersichten: Jeder Nutzer sieht die Daten die er sehen darf in der Art wie er sie sehen möchte

  • Integritätssicherung: Korrektheit des Datenbankinhalts

  • Datenschutz: Ausschluss unauthorisierter Zugriffe, nur berechtigte Nutzer

  • Transaktionen: mehrere DB-Operationen als Funktionseinheit (ganz oder gar nicht)

  • Synchronisation: parallele Transaktionen koordinieren

  • Datensicherung: Wiederherstellung von Daten nach Systemfehlern

Datenbanktypen#

Über die Jahrzehnte haben sich unterschiedliche Datenbanktypen herausgebildet, die für unterschiedliche Daten und Anwendungen besonders geeignet sind.

Verteilung der Datenbanktypen

Relationale Datenbanken#

Relationale Datenbankmanagementsysteme dominieren seit den 1980er Jahren und basieren auf dem tabellenorientierten Datenmodell. Jede Tabelle besitzt ein festes Schema mit definierten Spalten und Datentypen. Diese starke Strukturierung macht relationale Datenbanken ideal für gut strukturierte Geschäftsdaten.

SQL dient als Standardsprache für alle Datenbankoperationen. Eine typische Anwendung ist eine Projektdatenbank mit Tabellen für Projekte, Mitarbeiter, Materialien und Kosten, wobei komplexe Abfragen wie “alle Projekte über Budget mit Laufzeit über sechs Monate” einfach realisierbar sind.

Populäre Systeme: Oracle, MySQL, Microsoft SQL Server, PostgreSQL, IBM Db2

NoSQL-Datenbanken#

NoSQL-Systeme verzichten auf das relationale Datenmodell und haben seit 2009 stark an Bedeutung gewonnen. Sie entstanden als Antwort auf die Herausforderungen moderner Webanwendungen, die hohe Skalierbarkeit, Fehlertoleranz und die Verarbeitung von Big Data erfordern. Besonders wichtig ist ihre Fähigkeit, semi-strukturierte Daten wie JSON zu handhaben, die sich nicht in ein starres Tabellenschema pressen lassen.

Populäre Systeme: MongoDB, CouchDB, Cassandra, Redis, Neo4j, Amazon DynamoDB, HBase, OrientDB

Dokumentenorientierte Datenbanken#

Document Stores bieten maximale Flexibilität durch schemafreie Organisation. Datensätze können völlig unterschiedliche Strukturen haben, Spalten können verschiedene Datentypen enthalten oder sogar Arrays aufnehmen. Die Verschachtelung ermöglicht hierarchische Datenstrukturen, die meist in JSON-Format dargestellt werden.

Für Umweltingenieure ist dies besonders wertvoll bei der Dokumentation von Umweltproben, wo verschiedene Standorte unterschiedliche Messparameter haben können. Ein Gewässerstandort könnte pH-Wert, Temperatur und Sauerstoffgehalt messen, während ein anderer zusätzlich Schwermetallkonzentrationen erfasst. Jeder Standort kann seine spezifische Datenstruktur in der dokumentenorientierten Datenbank abbilden.

Populäre Systeme: MongoDB, Amazon DynamoDB, Databricks, Azure Cosmos DB, Couchbase

Key-Value Datenbanken#

Key-Value Stores funktionieren ähnlich wie Python-Dictionaries und speichern einfache Schlüssel-Wert-Paare. Ihre Einfachheit macht sie attraktiv für ressourcenbegrenzte Systeme wie embedded PCs und für die schnelle Entwicklung von Web-Interfaces. Sie eignen sich besonders für Caching-Anwendungen und Session-Management.

In Smart-Building-Systemen können Sensordaten effizient als Key-Value-Paare gespeichert werden. Ein Temperatursensor in Raum 101 würde unter dem Schlüssel “Sensor_Raum_101_Temperatur” den aktuellen Wert speichern, was schnelle Zugriffe für die Gebäudesteuerung ermöglicht.

Populäre Systeme: Redis, Amazon DynamoDB, Azure Cosmos DB, Memcached, Hazelcast

Suchmaschinen-Datenbanken#

Diese spezialisierten NoSQL-Systeme sind für die Suche in Textinhalten optimiert. Sie unterstützen komplexe Suchbegriffe mit booleschen Operatoren, führen Volltextsuchen durch und können Wörter auf ihre Stammformen reduzieren. Die Ergebnisse werden nach Relevanz sortiert und können gruppiert werden, wobei die Suche auf mehrere Server verteilt werden kann.

Umweltbehörden profitieren besonders von solchen Systemen, wenn sie tausende von Gutachten, Berichten und Studien durchsuchbar machen müssen. Eine Suchanfrage nach Grundwasserkontaminationen in Industriegebieten würde alle relevanten Dokumente finden und nach ihrer Relevanz für die spezifische Fragestellung sortieren.

Populäre Systeme: Elasticsearch, Splunk, Solr, OpenSearch, MarkLogic

Graphdatenbanken#

Graph-Datenbanken modellieren Daten als Netzwerk von Knoten und Verbindungen, wodurch sie sich ideal für die Analyse von Beziehungen eignen. Sie ermöglichen Netzwerkanalysen, die Modellierung sozialer Strukturen und die Entwicklung von Empfehlungssystemen.

Bei Bauprojekten können Graphdatenbanken die komplexen Abhängigkeiten zwischen Infrastrukturelementen abbilden. In einer Stadtsanierung würden Knoten Straßen, Gebäude und Versorgungsleitungen repräsentieren, während die Verbindungen die Abhängigkeiten zwischen den Sanierungsarbeiten darstellen. Dies ermöglicht eine optimale Planung der Arbeitsreihenfolge.

Auswahlkriterien für Datenbanktypen#

Die Wahl des geeigneten Datenbanktyps hängt von mehreren Faktoren ab. Strukturierte Daten mit klaren Beziehungen eignen sich für relationale Datenbanken, während flexible oder sich ändernde Datenstrukturen NoSQL-Lösungen favorisieren. Skalierungsanforderungen spielen eine wichtige Rolle, ebenso wie die Komplexität der benötigten Abfragen.

Moderne Infrastrukturprojekte nutzen häufig mehrere Datenbanktypen gleichzeitig. Ein Smart-City-Projekt könnte relationale Datenbanken für Verwaltungsdaten, Graphdatenbanken für Verkehrsflussanalysen, Key-Value-Stores für Sensor-Caching und Suchmaschinen-Datenbanken für die Dokumentenverwaltung kombinieren.

Quiz#

--- shuffleQuestions: true shuffleAnswers: true --- ### Welche Python-Pakete werden zum Laden von CSV-Daten aus dem Internet verwendet? - [x] `urllib` und `pandas` - [ ] `requests` und `numpy` - [ ] `json` und `matplotlib` - [ ] `sqlite3` und `os` ### Was ist SQL? - [x] Eine Sprache zur Abfrage und Manipulation von Datenbanken - [ ] Ein Programm zur Datenvisualisierung - [ ] Eine Programmiersprache wie Python - [ ] Ein Datenformat wie JSON ### Was ist SQLite? - [x] Eine lokale relationale Datenbank ohne Server - [ ] Ein Cloud-Datenbank-Service - [ ] Ein NoSQL-Datenbanksystem - [ ] Ein Datenvisualisierungstool ### Sortiere die folgenden Zeilen für das Speichern einer Pandas-Tabelle in SQLite: ```python import sqlite3 import pandas as pd ``` 1. `df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})` 2. `con = sqlite3.connect("test.sqlite")` 3. `df.to_sql("tabelle", con, if_exists="replace")` ### Welcher Fehler steckt in diesem Beispiel? ```python con = sqlite3.connect("test.sqlite") df.to_sql("tabelle", con, if_exists="append") ``` - [ ] `sqlite3` ist nicht importiert - [ ] Der Datenbankname ist zu kurz - [x] Kein Fehler - der Code ist korrekt - [ ] `to_sql` existiert nicht ### Was macht der SQL-Befehl `SELECT * FROM baustellen;`? - [ ] Löscht alle Daten aus der Tabelle - [x] Gibt alle Spalten und Zeilen der Tabelle zurück - [ ] Erstellt eine neue Tabelle - [ ] Zählt die Zeilen in der Tabelle ### Wie führt man einen SQL-Befehl in Python aus? - [x] Mit `cur.execute(sql)` nach Erstellung eines Cursors - [ ] Mit `con.run(sql)` - [ ] Mit `sqlite3.query(sql)` - [ ] Mit `pd.sql(sql)` ### Sortiere die folgenden Zeilen für eine SQL-Abfrage: ```python con = sqlite3.connect("test.sqlite") ``` 1. `cur = con.cursor()` 2. `sql = 'SELECT * FROM tabelle;'` 3. `for row in cur.execute(sql):` 4. ` print(row)` ### Welcher SQL-Befehl filtert Baustellen mit Baubeginn ab 2023? - [ ] `FILTER baubeginn >= '2023-01-01'` - [x] `WHERE baubeginn >= '2023-01-01 00:00:00+01'` - [ ] `IF baubeginn >= '2023-01-01'` - [ ] `SELECT baubeginn >= '2023-01-01'` ### Wie verknüpft man mehrere Bedingungen in SQL? - [x] Mit `AND`, `OR`, `NOT` - [ ] Mit `&&`, `||`, `!` - [ ] Mit `+`, `-`, `*` - [ ] Mit `COMBINE`, `MERGE`, `JOIN` ### Welcher Fehler steckt in diesem SQL-Beispiel? ```sql SELECT * FROM baustellen WHERE baubeginn = '2023-01-01' AND bauende = '2024-01-01' ``` - [ ] `AND` ist nicht erlaubt - [ ] Datumsformat ist falsch - [x] Kein Fehler - der Code ist korrekt - [ ] `WHERE` muss am Ende stehen ### Was macht die SQL-Funktion `count(*)`? - [ ] Summiert alle Werte - [x] Zählt die Anzahl der Zeilen - [ ] Findet den Maximalwert - [ ] Berechnet den Durchschnitt ### Welche Aggregatfunktionen gibt es in SQL? - [x] `min()`, `max()`, `avg()`, `sum()`, `count()` - [ ] `first()`, `last()`, `middle()` - [ ] `add()`, `subtract()`, `multiply()` - [ ] `top()`, `bottom()`, `center()` ### Sortiere die folgenden Teile einer SQL-Aggregationsabfrage: 1. `SELECT sparte, count(*), avg(baudauer)` 2. `FROM baustellen` 3. `GROUP BY sparte` ### Was macht `GROUP BY sparte` in einer SQL-Abfrage? - [ ] Sortiert nach Sparte - [x] Fasst Zeilen mit gleicher Sparte zusammen - [ ] Filtert nach Sparte - [ ] Löscht doppelte Sparten ### Wie sortiert man Ergebnisse in SQL absteigend? - [ ] `SORT BY spalte DOWN` - [x] `ORDER BY spalte DESC` - [ ] `ARRANGE BY spalte REVERSE` - [ ] `DESCEND BY spalte` ### Was bewirkt `LIMIT 3` in einer SQL-Abfrage? - [ ] Begrenzt auf 3 Spalten - [x] Gibt maximal 3 Ergebniszeilen zurück - [ ] Sortiert die ersten 3 Einträge - [ ] Filtert nach Werten kleiner 3 ### Welcher Fehler steckt in diesem SQL-Beispiel? ```sql SELECT sparte, count(*) FROM baustellen ORDER BY count(*) GROUP BY sparte ``` - [x] `ORDER BY` muss nach `GROUP BY` stehen - [ ] `count(*)` kann nicht sortiert werden - [ ] `GROUP BY` ist falsch positioniert - [ ] Es fehlt ein `WHERE` ### Was macht ein `JOIN` in SQL? - [ ] Kombiniert Spalten einer Tabelle - [x] Verknüpft Daten aus mehreren Tabellen - [ ] Sortiert Tabellendaten - [ ] Löscht doppelte Einträge ### Warum verwendet man Tabellenpräfixe wie `b.spalte` bei JOINs? - [ ] Zur Verschönerung des Codes - [x] Zur eindeutigen Identifikation bei gleichnamigen Spalten - [ ] Zur Beschleunigung der Abfrage - [ ] Zur Fehlerbehandlung ### Was macht `DISTINCT` in einer SQL-Abfrage? - [ ] Sortiert die Ergebnisse - [ ] Begrenzt die Anzahl der Ergebnisse - [x] Entfernt doppelte Zeilen aus den Ergebnissen - [ ] Verbindet mehrere Tabellen ### Was ist der Unterschied zwischen INNER JOIN und LEFT JOIN? - [x] INNER JOIN gibt nur übereinstimmende Zeilen zurück, LEFT JOIN alle Zeilen der linken Tabelle - [ ] LEFT JOIN gibt nur übereinstimmende Zeilen zurück, INNER JOIN alle Zeilen der linken Tabelle - [ ] Es gibt keinen Unterschied, beide sind gleich - [ ] INNER JOIN ist schneller als LEFT JOIN ### Sortiere die folgenden Teile einer JOIN-Abfrage: 1. `SELECT b.spalte1, a.spalte2` 2. `FROM baustellen AS b` 3. `JOIN adressenliste AS a` 4. `WHERE b.id = a.id` ### Was ist der Unterschied zwischen verschiedenen JOIN-Typen? - [x] Sie bestimmen, welche Zeilen bei fehlenden Übereinstimmungen zurückgegeben werden - [ ] Sie beeinflussen die Geschwindigkeit der Abfrage - [ ] Sie ändern die Sortierung der Ergebnisse - [ ] Sie bestimmen die Anzahl der verknüpften Tabellen ### Welcher Fehler steckt in diesem JOIN-Beispiel? ```sql SELECT * FROM baustellen NATURAL JOIN adressenliste, gemeinden ``` - [ ] `NATURAL JOIN` existiert nicht - [ ] Zu viele Tabellen im JOIN - [x] Potentielle Kreuzverknüpfung durch mehrere Tabellen ohne explizite Bedingungen - [ ] Falsche Syntax bei `NATURAL JOIN`