Relationale versus dokumentbasierte Datenbankenmodelle und deren Einsatz

Lesedauer ca. 6 min
 
Relationale Datenbanken wurden jahrzehntelang als optimale Lösung für die Verwaltung von Daten angesehen. Nicht umsonst stellen Datenbank-Managementsysteme, wie beispielsweise MySQL oder PostgreSQL, heute noch die Basis für zahlreiche Softwareprojekte dar. Das immer größer werdende Volumen und die gigantische Vielfalt an Daten, die moderne Informationssysteme ausmachen, haben einen neuen Ansatz für die Verwaltung von Daten ins Leben gerufen. Die Rede ist von nichtrelationalen Datenbanksystemen. Diese verteilten Systeme zur Datenspeicherung - wie das im Jahr 2009 veröffentlichte MongoDB - sind dokumentenorientiert und werden auch als NoSQL- Datenbank-Managementsysteme (Not Only SQL) bezeichnet, wobei sich SQL (Structured Query Language) auf die traditionelle Abfragesprache der relationalen Datenbanken bezieht.
 
Eine NoSQL Datenbank stellt zwar höhere Ansprüche an die Anwendungslogik, bietet jedoch gleichzeitig eine erhöhte Flexibilität beim Umgang mit Daten und erlaubt auf einfache Art die bestehenden Arbeitsprozesse und den Datenbestand auf eine Vielzahl von Servern zu verteilen, wodurch Datenbanksysteme wie MongoDB nahezu unbegrenzt horizontal skalierbar sind.
 
Was ist MongoDB ?
 
Bei MongoDB handelt es sich um die aktuell beliebteste frei erhältliche NoSQL Datenbank. Sie wurde vom Unternehmen „10gen“ entwickelt und im Jahr 2009 erstmals der breiten Öffentlichkeit zugänglich gemacht. Die Datenbank hat sich binnen kürzester Zeit als die meist genutzte NoSQL Datenbank etabliert. 10gen hat mit MongoDB Inc. einen neuen Namen bekommen, inzwischen börsennotiert und bietet heute neben der freien Variante zusätzlich kommerzielle und gehostete Versionen an.
 
Die Datenbank ist in der Programmiersprache C++ entwickelt und speichert Daten im BSON-Format (Binary JSON), welches stark an das JSON-Format angelehnt ist. MongoDB ist auf allen aktuellen Betriebssystemen (Windows, Linux, Mac) lauffähig. Es bietet eine native Unterstützung für alle JavaScript-Datentypen und stellt aus diesem Grund die ideale Datenbank für den Einsatz in Kombination mit Node.js dar. Die NoSQL Datenbank verfügt über eine oder mehrere Datensammlungen, die unterschiedliche Dokumente verwalten. Im Vergleich zu Relationen in relationalen Datenbanken, die eine feste Struktur aufweisen müssen, können diese Dokumente beliebig viele und verschiedenartige Felder enthalten.
 
Die Verbindung zu einem MongoDB-Datenbankserver lässt sich auf unterschiedliche Weisen realisieren. Überall vorhanden, aber auch nicht sehr bedienerfreundlich, ist die sogenannte „Mongo Shell“. Hierbei handelt es sich um einen Client, der die Verwaltung über Kommandozeile ermöglicht.  Um die gespeicherten Daten visuell darstellen und verwalten zu können, werden auch diverse Nutzeroberflächen bereitgestellt, wie zum Beispiel das frei erhältliche Robo3T oder auch das kommerzielle Studio3T. Ebenfalls gibt es für gängige Entwicklerwerkzeuge wie IntelliJ oder Visual Studio Code entsprechende Plugins.
 
Relationale versus dokumentbasierte Datenbankenmodelle im Vergleich
 
MongoDB basiert im Gegensatz zu relationalen Datenbanken auf einem dokumentbasierten Ansatz. Dieser orientiert sich bei der Speicherung der Daten an einem ganz anderen Prinzip, wobei die Grundkonzepte zwischen den dokumentbasierten und relationalen Datenbanken gewisse Ähnlichkeiten aufweisen:
 
  • Anstatt in Relationen (Tabellen), speichern dokumentenbasierte Datenbanken die Daten in sogenannten Collections (Sammelmappen)
  • Die Zeilen werden durch Dokumente im BSON-Format ersetzt.
  • Ein Feld stellt dabei immer ein Paar dar. Ein solches Paar setzt sich aus einem Schlüssel, der zugleich auch den Namen des Feldes darstellt, und einem Wert zusammen. Dieser Wert kann für eine Zeichenkette, eine Zahl, einen Text oder auch für komplette Dateien sowie Listen von Zahlen und Zeichenketten stehen.
 
