NoSQL

NoSQL Datenbanken (Not only SQL oder No SQL) sind (teilweise Open Source) Datenbanktechnologien welche die Nachteile anderer Datenbanktechnologien wie MySQL oder objektorientierter Datenbanken ausgleichen sollen.  Es handelt sich um Datenbanken, die besser skalierbar sind und bei hoher Datenlast mit vielen, grossen Transaktionen besser performen. NoSQL Datenbanken haben kein festes Schema wie relationale Datenbanken  Dabei kommen flexible Technologien zur Datenspeicherung zum Einsatz bzw. wird die Datenspeicherung der jeweiligen Anwendung überlassen. Es werden abweichende Protokolle zur Kommunikation mit dem Client eingesetzt als bei SQL. 

Konzepte von NoSQL-Datenbanken: BASE, CAP-Theorem
NoSQL-Datenbanken können folgende Eigenschaften haben: nicht-relational, schemafrei, horizontal skalierbar, verteilt,  BASE anstatt ACID oder einfache Replikation und Programmierschnittstelle.

BASE bedeuted Basically Available, Soft State und Eventual Consistent. Hierbei wird die strenge Konsistenz-Bedingung zugunsten einer besseren Verfügbarkeit und  Skalierbarkeit aufgeweicht. Die Form der 'losen Konsistenz' bei der die Konsistenz von nachfolgenden Operationen wieder hergestellt wird und die DB zwischen konsistentem und inkonsistentem Zustand wechselt, wird als akzeptabel angesehen.  Befinden sich Duplikate auf der DB, so werden diese nach einigen Transaktionen immer wieder asynchron synchronisiert so daß die DB immer wieder in einen konsistenten Teilzustand überführt wird. Eventual Consistent bedeuted, daß es nur einen gewissen  Zeitrahmen gibt, in dem alle Clients denselben (konsistenten) Zustand sehen.

Das CAP-Theorem gilt bei NoSQL-DBs: bei verteilten Systemen werden nur 2 der 3 Bedingungen Consistency, Availability und Partition Tolerance erfüllt.

Grosse Datenmengen  werden in einem Standardsystem auf einem Cluster verwaltet und nicht auf einem Masterserver. So werden die Nachteiler relationaler Datenbankmodelle, die auf Indexierung von grossen Datenmengen basieren ausgeglichen, da letzteres  Performanceeinbußen mit sich bringt. Relationale Datenbanken sind nur effizient wenn sie für hochfrequente kleine Transaktionen optimiert werden können oder bei grossen Batch-Input Läufen. Auch MVCC wird bei NoSQL-DBs angewendet. 

Arten von NoSQL Datenbanken, Strukturierte Datenspeicher
Man nennt NoSQL Datenbanken auch strukturierte Datenspeicher (structured storage).  Es haben sich folgende Arten von NoSQL Datenbanken herausgebildet: Dokumentenorientierte Datenbanken, spaltenorientierte Datenbanken, Key-Value-Datenbanken und Graphendatenbanken.

Dokumentenorientierte Datenbank 
Bei dokumentenorientierten Datenbanken werden Textdaten von beliebiger Grössenordnung in unstrukturierter Form gespeichert. Das Retrieval der Daten erfolgt über die Dokumenteninhalte. Beispiele sind MongoDB, CouchDB oder Apache Jackrabbit.  CouchDB sollte auf Multi-Server Umgebungen und mit Multi-Core-Systemen einsetzbar sein. CouchDB (Cluster of Unreliable commodity Hardware DataBase) verwaltet seine Daten in Dokumenten die auf  JSON-Objekten oder XML basieren. Dabei können Dokumente in einer CouchDB-Datenbank von unterschiedlicher Struktur sein. Ein Beispiel für eine Abfrage mit CouchDB ist:  Filter werden über Map/Reduce verarbeitet. Es können aber auch Funktionen in den Views (Abfragen) zur Ausführung während der Abfrage kommen. Als Datenschnittstelle fungiert bei CouchDB REST-HTTP. Ein Beispiel für eine Abfrage mit CouchDB ist: 

function(doc) { emit (doc.Projekt, {Projektleiter: doc.Projektleiter, Projektmitarbeiter: doc.Projektmitarbeiter, Projektressourcen: doc.Projektressourcen}); }
 
Key-Value Datenbank 
Bei Key-Value-Datenbanken wird ein definierter Schlüssel verwendet welcher auf einen bestimmten Wert verweist. Dieser Wert kann auch aus einer beliebigen Zeichenfolge bestehen. Key-Value Datenbanken können als In-Memory Version implementiert sein. Diese  ist speicherresistent und eignet sich durch ihre hohe Leistungsfähigkeit für Cache-Speichersysteme. Die andere Variante ist die On-Disk Implementierung welche ihre Daten auf der HDD speichert und sich für grosse Datenspeicher eignet.  Beispiel für Key-Value In-Memory Datenbanken ist memcache. Key-Value On-Disk Speicher (Key-Value-Festplattenspeicher) sind SimpleDB, Google BigTable oder Redis.  Google BigTable basiert auf dem Google File System (GFS). Bei Google BigTables wird ein bestimmter Distributed Lock Manager (DLM), der Chubby Lock Service, eingesetzt. Der DLM sorgt bei verteilten Anwendungen für die  Synchronisation des Zugriffs auf Shared Resources (geteilte Ressourcen). Die On-Disk Key-Value Datenbank Redis ist in der Lage, neben Strings auch Listen, Sets und sortierte Sets zu speichern. Die Speicherstrategie von Redis sieht vor, dass die Datasets  im Hauptspeicher gehalten werden, aber bei bestimmten Bedingungen auch auf der Festplatte abgelegt werden. Redis wurde bei Github oder Engine Yard implementiert.

Spaltenorientierte Datenbank 
Beispiel für eine spaltenorientierte Datenbank ist Apache Cassandra. Bei Cassandra werden die Daten als Schlüssel-Wert-Relation gespeichert. Cassandra ist ein verteiltes Datenbankverwaltungssystem welches auf hohe Skalierbarkeit und Ausfallsicherheit  ausgelegt ist. Bei einer spaltenorientierten Datenbank liegt eine Minimierung der I/O Aktivitäten hinsichtlich von Berechnungen auf Datensätzen vor. Bei Cassandra verfügen die Spalten über Namen, Wert und Zeitstempel. Spaltenfamilien sind gruppierte  Spalten. Apache Cassandra wird von namenhaften Firmen wie IBM, Twitter und Rackspace unterstützt. Eingesetzt wird Apache Cassandra bei Facebook, Twitter und Digg. Cassandra wurde zum Top-Level-Projekt der Apache Foundation erklärt. 

Graphendatenbanken
Graphendatenbanken spiegeln die Beziehungen der Elemente, z.B. in einem Graphenbaum wieder. Dabei kann es sich um ein Beziehungsgefüge aus Freunden in einem sozialen Netzwerk handeln oder um die Follower-Struktur bei Twitter.  Um diese Strukturen abbilden zu können werden die Daten als Knoten und Beziehungen zwischen den Knoten repräsentiert.  Um die Knoten zu durchlaufen wären in einer SQL-Datenbank viele Abfragen nötig. Beispiele für eine Graphendatenbank sind FlockDB (Twitter), Cora Data, AllegroGraph oder Neo4j.
Siehe auch:    Google-BigTable   Google-BigData   Verteilte-Datenbank   B-Baum   Twitter   Konsistenz   ACID   Multiversion-Concurrency-Control   Apache-Cassandra   MySQL