Michael K. Aboagye trabaja como ingeniero de seguridad de aplicaciones y pentester web con buenos conocimientos en Linux, Git, PHP, Java, RDMS y desarrollo de bases de datos Nosql. También le gusta incursionar en devops.

Base de datos orientada a documentos y N1QL
En este artículo, compartiré mis conocimientos sobre por qué una base de datos orientada a documentos es totalmente diferente de un sistema de gestión de bases de datos relacionales, y por qué una base de datos orientada a documentos funciona mucho mejor que un sistema de gestión de bases de datos relacionales en un mundo en el que el big data avanza sin cesar. Por último, mostraré cómo crear una base de datos orientada a documentos con Couchbase y cómo utilizar la sintaxis SQL para ejecutar contra documentos JSON.
Breve introducción a Couchbase
Couchbase, al igual que MongoDB, es un producto o sistema de base de datos NoSQL. NoSQL en este contexto significa simplemente que los datos se almacenan sin la ayuda de un lenguaje de consulta estructurado; los datos se almacenan en documentos. Couchbase es una combinación de dos productos: Memcached y Couchbase.
Couchbase combina las ventajas de Memcached y Couchbase para proporcionar un rendimiento escalable en un clúster de nodos. Couchbase se encuentra entre una serie de productos NoSQL que han comprometido la consistencia eventual para poner más énfasis en la disponibilidad, escalabilidad y tolerancia a la partición.
Según el teorema CAP de Eric Brewer, es imposible que sistemas distribuidos como MongoDB o Couchbase cumplan los tres conceptos: consistencia, disponibilidad y tolerancia parcial. Por lo tanto, Couchbase aborda la consistencia eventual a través de su característica avanzada de replicación, la replicación cruzada de centros de datos (XDCR), para gestionar eficazmente los fallos de nodos, un problema común para la mayoría de los sistemas de gestión de bases de datos relacionales. proporciona una forma más débil de consistencia conocida como consistencia eventual a través de la replicación. Además, Couchbase tiene su propia forma de gestionar los fallos de nodo, un problema común de la mayoría de los sistemas de gestión de bases de datos relacionales. Couchbase implementa un vBucket conocido como partición lógica o sharding. Cada dato de un vBucket se almacena en todos los nodos presentes mediante replicación. Así, en caso de fallo de un nodo, Couchbase hace que uno de los vBuckets de réplica esté disponible automáticamente.
Un nodo de Couchbase Server viene con dos componentes principales - Gestor de datos y Administrador de clústeres.
Administrador de clústeres - se encarga del entorno del clúster de Couchbase. Se encarga del reequilibrio de datos entre nodos, proporciona un mapa del clúster que ayuda a los clientes que solicitan datos concretos a saber dónde buscar esos datos, supervisa los nodos, recopila estadísticas y registra los datos.
Gestor de datos - se limita a gestionar el almacenamiento y la recuperación de datos en documentos. Contiene la caché de memoria, el motor de consulta y el mecanismo de persistencia en disco.
Por último, Couchbase gestiona los datos en buckets. Un bucket en Couchbase es similar a una base de datos en Microsoft SQL Server o MySQL. Un bucket está formado por recursos relacionados pero con esquemas diferentes. Cuando hay más de una o dos bases de datos basadas en aplicaciones, se necesitan dos buckets para gestionar los datos procedentes de esas dos aplicaciones por separado.
Diferencia entre RDBMS y base de datos orientada a documentos
Un sistema de base de datos relacional es completamente diferente de una base de datos orientada a documentos en términos de concepto y estructura (esquema). Además, una base de datos relacional se construye utilizando comandos SQL que no son demasiado difíciles de codificar y leer.
En una base de datos relacional, las tablas están vinculadas entre sí mediante claves externas. La clave ajena es un concepto del sistema de bases de datos SQL por el que una clave ajena consiste en campos comunes que se utilizan para vincular tablas. Además, los esquemas de las bases de datos relacionales son bastante rígidos en comparación con los de las bases de datos orientadas a documentos.
Supongamos que Aero Air dispone de una base de datos relacional para gestionar sus vuelos. La base de datos consta de tres tablas, a saber: Programa de vuelos, Información de vuelos y Rutas de vuelos.
| ID de vuelo | Nombre del vuelo | NumSeats | Distancia |
| 001 | Boeing Erv | 5,000 | 1318 km |
| 002 | Airbus Erv | 1,000 | 1578 km |
| 003 | Max Erv | 2,000 | 2967 km |
| Rutas Código | ID de vuelo | En | A |
| AeroAir001 | 001 | Glasgow | París |
| AeroAir002 | 002 | Bruselas | Bengaluru |
| AeroAir003 | 003 | Hamburgo | Moscú |
| Código de horario | ID de vuelo | Hora de salida | Hora de llegada |
| AeroAir-010 | 001 | 1700 GMT | 2000 GMT |
| AeroAir-012 | 002 | 1600 GMT | 1300 GMT |
| AeroAir-013 | 003 | 1400 GMT | 1400 GMT |
En una base de datos orientada a documentos, el esquema de una base de datos difiere en cada documento de una base de datos. Una base de datos orientada a documentos permite un esquema dinámico; así, un documento puede contener un campo específico o una clave diferente de otros documentos. En una base de datos de documentos típica, no se permiten los comandos SQL. Sin embargo, puede utilizar N1QL, también denominado "Nickel", para ejecutar SQL contra sus documentos.
N1QL es un lenguaje de consulta específico para Couchbase que te permite unir ambos mundos, NoSQL y SQL. Puedes usar N1QL para ejecutar contra un documento JSON, una característica que hace interesante a N1QL, que exploraremos más adelante.
Para nuestro ejemplo anterior de Aero Air de vuelos, podemos hacer lo mismo utilizando Couchbase nombrando a nuestro bucket "AeroAir" para gestionar los datos almacenados. A través de la AeroAir cuboLos desarrolladores de Couchbase pueden editar los datos de los documentos.
Creación de una base de datos orientada a documentos con Couchbase
Crear una base de datos orientada a documentos con Couchbase requiere un conocimiento básico del formato JSON.
En primer lugar, supongamos que ya ha instalado Couchbase Server (edición Enterprise o edición Community).
Aquí tiene una visión general de Couchbase Server:

Cómo crear un cubo en Couchbase
Antes de poder crear documentos, tienes que crear un bucket para gestionar los datos almacenados. Puedes introducir el nombre que prefieras; yo elegí llamar al cubo AeroAir. 
Como puede ver, tenemos un cubo activo, que es el cubo AeroAir.

Supongamos ahora que AeroAir tiene un documento sencillo compuesto por detalles de vuelos relevantes para los viajeros o clientes.

Recuerde que una base de datos orientada a documentos es totalmente diferente y bastante flexible en comparación con una base de datos relacional perteneciente a la familia SQL. Con una base de datos orientada a documentos, puedes incluir campos adicionales en otros documentos, así como excluirlos.
Vamos a crear un documento de vuelo para el Boeing ERV. En el extremo derecho de AeroAir, puedes ver que hay dos botones etiquetados como Documentos y Ver. Haz clic en el botón de documento para crear un nuevo documento de vuelo para nuestro cubo AeroAir.
Usted crea un nuevo documento editando los datos predefinidos en formato JSON con sus propios datos.

Como puedes ver, he creado un documento de vuelo para Boeing ERV en el cubo AeroAir.

Además, he creado cuatro documentos en el cubo AeroAir. Cada documento representa datos de información de vuelo, datos de horario de vuelo e información de ruta. Puedes seguir creando tantos documentos como quieras para el bucket AeroAir.

A continuación se muestra una ilustración del aspecto de los datos en un documento. Dejar una coma final en un documento JSON se considera válido a menos que la coma del último elemento preceda a la etiqueta de cierre.

Si incluye una coma adicional, se le notificará un error JSON. Echa un vistazo al siguiente ejemplo:

Como ya se ha dicho, con una base de datos orientada a documentos se pueden introducir campos ausentes en algunos documentos pero presentes en otros. Esto no afecta a la base de datos en su totalidad porque una base de datos orientada a documentos tiene un esquema muy flexible. Compruebe el ejemplo entre el vuelo Boeing ERV y el Boeing FFH.