Ein NoSQL-Dokument stellt damit eine Sammlung von Schlüssel-Werte-Paaren dar, grundsätzlich analog zur Tabellenzeile in einer SQL Datenbanktabelle. Der wesentliche Unterschied zwischen diesen beiden Systemen spiegelt sich in der Tatsache wider, dass dokumentbasierte Datenbanken kein festes Schema haben.  Denn im Gegensatz zu MongoDB müssen in einer relationalen Datenbank  alle Zeilen einen identischen Aufbau haben. Konkret bedeutet das, dass sie die gleiche Anzahl an Werten mit den jeweils gleichen Datentypen sowie Restriktionen haben.
 
Die einzelnen Dokumente in einer NoSQL Datenbank besitzen hingegen eine eigene, individuelle Struktur. Auf diese Weise können Entwickler bei Bedarf jederzeit neue Felder mit beliebigen Werten hinzufügen, was bei relationalen Datenbanken, wie PostgreSQL oder MySQL, eine explizite Umgestaltung des Schemas benötigt. Innerhalb eines Dokuments muss zwar der Schlüssel einzigartig sein, er kann aber auch in anderen Dokumenten genutzt werden. Bei relationalen Datenbanken ist dies nicht möglich, da Primär- (PK) und Fremdschlüssel (FK) stets einzigartig sein müssen, um Relationen (JOINS) zwischen den einzelnen Tabellen zu realisieren. Bei einer NoSQL Datenbank werden diese Verhältnisse optional in Form von Referenzen oder eingebetteten Dokumenten geregelt.
 
Eine Datenmigration lässt sich bei MongoDB äußerst einfach realisieren. Eine Schemamigration ist in der Regel nicht nötig, es sei denn, dass das JSON-Schema zu Beginn explizit festgelegt wurde - was von MongoDB inzwischen unterstützt wird. Relationale Datenbanken benötigen hingegen eine explizite SQL Migration, die in der Regel durch mittels spezieller Tools realisiert wird. Die Ausführung einer SQL Migration kann eine gewisse Komplexität mit sich führen. Aus diesem Grund kommt der Ausarbeitung eines detaillierten Plans für die Datenmigration eine besonders wichtige Rolle zu. Alle wichtigen Systeme sollten während der Migration eine möglichst geringe Downtime haben. Hier sind nicht-destruktive Migrationen wichtig.
 
Einsatzszenarien für dokumentenbasierte Datenbanken
 
Dokumentenbasierte Datenbanksysteme stellen immer dann eine gute Wahl dar, wenn Sie Webprojekte möglichst schnell und effizient umsetzen oder ein sogenanntes „Minimum Viable Product“ (MVP) entwickeln möchten, um iterativ aus Nutzerfeedback zu lernen und das Produkt an die tatsächlichen Bedürfnisse der Kunden anzupassen. MVP und Projekte mit sehr großen unstrukturierten Datenmengen sind einige der Einsatzgebiete, wo dokumentbasierte Datenbanken ihr volles Potenzial entfalten können.
 
Die dokumentbasierte Speicherung von Daten, die kein festes Schema benötigen, eignet sich optimal für heterogene Datentypen, die schnell gespeichert, verarbeitet und verwaltet werden müssen. Solche Datenbanksysteme zeichnen sich außerdem wie eingangs erwähnt durch eine nahezu unbegrenzte horizontale Skalierung aus. NoSQL Datenbanken lassen sich schnell und einfach auf mehrere Server verteilen, ohne dass dabei die Funktionsfähigkeit beeinträchtigt wird. Neue Server können bei Bedarf jederzeit hinzugefügt werden.
 
Um die Sicherheit und Verfügbarkeit der Daten sicherzustellen, ist eine NoSQL Datenbank in der Lage, Kopien des gesamten Datenbestandes schnell und einfach zu erstellen und auf speziellen Backup-Servern bereitzustellen. Auch bei der Konsolidierung verschiedener Datenmengen aus einer oder mehrere Quellen sowie bei der Datenmigration können dokumentorientierte Datenbanken ihr volles Potenzial entfalten und bieten im Vergleich zu relationalen Datenbanksystemen hier Vorteile.
 
Fazit
 
