# RavenDB

RavenDB es una base de datos documental de código abierto con soporte transaccional nativo escrita íntegramente en C# y desarrollada por Hibernating Rhinos Ltd. Es una base de datos multiplataforma compatible con Windows, Linux y MacOS. RavenDB almacena datos como documentos JSON y soporta clústeres distribuidos con replicación maestro-maestro.

## Historia

Originalmente llamada “Rhino DivanDB”, RavenDB comenzó como un proyecto de Oren Eini en 2008 y fue desarrollado por Hibernating Rhinos Ltd. La empresa afirma que fue la primera base de datos de documentos que se ejecutó de forma nativa en el Framework .NET. Fue una de las primeras bases de datos de documentos en ofrecer garantías transaccionales (ACID).
En 2019, Hibernating Rhinos comenzó a ofrecer RavenDB como un servicio en la nube llamado RavenDB Cloud.

## Historial de versiones

| Versión | Fecha | Funciones agregadas (lista parcial) | Compatible? |
| 1.0 | mayo de 2010 | | No |
| 2.0 | enero de 2013 | Replicación | No |
| 2.5 | junio de 2013 | Proyecciones; consulta por facetas | No |
| 3.0 | noviembre de 2014 | API de Java; Motor de almacenamiento Voron | No |
| 3.5 | octubre de 2016 | Soporte de clúster de alta disponibilidad | Sí |
| 4.0 | febrero de 2018 | Soporte de multiplataforma; disponibilidad con una licencia gratuita | No |
| 4.1 | agosto de 2018 | Transacciones a nivel de clúster | No |
| 4.2 | mayo de 2019 | Consultas en grafos | Sí |
| 5.0 | julio de 2020 | Series temporales; Compresión de datos mediante el algoritmo Zstd | Sí |

## Arquitectura del sistema

Los datos se almacenan como documentos sin esquema en formato JSON. A nivel de almacenamiento, los documentos se escriben en un formato binario nativo llamado "blittable". Los documentos se agrupan en colecciones, y cada documento pertenece exactamente a una colección.
Las bases de datos se pueden implementar en un clúster distribuido de servidores (llamados "nodos") mediante replicación multimaestro. Algunas operaciones a nivel de clúster requieren el consenso de la mayoría de los nodos; el consenso se determina mediante una implementación del algoritmo Raft llamado Rachis. Las tareas se distribuyen a los diferentes nodos de forma equilibrada.
RavenDB utilizó originalmente el motor de almacenamiento Esent. La versión 3.0 lo reemplazó con un nuevo motor de almacenamiento de código abierto llamado Voron.
Los clientes son compatibles con C#, C++, Java, Node.js, Python, Ruby y Go.

## Principales características

* Transacciones ACID en todo el clúster: las transacciones ACID se pueden ejecutar en el alcance de un clúster (además de las transacciones de un solo nodo). La transacción solo se mantendrá si es confirmada por un consenso de nodos; de lo contrario, la transacción se cancela y se revierte.

## Índices y consultas

Las consultas se expresan en LINQ o con un lenguaje de consulta propietario llamado RQL (siglas de Raven Query Language) que tiene una sintaxis similar a SQL.
* Índices dinámicos: en RavenDB, las consultas solo pueden satisfacerse mediante un índice; si no existe un índice apropiado, se crea un nuevo índice para satisfacer la consulta.
* Consultas de grafos: los documentos relacionados se pueden tratar como vértices en un grafo, y las conexiones se tratan como bordes. Esto permite entre otras cosas crear consultas recursivas.
* Proyecciones: los índices se pueden configurar para transformar datos indexados, realizar cálculos, realizar agregaciones y ejecutar código javascript en el lado del servidor.
* Búsqueda de texto completo: en un nivel bajo, los datos se indexan con Lucene.net, lo que significa que los índices admiten la búsqueda de texto completo.

## Extensiones de documentos

Los documentos se pueden ampliar con otros tipos de datos menos adecuados para JSON. Estas extensiones se pueden cargar, modificar y almacenar en forma independiente del documento.
* Archivos adjuntos: los documentos pueden tener varios archivos adjuntos de cualquier tipo de datos, como imágenes, audio o binario puro.
* Series de tiempo: datos numéricos asociados con tiempos específicos y ordenados cronológicamente.

## Nube de RavenDB

RavenDB Cloud es una base de datos administrada como servicio lanzada en 2019 en AWS, Azure y Google Compute Platform. El servicio realiza tareas de administración como mantenimiento de hardware y seguridad para los usuarios. Cuenta con el uso compartido de recursos de CPU entre los diferentes nodos en un clúster para limitar la sobrecarga.

## Licencia

RavenDB es de código abierto bajo una licencia AGPLv3. Está disponible con una licencia gratuita y una licencia comercial.