Como puede ver, aunque ambos documentos están en el bucket AeroAir, un documento tiene un campo que está ausente en otro documento, pero nuestra base de datos o bucket no se ve afectado.
En Couchbase, acceder a los datos de un documento es bastante diferente de una base de datos relacional donde dependes de la clave primaria para recuperar un valor particular en una fila. En Couchbase puedes usar el Document_ID de un documento para acceder a un documento específico en un bucket una vez que el document ID es válido y el documento existe. Al igual que en una base de datos relacional, el ID de un documento debe ser único.
Así, en nuestro ejemplo de la base de datos AeroAir, utilicé el nombre de los vuelos como ID del documento.

Ahora que hemos creado documentos en los datos de AeroAir, es hora de que consultemos nuestros documentos.
Couchbase proporciona el lenguaje de consulta N1QL, que es similar a la sintaxis SQL, pero puede operar sobre documentos JSON y los resultados se devuelven en formato JSON.
Conocimientos básicos en MySQL o generalmente SQL son suficientes para llevarte a través de lo básico y probablemente hacia comandos avanzados de N1QL. Al igual que SQL, N1QL consta de un lenguaje de manipulación de datos y un lenguaje de definición de datos.
Básicamente, utilizaré cláusulas como SELECT, WHERE y FROM para consultar documentos en AeroAir. Al igual que SQL, N1QL ofrece más de SELECCIONE, DESDEy DONDE. Por ejemplo, puede utilizar la cláusula UPDATE si desea actualizar un valor del documento, o INSERT si desea incluir nuevos datos.
Una vez que conozcas la sintaxis SQL a mano, usar Couchbase N1QL contra documentos JSON no debería ser un problema.
Nos centraremos en cómo SELECCIONE, DESDEy DONDE usando las siguientes cláusulas para consultar documentos en AeroAir usando Couchbase N1QL.
SELECCIONE - Puede utilizar esta cláusula para seleccionar un campo específico de un documento, incluyendo un símbolo de asterisco después de la cláusula SELECT devuelve todos los campos de los documentos.
DESDE - Puede utilizar esta cláusula para el bucket de datos con el que trabajar u operar.
DONDE - Puede utilizar esta cláusula indicando las condiciones que deben tener o satisfacer los documentos recuperados.
Couchbase proporciona un Query Workbench para ejecutar consultas en la consola web y una herramienta cbq si prefieres utilizar la línea de comandos.
Utilización del Query Workbench
Ahora que tenemos algunos documentos en nuestros buckets, probemos algunas consultas básicas sobre uno o dos documentos.
En primer lugar, haga clic en el botón CONSULTA junto a la pestaña ÍNDICES o entre CUBOS DE DATOS y ÍNDICES. Como puede ver, hay un análisis de cubo que muestra el cubo actual que está siendo gestionado por el sistema. También a la derecha, está el panel de resultados que muestra el resultado devuelto en formato JSON.

Tengo ciertos campos en los documentos para que nuestra consulta sea más interesante. Digamos que estamos interesados en un vuelo fijado con Wi-Fi de Internet. Ejecutando la consulta en la consola web sin crear un índice primario en el bucket AeroAir acaba en error.

Ahora intente ejecutar la misma consulta en la consola web. Puedes ver que esta vez la consulta se ha ejecutado correctamente.

Puede ver que los resultados se devuelven en formato JSON. Buscamos un vuelo con una velocidad de Internet superior a 100 kbps. Nos ha devuelto el vuelo Boeing FFH como el único vuelo que satisface la condición de la consulta. El operador de comparación significa simplemente superior a 100 kilobytes por segundo.
Puede especificar una condición concreta sin utilizar operadores de comparación. Digamos que queremos averiguar qué vuelo tiene asignado a Jack Carisma como piloto principal.

Curiosamente, aunque N1QL utiliza sintaxis SQL, puede ejecutarse contra documentos JSON. Esto es lo que hace que Couchbase con N1QL sea interesante y una mejor alternativa a una base de datos relacional.
Este post forma parte del Programa de Escritura de la Comunidad Couchbase