Der Einsatz einer dokumentbasierten Datenbank ist für alle web- oder datenbasierte Projekte geeignet, die sich durch folgende Merkmale auszeichnen:
 
  • Flexibilität: Sie legen einen großen Wert darauf, dass Ihr Webprojekt möglichst flexibel ist und sich jederzeit dynamisch an neue Anforderungen anpassen lässt.
  • Hohe Verfügbarkeit: Eine hohe Verfügbarkeit soll stets gewährleistet werden: Ihr Unternehmen und Ihre Kunden sind darauf angewiesen, dass Ihr Webservice stets in voller Kapazität verfügbar ist und dass selbst im Falle von Serverausfällen die Funktionsfähigkeit Ihres Webdienstes in voller Kapazität erhalten bleibt.
  • Skalierbarkeit: Sie benötigen dynamische Skalierbarkeit: Sollten die Nutzerzahlen Ihres Webdienstes stark wachsen, steigt zugleich auch die Anzahl der Anfragen an die Datenbank, wodurch das Datenbanksystem einer stärkeren Belastung ausgesetzt wird. Dokumentorientierte Datenbankensysteme bietet erstklassige horizontale Skalierungsmöglichkeiten, sodass neue Server jederzeit hinzugefügt werden können, um eine Überlastung des Systems zu verhindern.
 
Obwohl die relationalen Datenbanken, wie PostgreSQL und MySQL mehr Flexibilität beim Zugriff auf die gespeicherten Daten bieten, erlaubt MongoDB hingegen eine äußerst flexible Speicherung der Daten. Beim Zugriff auf die gespeicherten Daten bieten relationale Datenbanksysteme aufgrund ihrer flexiblen Zugriffssemantik jedoch bessere Möglichkeiten. Eine dokumentbasierte Datenbank ermöglicht zwar das Speichern schemafreier Daten. Falls sich diese Daten jedoch, wie es in den meisten Fällen üblich ist, aus mehreren Relationen zusammensetzen, werden sie entweder eingebettet oder über ID-Referenzen miteinander verbunden.  Hier kommt einer der größten Nachteile von NoSQL zum Tragen: deutlich schlechtere, bzw. umständlichere Abfragemöglichkeiten im Vergleich zu relationalen Datenbanken. MongoDB bietet zur Abfrage von relationalen Daten inzwischen sog. „Lookups“, die effektiv SQL JOINs sind, darüberhinaus sogar echte Transaktionen, jedoch steht dies im Funktionsumfang hinter traditionellen SQL Datenbanken weit zurück.
 
Weiterhin werden die Nachteile einer schemafreien Struktur oft erst später in der Entwicklung einer Anwendung offensichtlich. Nämlich dann wenn sich die Daten als inhärent relational und schemagebunden erweisen.
 
Obwohl das NoSQL-Prinzip also durchaus seine Daseinsberechtigung hat und in einer Vielzahl verschiedener Einsatzszenarien sein volles Potenzial an Möglichkeiten entfalten kann, sollten die jahrzehntelange Entwicklung des relationalen Modells und moderner SQL-Datenbankensysteme nicht einfach so „aus Modegründen“ ignoriert werden.
 
Dokumentenbasierte Datenbanksysteme eignen sich - wie der Name schon sagt - besonders gut für das Speichern von in sich abgeschlossenen Dokumenten. Dies ist immer dann von Bedeutung, wenn geringe Konsistenzgarantien benötigt werden, die Struktur der gespeicherten Daten noch nicht in vollem Umfang bekannt ist oder wenn sich die Daten aus wenigen Relationen zusammensetzen. NoSQL Datenbanken haben insbesondere in der JavaScript-Entwicklerszene innerhalb kürzester Zeit  eine große Popularität erlangt. Da sich JavaScript im Rahmen der Frontententwicklung als der De-Facto-Standard etabliert hat, bietet MongoDB Frontendentwicklern optimale Einstiegsmöglichkeiten in die Full-Stack-Webentwicklung. Nicht umsonst genießt der sogenannte „MEAN-Stack“ in der Webentwickler-Community eine enorme Beliebtheit. Insbesondere für Produktprototypen, erste Testversionen und MVP bieten NoSQL Datenbanken in Kombination mit Webtechnologien wie NodeJS und Angular eine Vielzahl von Vorteilen.

 

Eigenschaften und Vorteile der Programmiersprache Rust

Lesedauer ca. 5 min

Die noch relativ neue Programmiersprache Rust hält seit 2016 den ersten Platz in der jährlichen Abstimmung über die beliebteste Programmiersprache auf der Plattform stackoverflow. Sie wird oft als besserer Ersatz für die hardwarenahe Sprache C gesehen, ist aber auch für größere anwendungsorientierte Projekte sehr gut geeignet.

