Karriere
Wissen
Über uns
24. Mai 2024
Relationale Datenbankmanagementsysteme verwenden SQL, um Tabellen und Daten zu verwalten und ermöglichen die effiziente Speicherung und Abfrage von Informationen.
Im Rahmen des Cross-Company-Programms haben wir bei Marco Lehmann (Fachhochschule OST) einen Workshop zum Thema Datenbanken besucht. Die wichtigsten Erkenntnisse aus dem ersten Teil haben wir für euch hier zusammengefasst.
Relationale Datenbankmanagementsysteme (RDBMS) sind Datenbankserver, die Tabellen und die darin gespeicherten Daten verwalten. Eine Datenbank kann aus mehreren Tabellen (Relationen) bestehen, die wiederum mehrere Spalten (Columns/Attribute) und Zeilen (Rows/Tupel) haben kann. Dabei bezeichnet man eine Auswahl von Spalten als Projektion. Ausserdem unterscheidet man zwischen den beiden Begriffen „Daten“ und „Datenbankstruktur“. Während sich Ersterer auf den Inhalt einer Tabelle bezieht, bezeichnet Letzterer den Aufbau der gesamten Datenbank und die Relationen der unterschiedlichen Tabellen zueinander. Zur Veranschaulichung sehen wir unten zwei Bilder, die die Tabelle „authors“ mit Daten von verschiedenen Buchautoren (links) und die Datenbankstruktur der gesamten Datenbank (rechts) zeigen. Auf diese Datenbank wird nachfolgend in einigen Beispielen zurückgegriffen.
Die Abfragesprache SQL (Structured Query Language) ist seit vielen Jahren das „Arbeitspferd“ im Umgang mit Daten. Sie wurde speziell für Datenbanken entwickelt, ist (mehr oder weniger) standardisiert und ermöglicht das Arbeiten mit einem Datenbankserver. Es folgt eine Übersicht über die wichtigsten Operationen und dazugehörigen Befehle in SQL. Die Beispiele beziehen sich auf die Datenbank, die im Bild zur Datenstruktur dargestellt ist.
Daten selektieren mit SELECT Beispiel: Alle Zeilen und Spalten aus der Tabelle „authors“ selektieren
SELECT * FROM authors
Projektionen Beispiel: Projektionen – Nur Spalten „au_fname“ und „au_lname“ selektieren
SELECT au_fname, au_lname FROM authors
Spalte mit Alias selektieren Beispiel: Spalte mit Alias selektieren
SELECT au_fname as Vorname FROM authors
SELECT DISTINCT au_fname, au_lname FROM authors
Beachte: Der Befehl bezieht sich auf die ganze Projektion, das heisst jedes Tupel muss eindeutig sein, nicht die einzelnen Attribute.
Daten sortieren mit ORDER BY Beispiel: Spalten „au_fname“ und „au_lname“ selektieren und aufsteigend (absteigend) nach „au_fname“ sortieren
SELECT au_fname, au_lname FROM authors ORDER BY au_fname ASC (DESC)
Daten filtern mit WHERE Beispiel: Alle Autoren mit Vorname Paddy selektieren
SELECT * FROM authors WHERE au_fname=‘Paddy‘
Beachte: Der Filter bezieht sich auf die gesamte Tabelle, nicht auf die SELECT-Auswahl
Aggregieren mit GROUP BY und COUNT, MIN, MAX, AVG, etc. Beispiel: Anzahl Autoren pro Staat auflisten
SELECT state, COUNT(*) FROM authors GROUP BY state
SELECT title_name, pub_name FROM titles JOIN publishers ON titles.pub_id = publishers.pub_id WHERE title_name = ‚Exchange of Platitidues‘
Gute, saubere Daten sind eine Voraussetzung für fehlerfreie Anwendungen, gute Wartbarkeit und effiziente Analysen. Um eine Datenbank so zu modellieren, dass keine Redundanzen auftreten, können wir sie in die sogenannte Normalform bringen. Um die Definition der ersten, zweiten und dritten Normalform zu verstehen, müssen wir zuerst folgende Definitionen betrachten:
Eine Tabelle ist in erster Normalform (1NF), wenn alle Attributwerte atomar sind, d. h. nicht mehr weiter aufteilbar sind.Beispiel: Ein Attribut namens „Adresse“ mit Werten der Form XXXX Ort (z. B. 8001 Zürich) kann aufgeteilt werden in zwei Attribute „PLZ“ und „Ort“.
Folgende Tabelle ist dann in 1NF.
Eine Tabelle ist in zweiter Normalform (2NF), wenn sie in 1NF ist und folgendes zutrifft:
Beispiel: Bank hängt nicht vom ganzen Schlüssel {Konto_Nr, BankID} ab, sondern nur vom Teilschlüssel {BankID}.
Die zweite Normalform wird erreicht, indem die Tabelle in diese Entitäten zerlegt wird.
Redundanz wurde entfernt: Raiffeisen kommt nur noch einmal vor.
Die dritte Normalform ist genau dann erreicht, wenn sich das Relationsschema in der 2NF befindet und kein Nichtschlüsselattribut von einem Schlüsselkandidaten transitiv abhängt. Anders ausgedrückt: ein Nichtschlüsselattribut darf nicht von einer Menge aus Nichtschlüsselattributen abhängig sein. Ein Nichtschlüsselattribut darf also nur direkt von einem Primärschlüssel (bzw. einem Schlüsselkandidaten) abhängig sein.
Beispiel: Das Nichtschlüsselattribut „Inhaber_PLZ“ hängt vom PK (primary key) ab, das Nichtschlüsselattribut „Inhaber_Ort“ hängt vom Nichtschlüsselattribut „Inhaber_PLZ“ ab und „Inhaber_Ort“ hängt somit transitiv (indirekt) vom PK ab.
Die 3NF wird erreicht, indem die Relation aufgeteilt wird, wobei die voneinander abhängigen Daten in eine eigene Tabelle ausgelagert werden. Der Schlüssel der neuen Tabelle muss als Fremdschlüssel in der alten Tabelle erhalten bleiben.
Jede der drei Tabellen ist in 1NF, 2NF und 3NF.
Der Entwurf der Datenbank spielt bei der Entwicklung von Informationssystemen eine zentrale Rolle. Der erste Analyseschritt beinhaltet die Modellierung der Information. Das sogenannte Entity-Relationship-Model (ERM) ist eine Darstellung, mit der Daten semantisch beschrieben werden können. Diese Beschreibung ist unabhängig von der eingesetzten Technologie; das ERM wird erst in einem nächsten Schritt auf das relationale Modell (RM) abgebildet (siehe nächstes Kapitel).
Welche «Gegenstände» sind für die Applikation wichtig (Entitäten)?
An folgendem Diagramm können die Grundbegriffe des ERMs veranschaulicht werden.
Beachte jeweils die spezifische Form des Objekts. Wir können Folgendes definieren:
Im Folgenden wird es darum gehen, wie man nach der Informationsmodellierung mit dem ERM, letzteres in eine relationale Datenbank (RM) implementiert. Während die Informationsmodellierung, also das Erstellen des ERMs, anspruchsvoll und nicht immer eindeutig ist, ist die Abbildung desselben in ein relationales Datenbankmodell einfach und kann kochbuchartig erfolgen. Es gelten folgende Regeln:
Datenbanken können nicht nur Daten speichern und SQL ausführen, sondern es kann auch datenbankseitig programmiert werden, beispielsweise um Regeln zu implementieren oder Daten zu normalisieren. Nachfolgend werden einige DB-Objekte erklärt.
Sequenzen sind Zähler, die bei jedem Aufruf garantiert einen eindeutigen Wert zurückgeben. Beispielsweise wird bei einem INSERT in eine Tabelle mit einem künstlichen Schlüssel der neue Schlüssel aus einer Sequenz eingelesen, wie in folgendem Beispiel dargestellt.
CREATE SEQUENCE SEQ_PK_Club START WITH 1 SELECT NEXT VALUE FOR SEQ_PK_Club SELECT NEXT VALUE FOR SEQ_PK_Club -- DROP SEQUENCE SEQ_PK_Club INSERT INTO Club (id, name, logo) VALUES (NEXT VALUE FOR SEQ_PK_Club, 'Olympique Lyonnais', 'some link')
Eine View ist eine gespeicherte Abfrage (SELECT Statement), welche das Abspeichern und einfaches Wiederverwenden häufig verwendeter Abfragen oder komplizierter JSONs ermöglicht.
Betrachte folgendes SELECT-Statement:
SELECT s.id, s.name, c.club_name FROM Spieler AS s INNER JOIN Club AS c ON s.club_id = c.id
Diese kann wie folgt als View gespeichert werden:
CREATE VIEW V_SpielerClub AS SELECT s.id, s.name, c.club_name FROM Spieler AS s INNER JOIN Club AS c ON s.club_id = c.id
Und dann wie ein TABLE angewendet werden:
SELECT * FROM V_SpielerClub WHERE club_name = 'Olympique Lyonnais'
Beachte, dass Abfragen auf eine View langsam sein können, je nach Komplexität der Abfrage, die sich hinter ihr verbirgt. Beispielsweise kann ein komplexer Join zu einer langsamen Abfrage führen.
Die «materialized» View ermöglicht effizienteres Abfragen als die normale View. Im Gegensatz zur Letzteren, wo nur die Abfrage selbst gespeichert wird, nicht aber die Resultate der Abfrage, speichert die «materialized» View auch die Resultate.
Weitere DB-Objekte sind:
In vielen Situationen sind RDBMS die richtige Lösung und es braucht keinen NoSQL-Ansatz. Aber:
OR-Mapper werden verwendet, um Objekte einer in einer objektorientierten Sprache geschriebene Anwendung in eine relationale Datenbank zu speichern. Das zugrundeliegende Problem, das beim Verbinden der zwei Welten (OOP und RM) auftritt wird als „object-relational impedance mismatch“ bezeichnet. Bezüglich der Probleme mit verteilten Systemen (Konsistenz, Verfügbarkeit) betrachten wir nachfolgend das CAP-Theorem.
CAP steht für
Das CAP-Theorem besagt nun, dass es in einem verteilten System nicht möglich ist, alle drei Eigenschaften gleichzeitig zu garantieren – nur zwei dieser drei Eigenschaften können jeweils gleichzeitig garantiert werden. Es können also beispielsweise folgende Kombinationen auftreten:
Laut CAP-Theorem muss man also in jedem verteilten System davon ausgehen, dass Nachrichten verloren gehen oder Netzwerkverbindungen ausfallen. Eine verteilte Anwendung muss immer Partition-tolerant gebaut sein, was einem, wie oben erwähnt, die Wahl zwischen CP und AP lässt.
Entscheidet man sich dabei für AP, kann man die ACID-Eigenschaften von Transaktionen nicht mehr einhalten. Das heisst aber nicht, dass man gar keine Konsistenz mehr hat. So orientieren sich verteilte NoSQL-Systeme an den sogenannten BASE-Eigenschaften. Diese stehen für:
Danke für Ihr Interesse an Cudos. Ihre Angaben werden vertraulich behandelt – den Newsletter können Sie jederzeit abbestellen.