# RavenDB

RavenDB ist eine Open-Source dokumentenorientierte Datenbank mit vollständigen ACID-Eigenschaften, die in C# geschrieben und von Hibernating Rhinos Ltd. entwickelt wurde. Sie ist plattformübergreifend und wird von Windows, Linux und MacOS unterstützt. RavenDB speichert Daten als JSON-Dokumente und kann in verteilten Clustern mit einer Master-Master-Replikation bereitgestellt werden.

## Geschichte

Ursprünglich „Rhino DivanDB“ genannt, begann RavenDB 2008 als ein Projekt von Oren Eini (alias Ayende Rahien) und wird von Hibernating Rhinos Ltd. entwickelt. Das Unternehmen behauptet, es sei die erste Dokumentendatenbank gewesen, die nativ im .NET-Rahmen ausgeführt wurde. Es war eine frühe Dokumentendatenbank, die ACID-Garantien anbot.
2019 begann Hibernating Rhinos Ltd., RavenDB als Cloud-Service namens RavenDB Cloud anzubieten.

## Geschichte der div. Versionen

| Ausführung | Datum | Hinzugefügte Features (Teilliste) |
| 1.0 | Mai 2010 | |
| 2.0 | Januar 2013 | Replikation |
| 2.5 | Juni 2013 | Projektionen; Facettenabfrage |
| 3.0 | November 2014 | Java API; Voron storage engine |
| 3.5 | Oktober 2016 | Clustering |
| 4.0 | Februar 2018 | Wurde plattformübergreifend. Ist mit einer kostenlosen Lizenz erhältlich |
| 4.1 | August 2018 | Clusterweite Transaktionen |
| 4.2 | Mai 2019 | Graphenabfrage |
| 5.0 | Juli 2020 | Zeitreihen; Datenkomprimierung mit dem Zstandard-Algorithmus |
* Rot: Nicht unterstützt
* Grün: Unterstützt

### Systemarchitektur

Daten werden als schematafrei Dokumente im JSON-Format gespeichert. Auf der Speicherebene werden Dokumente in einem Binärformat geschrieben, das als „blittable“ bezeichnet wird. Dokumente werden in Sammlungen gruppiert, wobei jedes Dokument genau zu einer Sammlung gehört.
Datenbanken können mithilfe der Multi-Master-Replikation auf einem verteilten Cluster von Servern (als „Knoten“ bezeichnet) bereitgestellt werden. Einige Operationen auf der Clusterebene erfordern eine Übereinstimmung der meisten Knoten. Die Übereinstimmung wird mithilfe einer Implementierung des Raft-Algorithmus namens Rachis ermittelt. Aufgaben werden ausgewogen auf die verschiedenen Knoten verteilt.
Ursprünglich verwendete RavenDB die Esent-Speicher-Engine. Version 3.0 ersetzte diese durch eine neue Open-Source-Speicher-Engine namens Voron.
Clients werden bei C#, C++, Java, NodeJS, Python, Ruby und Go unterstützt.

## Haupteigenschaften

* Clusterweite ACID-Transaktionen – ACID-Transaktionen können im Rahmen eines Clusters (zusätzlich zu Einzelknotentransaktionen) ausgeführt werden. Die Transaktion wird nur fortgesetzt, wenn sie durch eine Übereinstimmung der Knoten bestätigt wird. Ist dies nicht der Fall, wird die Transaktion abgebrochen und zurückgesetzt.

### Indexe und Abfrage

Abfragen werden in LINQ oder mit einer benutzerdefinierten Abfragesprache namens RQL (steht für Raven Query Language) ausgedrückt, deren Syntax SQL ähnelt.
* Dynamische Indexe – In RavenDB können Abfragen nur von einem Index erfüllt werden. Wenn kein geeigneter Index vorhanden ist, wird ein neuer Index erstellt, um die Abfrage zu erfüllen.
* Graphenabfragebezogene – Dokumente können als Eckpunkte in einem Graphen behandelt werden, wobei die Verbindungen als Kanten behandelt werden. Dadurch können rekursive Abfragen erstellt werden.
* Projektion – Indexe können so konfiguriert werden, dass indizierte Daten transformiert, Berechnungen und Aggregationen durchgeführt und JavaScript-Code auf der Serverseite ausgeführt werden.
* Volltextsuche – Auf niedriger Ebene werden Daten mit Lucene.net indiziert. Dies bedeutet, dass Indexe die Volltextsuche unterstützen.

## Dokumenterweiterungen

Dokumente können mit anderen Datentypen erweitert werden, die für JSON weniger geeignet sind. Diese Erweiterungen können unabhängig vom Dokument selbst geladen, geändert und gespeichert werden.
* Anhänge – Dokumente können mehrere Anhänge eines beliebigen Datentyps, z. B. Bilder, Audio oder reine Binärdateien, enthalten.
* Zeitreihen – numerische Daten, die bestimmten Zeiten zugeordnet und chronologisch geordnet sind.

## RavenDB Cloud

RavenDB Cloud ist eine verwaltete Datenbank als Service, die 2019 auf AWS, Azure und GCP gestartet wurde. Der Service führt Verwaltungsaufgaben wie Hardwarewartung und Security für Benutzer aus. Um eine Leistungsdrosselung zu vermeiden, bietet es die gemeinsame Nutzung von CPU-Ressourcen unter den verschiedenen Knoten eines Clusters.

## Lizenzierung

RavenDB existiert unter einer AGPLv3-Lizenz als Open Source. Es ist mit einer kostenlosen und einer kommerziellen Lizenz erhältlich.