Was sind die Rahmenbedingungen für Rust?
Eine stabile Version dieser Programmiersprache ist seit 2015 verfügbar. Nach Unsicherheit im Jahr 2020 über die weitere Finanzierung und Betreuung wurde im Februar 2021 eine Stiftung gegründet, die sich um die Weiterentwicklung von Rust kümmern wird. Diese Stiftung wird von den Unternehmen Amazon Web Services, Alphabet, Huawei, Microsoft sowie von der Mozilla Foundation getragen.
Auf der einen Seite sollte Rust wie C für die Programmierung von Betriebssystemen geeignet sein. Für solche Zwecke wird sie auch eingesetzt und zwar beispielsweise im Projekt Redox-OS. In diesem Bereich steht geringe Fehleranfälligkeit im Vordergrund der Anforderungen. Andererseits sollte die Einsatzfähigkeit von Rust als Systemprogrammiersprache Sie als Programmierer nicht mit für Anwendungen unnötigen Details belasten.
Als Evidenz für diese Benutzerfreundlichkeit lässt sich darauf verweisen, dass Rust auf unixoiden Systemen mit nur einer Zeile von bash-Instruktionen installiert werden kann.

Eigenschaften von Rust
Die Sprache ist von mehreren Programmierparadigmen geprägt. Dazu gehören prozedurale und objektorientierte Aspekte. Syntaktisch ähnelt Rust der Sprache C++.
Als wichtigste Besonderheit der Sprache sehen die Entwickler das Konzept des Ownership. Es dient der Speichersicherheit anstelle eines Garbage Collectors, der sonst für die Freigabe nicht mehr benötigten Speicherplatzes eingesetzt wird. Die Idee erfordert für ein vollständiges Verständnis etwas Erfahrung mit einigen Beispielen. Grob gesprochen dreht sich dieser Zugang zur Speicherverwaltung darum, dass jeder Wert eine einzige ihm zugeordnete Variable besitzt oder von ihr als Owner besessen wird. Der Wert mit seinem Speicherplatz wird freigegeben, wenn der Owner nicht mehr gültig ist. Diese Funktionalität wird ausschließlich bei der Kompilierung ausgeführt und verbraucht deshalb keine Rechenleistung bei der Ausführung eines Programms.

Vorteile
- Die Sprache ermöglicht leistungsfähiges Progammieren in zwei Bedeutungen des Wortes. Die Programme werden schnell und mit wenig erforderlichem Speicherplatz abgearbeitet. Damit können Sie mit Rust auch für kleine Computer programmieren. Leistungsfähig ist Rust aber auch in dem Sinn, dass das Schreiben der Programme nicht viel Zeit erfordert und damit effizient ist.
- Sicherheit wird bei Rust groß geschrieben. Gestützt wird diese Eigenschaft durch eine starke Typisierung und das bereits erwähnte Ownership-Modell.
Speichersicherheit ist wichtig, um Überläufe und damit Bugs und Sicherheitslücken zu verhindern. Im Gegensatz zur Situation der Sprache C erkennt der Rust-Compiler solche Fehler. Dasselbe gilt für die Thread-Sicherheit. Sie bezieht sich auf das sichere nebenläufige Abarbeiten verschiedener Threads ohne Wettlaufrisiken, die sonst schwer zu findende Programmierfehler darstellen.

Anwendungen in der Systemprogrammierung
Programmiersprachen für Systemprogramme sollen die Speicherverwaltung, parallele Abläufe und die Darstellung von Daten besonders unterstützen. In bisher verfügbaren solchen Sprachen war diese Art der Programmierung aufwendig und Fehler waren nur mit einiger Erfahrung mit Feinheiten vermeidbar.
Mit Rust werden Ihnen als Systemprogrammierer Werkzeuge für den Zugang zu elementaren Funktionen zur Verfügung gestellt. Der Compiler erkennt die sich bei solchen Programmen oft einschleichenden Fehler, insbesondere bei parallelen Abläufen. Aus diesem Grund ist die Sprache besonders auch für Studenten von Betriebssystemkonzepten geeignet.

Rust für Softwareprogrammierung von Anwendungen
Bis zur Entwicklung dieser Sprache wurde es oft als unvermeidlich angesehen, dass sich Verwendungsfähigkeit für Systemprogramme und Anwenderfreundlichkeit gegenseitig ausschließen. Als Grund wäre wohl angegeben worden, dass der Zugang zu Systemdetails Komplikationen mit sich bringt, die dann bei anderen Anwendungen in den Griff zu bekommen sind.
Die Entwickler von Rust nehmen die Haltung ein, dass dieser Gegensatz auflösbar ist. Sicherheit wird mit Produktivität kombiniert und ergibt eine Sprache, die effizient und auch beschränkt auf hochsprachliche Konstruktionen in einem Softwareprojekt verwendbar ist.

