SQL- & NoSQL-Datenbanken - Speichern und Analysen von großen Datenmengen Lennart Leist Inhaltsverzeichnis 1 Einführung 1.1 Aufgaben einer Datenbank . . . . . . . . . . . . . . . . . . . . . . 1.2 Geschichtliche Entwicklung der Datenbanken . . . . . . . . . . . 2 2 4 2 SQL-Datenbanken 2.1 Grundlagen . . . . . . . . . . . . . . . . . 2.2 Entity-Relationship-Modell . . . . . . . . 2.3 Zeilenorientierte Speicherung . . . . . . . 2.4 Transaktionen und A.C.I.D.-Eigenschaften 5 5 6 7 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 NoSQL-Datenbanken 9 3.1 Datenbanksysteme mit spaltenorientierter Speicherung . . . . . . 9 3.2 Objektdatenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.3 Dokumentorientierte Datenbanken . . . . . . . . . . . . . . . . . 10 3.4 Verteilte Datenbanksysteme, CAP-Theorem und BASE-Eigenschaften 11 1 1 Einführung Diese Arbeit dient dazu einen Überblick über die verschiedenen Datenbankmodelle zu geben. Die Datenbanksprachen werden hier nicht behandelt, mit Außnahme kurzer Beispiele zur Datenbanksprache SQL. 1.1 Aufgaben einer Datenbank Seit Verwendung der ersten Computer, welche Datenspeicher verwenden, entstehen täglich immer größere Datenmengen. Es werden Datenbanksysteme benötigt, um diese Daten strukturiert zu speichern und somit effizient nutzbar zu machen. Ein Zitat von Eric Schmidt (Google CEO) zeigt, wie groß diese Datenmengen in etwa sind: There was 5 exabytes of information created between the dawn ” of civilization through 2003, but that much information is now created every 2 days, and the pace is increasing.“ Zu Anfang des digitalen Zeitalters stand man vor dem Problem, dass die Datensätze zur Verwendung an die Anwendungen angepasst werden mussten. Diese Anpassungen sind meist aufwendig und zeitintensiv. Die Abbildungen 1.1.1 und 1.1.2 zeigen, wie dieses Problem mithilfe von Datenbanken (Abk.: DB) umgangen wird. Abb. 1.1.1: Ohne Datenbank. Datenbank B ist eine umgewandelte Version von Datenbank A, um sie für Anwendung B verwendbar zu machen. Sie enthalten identische Informationen 2 Abb. 1.1.2: Mit Datenbank. Die Abfrage der Anwendungen werden an das Datenbankmanagementsystem gesendet, es dient als Schnittstelle zwischen den Anwendungen und der Datenbank. Eine Anpassung der Datenbank an die Anwendungen ist nicht mehr nötig. Das Datenbanksystem lässt sich in zwei Funktionen einteilen. Zum einen das Datenbankmanagementsystem (Abk.: DBMS), welches die Schnittstelle zwischen Anwendungen und Datenbank bildet. Wie das DBMS gestaltet ist hängt vorallem vom gewünschten Datenbankmodell ab. Die wichtigsten Aufgaben des DBMS sind speichern, überschreiben, löschen und lesen von Daten aus der Datenbank. Außerdem kann es für die Datensicherheit eingesetzt werden. Zum anderen die Datenbank in der die Daten strukturiert gespeichert sind. Wie diese Struktur aussieht hängt vom DBMS ab. 3 1.2 Geschichtliche Entwicklung der Datenbanken In den 1960er-Jahren entstanden die ersten Datenbanksysteme, so z.B. das Netzwerkdatenbankmodell und das hierarchische Datenbankmodell. Beide Datenbankmodelle sind heutzutage wenig verbreitet. Das hierarchische Datenbankmodell entspricht in etwa dem Ordnersystem mancher Betriebssysteme (z.B. Windows). In den 1970er-Jahren entwickelte Edgar F. Codd ein relationales DBMS mit dem Namen System R“. Die Datenbanksprache SQL beruht auf diesem ” relationalen DBMS. 1979 erschien auf dem Markt die erste Datenbank-Software, welche die Datebanksprachhe SQL verwendete. In Kapitel 2 wird das relationale DBMS und die Sprache SQL näher behandelt. SQL ist heutzutage eine sehr verbreitete Datenbanksprache und wird stets weiterentwickelt. Es gibt jedoch Anwendungen für die andere Datenbanksysteme vorteilhafter sind. Diese nicht-relationalen Datenbanken werden seit 2009 mit dem Sammelbegriff NoSQL-Datenbanken bezeichnet. Diese Datenbanksysteme werden in Kapitel 3 behandelt. Wichtige Vertreter dieser Gruppe sind Google Big Table und Amazon Dynamo. Die sehr verbreiteten Anwendungen Google-Suche und Google-Maps verwenden Google Big Table. Der Amazon-Shop verwendet für die Bestellungen und Produkte das System Amazon Dynamo. 4 2 SQL-Datenbanken Dieses Kapitel befasst sich mit den relationalen Datenbanken und der Datenbanksprache SQL, welche auf der relationalen Datebankstruktur basiert. Die Datenbanksprache SQL selbst wird dabei nicht ausführlich behandelt. 2.1 Grundlagen Relational“bedeutet einfacher ausgedrückt in einer Verbindung bzw. Bezie” ” hung stehen“. Diese Verbindung bzw. Beziehung kann man in zwei-dimensionalen Tabellen darstellen, welche auch Relationen genannt werden. Als Beispiel dient Abb. 2.1.1, welche die Relation Studentennamen “zeigt: ” Abb. 2.1.1: Darstellung einer relationalen Datenbank als Tabelle Die einzelnen Zeilen werden als Tupel bezeichnet, jeder Tupel enthält Informationen zu einem Objekt/Entität. In diesem Beispiel enthält jeder Tupel Informationen zu einer bestimmten Person. Die Spalten werden als Attribute bezeichnet. Zur eindeutigen Unterscheidung der Tupel ist es sinnvoll ein Schlüsselattribut einzuführen. Die zusätlichen Daten, welche durch dieses Schlüsselattribut anfallen, möchte man jedoch wenn möglich umgehen, um Speicherplatz zu sparen. Eine alternative Methode stellt das Identifizieren der Tupel durch mehrere Attribute dar. Beispielsweise kann durch die Attribute Nachname, Vorname und Geburtsdatum ein Tupel quasi eindeutig identifiziert werden. Die Datenbanksprache SQL ist die am häufigsten verwendete Sprache, um mit relationalen Datenbanken zu arbeiten. SQL ist der englischen Umgangssprache sehr ähnlich und daher leicht zu verstehen. Eine der wichtigsten Operationen ist die Abfrage von bestimmten Daten. Um die vollständige Relation Studen” tennamen “aus Abb. 2.1.1 ausgeben zu lassen, genügt folgender Befehl: Abb. 2.1.2: Abfrage der Relation Studentennamen Die erste Zeile des Befehls gibt die Anweisung, dass die vollständige Tabelle ausgegeben werden soll. Die zweite Zeile gibt an welche Tabelle ausgegeben wer5 den soll. Das Semikolon markiert das Ende des Befehls. Um nur eine bestimmte Spalte einer Relation ausgeben zu lassen, verwendet man folgenden Befehl: Abb. 2.1.3: Abfrage der Spalte Namename aus der Relation Studentennamen Da sich diese Ausarbeitung nicht mit Datenbanksprache befasst, sollte dieser kurze Eindruck zur Datebanksprache SQL genügen. In der Regel bestehen relationale DB aus mehreren Relationen, welche durch Join-Verbindungen verbunden werden. Join-Verbindungen werden u.a. verwendet, um Redundanzen (=mehrfaches Abspeichern gleicher Informationen) und Anomalien (=leere Einträge) zu vermeiden. Redundanzen sind unerwünscht, da durch sie Speicherplatz verbraucht wird und Anomalien sollten vermieden werden, da sie bei Operationen Fehler hervorrufen können. Bei vielen JoinVerbindung kann es dazu kommen, dass einfache Befehle zu komplexen und aufwendigen Operationen werden. Daher ist es wichtig eine Datenbank gut zu planen. 2.2 Entity-Relationship-Modell Mit dem Entity-Relationship-Modell werden Datenbankstrukturen schematisch dargestellt. Das Prinzip ist sehr einfach und lässt sich am besten anhand eines Beispiels erklären. Dazu verwenden wir die Relation Studentennamen “und ” fügen zwei neue Relationen hinzu: Abb. 2.2.1: Die Relationen Studentennamen “und Fach “ ” ” Die Relationen Studentennamen “und Fach “sind zwei eigenständige Rela” ” tionen und werden rechteckig umrandet. Die Relation belegt “verbindet diese ” zwei Relationen und wird deshalb mit einer Raute umrandet. Bei den zwei eigentständigen Relationen fügt man außerdem hinzu, welche Attribute sie enthalten. Die Attribute werden umkreist und das Schlüsselattribut der Relation wird zusätzlich unterstrichen. An den Verbindungslinien der Relationen wird gekennzeichnet in welchem Verhältnis die Relationen stehen. Bei dem verwendeten Beispiel stehen die Relationen Studentennamen “und Fach “in einem n:m ” ” Verhältnis. Für des Beispiel erhält man folgendes Entity-Relationship-Modell: 6 Abb. 2.2.2: Das Entity-Relationship-Modell zum genannten Beispiel Das Entity-Relationship-Modell ist sehr nützlich, um relationale Datenbanken zu planen. 2.3 Zeilenorientierte Speicherung Bei der Speicherung einer Datenbank werden die Informationen der zweidimensionalen Relationen auf einen eindimensionalen Speicher (z.B. Festplatte) abgespeichert. Bei SQL-Datenbanken wird dafür die zeilenorientierte Speicherung verwendet. Die Relation Studentennamen “würde beispielsweise in folgender ” Reihenfolge abgespeichert werden: Abb. 2.3.1: Zeilenorientierte Speicherung der Relation Studentennamen “ ” Die Kommata trennen symbolisch die Attribute der Tupel und die Semikola trennen die einzelnen Tupel. Diese Art der Speicherung hat aufgrund der Lokalität der Daten Vor- und Nachteile, so z.B.: • Ganze Tupel lassen sich schnell bearbeiten und auslesen • Neue Tupel können mit wenig Aufwand hinzugefügt werden • Einzelne Spalten auszulesen ist aufwendig (→ schlecht für Analysen) • Hinzufügen neuer Attribute ist sehr komplex 7 2.4 Transaktionen und A.C.I.D.-Eigenschaften Unter einer Transaktion versteht man das Durchführen zusammengehörender Programmschritte, welche den Datenbestand einer Datenbank verändern. Abb. 2.4.1 zeigt ein Beispiel für eine Transaktion. Bei dieser Transaktion handelt es sich um die Rückgabe von Buch 2 “, das der Student def “ausgeliehen hat. ” ” Die Relation auf der linken Seite hat den Namen Verfügbarkeitsstatus “und ” die Relation auf der rechten Seite wird mit ausgeliehen “bezeichnet. ” Abb. 2.4.1: Beispiel für eine Transaktion Diese Transaktion besteht aus einzelnen Teiltransaktionen: • In der Relation Verfügbarkeitsstatus “muss das Attribut Status von Buch ” 2 zu verfügbar “geändert werden ” • In der Relation ausgeliehen “muss der zu Buch 2 gehörende Eintrag ” gelöscht werden Um Fehler bei Transaktionen zu vermeiden, müssen diese die A.C.I.D.Eigenschaften erfüllen. • Atomicity: Transaktion wird ganz oder gar nicht ausgeführt • Consistency: Daten müssen nach Transaktion konsistent sein • Isolation: Gleichzeitig ausgeführte Transaktionen dürfen sich nicht beeinflussen • Durability: Die durchgeführten Veränderungen müssen dauerhaft sein Unter der Eigenschaft konsistent versteht man bei relationalen Datenbanken, dass alle Attribute einen erlaubten Wert besitzen und die Schlüsselattribute eindeutig sind. Es können auch eigene Konsistenzkriterien eingeführt werden. 8 3 NoSQL-Datenbanken In diesem Kapitel werden Datenbanksysteme behandelt, welche zu der Gruppe der NoSQL-Datenbanken gehören. Diese Datenbanken verfolgen ein nichtrelationales Konzept. Grund für die Entwicklung nicht-relationaler Datenbanksysteme ist, dass relationale Datenbanken für manche Anwendungsbereiche nachteilig sind. In der Regel verwenden NoSQL-Datenbanken keine Joins, wie es bei relationalen Datenbanken der Fall ist. Im Folgenden werden verschiedene NoSQL-Datenbanktypen vorgestellt. Anschließend folgen die Themen Verteil” te Datenbanksysteme “ CAP-Theorem “und BASE-Eigenschaften “. ” ” 3.1 Datenbanksysteme mit spaltenorientierter Speicherung Bei Datenbanken mit spaltenorientierter Speicherung werden nacheinander die einzelnen Spalten abgespeichert. Dadurch befinden sich die Daten einer Spalte im Speicher nah beieinander. Somit sind die einzelnen Tupel nicht am Stück abgespeichert. Die Tabelle aus Abb. 2.1.1 würde bei spaltenorientierter Speicherung folgendermaßen im Speicher gespeichert werden: Abb. 3.1.1: Spaltenorientierte Speicherung der Relation Studentennamen “aus ” Abb. 2.1.1 Diese Art der Speicherung hat Vor- und Nachteile: • Die Einträge einer gesamten Spalte können schnell geändert werden (Beispiel: Gehaltserhöhung aller Mitarbeiter) • Analysen, welche die Daten einzelner Spalten benötigen, können schneller durchgeführt werden • Es kann eine bessere Datenkompression möglich sein, aufgrund der Ähnlichkeit der Einträge einer Spalte • Das Verwenden und Bearbeiten einzelner Tupel ist langsamer Bekannte Datenbanken mit spaltenorientierter Speicherung sind u.a. Goo” gle Big Table “und SAP Hana “, wobei letztere gleichzeitig zeilenorientierte ” Speicherung verwendet (→ Hybrid). 9 3.2 Objektdatenbanken Bei z.B. relationalen Datenbanken werden Objekte aus der Realität auf die verwendeten Attribute projiziert, dadurch beinhalten die einzelnen Einträge Werte. Diese Methode ist ungeeignet, wenn man Objekte (im Sinne der Informatik) abspeichern möchte, da diese zusätzlich Mehtoden “besitzen. ” Abb. 3.2.1: Unterschied zwischen Objektdatenbanken (oben) und relationalen Datenbanken (unten) Quelle: http://wikis.gm.fh-koeln.de/wiki_db/Datenbanken/Objektdatenbank Dieses Konzept ermöglicht objektorientierten Anwendungen, dass sie Objekte abrufen und speichern können. 3.3 Dokumentorientierte Datenbanken Bei dokumentorientierten Datenbanken werden einzelne Dokumente abgespeichert. Der Inhalt der Dokumente ist nich vorgegeben, da jedes Dokument als Einheit angesehen wird. Es besteht keine Relation zwischen den Dokumenten.Jedes Dokument besitzt einen Identifikator. Ein Identifikator ist vergleichbar mit einer Adresse, wie man sie von Häusern kennt. Folgende Abbildung zeigt ein Beispiel für ein solches Dokument: Abb. 3.3.1: Beispiel für eine Dokument einer dokumentorientierten Datenbank Quelle: http://wikis.gm.fh-koeln.de/wiki_db/uploads/Datenbanken/ DokumentenorientierteDatenbank/bsp_dokument.png 10 3.4 Verteilte Datenbanksysteme, CAP-Theorem und BASEEigenschaften Ein verteiltes Datenbanksystem besteht aus mehreren Servern bzw. Knoten. Viele NoSQL- und SQL-Datenbanktypen unterstützen diese Funktion (z.B. Oracle Database). Daten werden in mehrfacher Ausführung auf den verschiedenen Knoten gespeichert. Sie können sich aber hinsichtlich ihrer Aktualität unterscheiden. Für verteilte Datenbanksysteme wurde im Jahre 2000 das CAP-Theorem aufgestellt. Das CAP-Theorem besagt, dass nur zwei der drei folgenden Eigenschaften erfüllt werden können: Abb. 3.4.1: Grafik zum CAP-Theorem • (C) Konsistenz: Die Daten aller Knoten sind auf dem aktuellsten Stand. • (A) Verfügbarkeit: Alle Anfragen an das Datenbanksystem können schnell beantwortet werden. • (P) Partitionstoleranz: Ausfälle einzelner Knoten beeinträchtigen nicht die Funktion des Datenbanksystems. Für den Begriff Konsistenz “existieren zwei Definitionen (siehe Kapitel 2.4). ” Das System Amazon Dynamo legt sehr viel Wert auf Verfügbarkeit und Partitionstoleranz, da hohe Wartezeiten schlecht bei den Kunden ankommt. Die Datenbanksysteme der Banken müssen vorallem Konsistenz und Partitionstoleranz bieten. In Anlehnung an die A.C.I.D-Eigenschaften für Transaktionen bei relationalen Systemen, gibt es die B.A.S.E-Eigenschaften bei verteilten Systemen: Daten sind stets abrufbar aus der Datenbank, wobei nicht garantiert ist, dass sie sich im aktuellsten Zustand befinden, aber sie werden nach und nach aktualisiert, sodass in absehbarer Zeit Konsistenz erreicht wird. 11