# RavenDB

RavenDB è un database orientato ai documenti completamente ACID e open-source; scritto in C# e sviluppato da Hibernating Rhinos Ltd. È multi piattaforma, supportata Windows, Linux e MacOS. RavenDB memorizza i dati sotto forma di documenti JSON, e può essere installato con support per i cluster distribuiti con replica master-master.

## Storia

Originariamente chiamato “Rhino DivanDB”, RavenDB inizia come un progetto di Oren Eini (alias Ayende Rahien) nel 2008 ed è sviluppato da Hibernating Rhinos Ltd. La società sostiene che è stato il primo database orientato ai documenti ad essere eseguito in modo nativo col framework .NET. È stato uno fra i primi database orientati ai documenti a fornire garanzie di tipo ACID.
Nel 2019 Hibernating Rhinos ha cominciato ad offrire RavenDB come un servizio cloud chiamato RavenDB Cloud.

## Storia delle versioni

| Versione | Data | Funzionalità aggiunte (elenco parziale) | Supportato? |
| 1.0 | Maggio 2010 | | No |
| 2.0 | Gennaio 2013 | Replica | No |
| 2.5 | Giugno 2013 | Proiezioni; Query basate su facet | No |
| 3.0 | Novembre 2014 | Java API; Motore di persistenza Voron | No |
| 3.5 | Ottobre 2016 | Clustering | Sì |
| 4.0 | Febbraio 2018 | Supporto multi piattaforma; disponibile con una licenza gratuita | No |
| 4.1 | Agosto 2018 | | No |
| 4.2 | Maggio 2019 | Supporto per le Graph query | Sì |
| 5.0 | Luglio 2020 | Serie temporali; Compressione dei dati usando l’algoritmo zstd | Sì |

## Architettura del sistema

I dati sono memorizzati come documenti senza schema in formato JSON. A livello di archiviazione, i documenti sono scritti in un formato binario chiamato “blittable”. I documenti sono raggruppati in collection, ogni documento appartiene solo ed unicamente a una collection.
I database possono essere distribuiti su un cluster di server (chiamati ‘nodi’) usando replica multi-master. Alcune operazioni a livello di cluster richiedono il consenso della maggioranza dei nodi, il consenso è determinato usando un’implementazione dell’algoritmo Raft chiamata Rachis. Le attività sono distribuite ai diversi nodi in modo bilanciato.
Originariamente RavenDB usava il motore di archiviazione Esent. Nella Versione 3.0 è stato sostituito con un nuovo motore di archiviazione, open source, chiamato Voron.
Il database client è disponibile per C#, C++, Java, Node.js, Python, Ruby e Go.

## Caratteristiche principali

* Transazioni ACID cluster-wide – le transazioni ACID possono essere eseguite a livello di cluster (oltre a transazioni a livello di singolo nodo). La transazione sarà completata solo se confermata dalla maggioranza dei nodi; altrimenti, la transazione è annullata e viene eseguito il roll back.

## Indici e query

Le query sono espresse in LINQ o con un linguaggio di query personalizzato chiamato RQL (acronimo di Raven Query Language) che ha una sintassi simile a SQL.
* Indici dinamici – in RavenDB le query possono essere soddisfatte solo da un indice; se non esiste un indice appropriato, un nuovo indice viene creato per soddisfare la query.
* Graph Query – documenti in relazione tra loro possono essere trattati come vertici in un grafo, e le relazioni come collegamenti. Questo consente di creare query recorsive.
* Proiezioni – gli indici possono essere configurati in modo da trasformare i dati indicizzati, eseguire calcoli, eseguire aggregazioni ed eseguire codice JavaScript lato del server.
* Ricerca full-text – a basso livello, i dati sono indicizzati tramite Lucene.net, questo comporta che gli indici supportano ricerche full-text.

## Estensioni del documento

I documenti possono essere estesi con altri tipi di dati meno adatti a JSON. Queste estensioni possono essere lette, modificate e memorizzate indipendentemente dal documento stesso.
* Allegati – i documenti possono avere più allegati con qualsiasi tipo formato, come immagini, audio, o binario puro.
* Serie temporali – Dati numerici associati con tempi specifici e ordinati in ordine cronologico.

## RavenDB Cloud

RavenDB Cloud è un database distribuito-as-a-service, lanciato nel 2019 su AWS, Azure e Google Compute Platform (GCP). Il servizio esegue attività amministrative come la manutenzione dell’hardware e gestisce la sicurezza per gli utenti. Garantisce la condivisione delle CPU fra i diversi nodi in un cluster per evitare throttling.

## Licenza

RavenDB è open source sotto licenza di AGPL v3.0. È disponibile con una licenza gratuita e una licenza commerciale.