Dokumentation
Die beste Programmiersprache wird nicht verwendet, wenn Sie als Programmierer keine gut verwendbare Dokumentation zur Verfügung gestellt bekommen. Auch in diesem Bereich kann Rust überzeugen.
Neben der Webseite selbst als erste Darstellung ist eine systematische Einführung in die Sprache online verfügbar, die bei No Starch Press in gedruckter Form und als e-book erhältlich ist. Den Entwicklern von Rust ist aber auch klar, dass viele Programmierer einen anderen Stil einer Einführung bevorzugen. Gehören Sie zu den Entwicklern, die neue Konzepte und eine neue Sprache am liebsten über viele Beispiele grokken? Auch dieser Stil der Aufnahme wird Ihnen mit einer entsprechenden Sammlung angeboten. Als weitere Alternative ist eine Einführung zum Schreiben von Rust im CLI verfügbar.
Eine so flexible Sprache wird aber natürlich in verschiedenen Anwendungsbereichen auf sehr unterschiedliche Weise eingesetzt. Deshalb ist eine eigene Dokumentation für die Kommandozeile, die Erstellung von Webapplikationen, Netzwerkanwendungen und eingebettete Systeme verfügbar.

Werkzeuge für Entwickler
Für eine schnelle Erstellung von Code in einem Softwareprojekt und für das Erlernen einer Sprache geht es nicht nur um die Eigenschaften der Programmiersprache selbst, sondern auch um die verfügbaren Dienstprogramme und Werkzeuge für die Softwareprogrammierung.
Zum Ausprobieren und Lernen steht auf der Webseite der Sprache ein Playground zur Verfügung, in dem Sie Programmtext ausführen lassen können. Für das Erstellen des Programmtexts können Sie sich mit hoher Wahrscheinlichkeit auf den von Ihnen bevorzugten Editor stützen, denn zahlreiche Editoren werden von Rust unterstützt. Das bedeutet auch, dass in diesen Editoren syntaktische Tools zur Verfügung stehen, die auf die Eigenschaften von Rust angepasst sind und durch Einrücken und aussagekräftige Farbcodes die Lesbarkeit Ihres Programmcodes entscheidend verbessern.
Dazu kommt, dass der Compiler bei Fehlern die Verarbeitung nicht einfach abbricht, sondern Sie mit nützlichen Fehlermeldungen bei der Behebung der noch vorhandenen Bugs unterstützt.
Mit Cargo wird Ihnen ein auf die Sprache angepasster Paketmanager zur Verfügung gestellt, in dem die Versionskontrolle Git integriert ist. Der Paketmanager verwaltet auch die Bibliotheken, von denen Ihr Code abhängig ist.

Wenn Sie sich an den vordersten Rand der Entwicklung begeben möchten
Die Sprache wird ständig weiterentwickelt und neben stabilen neuen Versionen gibt es auch die sprichwörtlichen nightly builds, mit denen Sie experimentieren können.
Detaillierter als das Buch ist das ebenfalls online verfügbare Referenzdokument, in dem Sie feine Details klären können.
Die Entwickler von Rust sind mit Recht auf die Fehlerresistenz und Sicherheit ihres Endproduktes stolz. Für manche Anwendungen sind aber auch bewusst unsichere Funktionen zumindest ein Vorteil, wenn sie nicht sogar notwendig sind. Das Rustonomicon ist der Text, der Ihnen online den Hintergrund zu den unsicheren Funktionen bietet.
Auch für die noch nicht stabilen Versionen wird Ihnen eine Dokumentation angeboten, die Ihnen bei Ihren Experimenten mit den neuesten Versionen behilflich sein kann.

Fazit
Rust hat nicht umsonst für mehrere Jahre den Spitzenplatz auf der Liste der beliebtesten Programmiersprachen gehalten. Es besticht mit einer Eignung sowohl für System- als auch für Anwendungsprogrammierung, die bisher in dieser Form nicht verfügbar war. Das zentrale Konzept der Ownership wird schon im vierten Kapitel des Einführungstextes behandelt. Soweit kommen Sie schon mit geringem Aufwand, der sich für das Kennenlernen von Rust bezahlt machen wird.

Möchten sie mehr über den praktischen Einsatz erfahren ? Wir freuen uns über ihre Nachricht