jueves, 4 de octubre de 2018

Base de Datos Documental

Una base de datos de documentos es un tipo de base de datos no relacional que está diseñada para almacenar datos semiestructurados como documentos. Las bases de datos de documentos son intuitivas y los desarrolladores las utilizan ya que los datos en el nivel de la aplicación generalmente se representan como un documento JSON. Los desarrolladores pueden conservar datos utilizando el mismo formato de modelo de documento que usan en el código de su aplicación. En una base de datos de documentos, cada documento puede tener la misma estructura de datos o no, y cada documento es autodescriptivo, incluyendo su posible esquema único, y no depende necesariamente de ningún otro documento. Los documentos se agrupan en "colecciones", que tienen un propósito similar al de una tabla en una base de datos relacional. 
Las bases de datos documentales están diseñadas para almacenar datos semiestructurados, normalmente en formato JSON o XML.

A diferencia de las bases de datos relacionales tradicionales, el esquema para cada documento no relacional (NoSQL) puede variar, lo cual ofrece a los desarrolladores, administradores de bases de datos y profesionales de TI más flexibilidad en la organización y almacenamiento de datos de aplicaciones, así como una reducción del almacenamiento requerido para valores opcionales.
Las bases de datos documentales son una forma moderna de almacenar datos en formato JSON en lugar de las simples filas y columnas de las bases de datos relacionales. Esto permite expresar los datos en su forma natural.



La ventaja principal del formato JSON reside en su facilidad de uso, tanto por los seres humanos como por las ordenadores . El formato JSON tiene tres fundamentos básicos:


Pares de valores clave o atributos. JSON es almacenado en un par de valores clave. A estos pares se les llama a veces atributos. Las claves son cadenas simples y los valores pueden ser de cualquier tipo.

Incrustación de objetos JSON. A excepción de los tipos primitivos, los valores incluidos en el par de valores clave también pueden ser otros objetos JSON, lo que permite crear una jerarquía de objetos. Colocar objetos JSON dentro de otro objeto JSON se denomina modelo de datos incrustados en base de datos documentales.

Matrices. Las matrices son un lenguaje de programación natural en todos los lenguajes de programación y estructuras de datos, así que ¿por qué no almacenar datos de la misma forma en que son expresados? El formato JSON también admite almacenamiento de matrices como valores contra una clave.

Casos de Uso

Administración de contenido

Una base de datos de documentos es una excelente opción para aplicaciones de administración de contenido, como blogs y plataformas de video. Con una base de datos documental, cada entidad que rastrea la aplicación se puede almacenar como un único documento. La base de datos de documentos es más intuitiva para que un desarrollador actualice una aplicación a medida que evolucionan los requisitos. Además, si el modelo de datos necesita cambiar, solo se deben actualizar los documentos afectados. No se requiere actualización del esquema y no es necesario tiempo de inactividad de la base de datos para realizar los cambios. 

Catálogos

Las bases de datos de documentos son eficientes y efectivas para almacenar información de catálogo. Por ejemplo, en una aplicación de e-commerce, los diferentes productos generalmente tienen diferentes números de atributos. La administración de miles de atributos en bases de datos relacionales no es eficiente y afecta al rendimiento de lectura. Al utilizar una base de datos de documentos, los atributos de cada producto se pueden describir en un solo documento para que la administración sea fácil y la velocidad de lectura sea más rápida. Cambiar los atributos de un producto no afectará a otros.

Manejadores Principales

MongoDB: qué es, cómo funciona y cuándo podemos usarlo (o no)


Dentro de las bases de datos NoSQL, probablemente una de las más famosas sea MongoDB. Con un concepto muy diferente al de las bases de datos relacionales, se está convirtiendo en una interesante alternativa.
Pero cuándo uno se inicia en MongoDB se puede sentir perdido. No tenemos tablas, no tenemos registros y lo que es más importante, no tenemos SQL. Aun así, MongoDB es una seria candidata para almacenar los datos de nuestras aplicaciones.
¿Qué es MongoDB?
MongoDB es una base de datos orientada a documentos. Esto quiere decir que en lugar de guardar los datos en registros, guarda los datos en documentos. Estos documentos son almacenados en BSON, que es una representación binaria de JSON.
Una de las diferencias más importantes con respecto a las bases de datos relacionales, es que no es necesario seguir un esquema. Los documentos de una misma colección - concepto similar a una tabla de una base de datos relacional -, pueden tener esquemas diferentes.
Imaginemos que tenemos una colección a la que llamamos Personas. Un documento podría almacenarse de la siguiente manera:
{
Nombre: "Pedro",
Apellidos: "Martínez Campo",
Edad: 22,
Aficiones: ["fútbol","tenis","ciclismo"],
Amigos: [ { Nombre:"María", Edad:22
}
}, { Nombre:"Luis", Edad:28 }
]
El documento anterior es un clásico documento JSON. Tiene strings, arrays, subdocumentos y números. En la misma colección podríamos guardar un documento como este:
{
Nombre: "Luis",
Estudios: "Administración y Dirección de Empresas",
Amigos:12
}
Este documento no sigue el mismo esquema que el primero. Tiene menos campos, algún campo nuevo que no existe en el documento anterior e incluso un campo de distinto tipo.
Esto que es algo impensable en una base de datos relacional, es algo totalmente válido en MongoDB.
¿Cómo funciona MongoDB?
MongoDB está escrito en C++, aunque las consultas se hacen pasando objetos JSON como parámetro. Es algo bastante lógico, dado que los propios documentos se almacenan en BSON. Por ejemplo:
db.Clientes.find({Nombre:"Pedro"});
La consulta anterior buscará todos los clientes cuyo nombre sea Pedro.
MongoDB viene de serie con una consola desde la que podemos ejecutar los distintos comandos. Esta consola está construida sobre JavaScript, por lo que las consultas se realizan utilizando ese lenguaje. Además de las funciones de MongoDB, podemos utilizar muchas de las funciones propias de JavaSciprt. En la consola también podemos definir variables, funciones o utilizar bucles.
Si queremos usar nuestro lenguaje de programación favorito, existen drivers para un gran número de ellos. Hay drivers oficiales para C#, Java, Node.js, PHP, Python, Ruby, C, C++, Perl o Scala. Aunque estos drivers están soportados por MongoDB, no todos están en el mismo estado de madurez. Por ejemplo el de C es una versión alpha. Si queremos utilizar un lenguaje concreto, es mejor revisar los drivers disponibles para comprobar si son adecuados para un entorno de producción.
¿Dónde se puede utilizar MongoDB?
Aunque se suele decir que las bases de datos NoSQL tienen un ámbito de aplicación reducido. Cualquier aplicación que necesite almacenar datos semi estructurados puede usar MongoDB. Es el caso de las típicas aplicaciones CRUD o de muchos de los desarrollos web actuales.
Eso sí, aunque las colecciones de MongoDB no necesitan definir une esquema, es importante que diseñemos nuestra aplicación para seguir uno. Tendremos que pensar si necesitamos normalizar los datos, denormalizarlos o utilizar una aproximación híbrida. Estas decisiones pueden afectar al rendimiento de nuestra aplicación. En definitiva el esquema lo definen las consultas que vayamos a realizar con más frecuencia.
MongoDB es especialmente útil en entornos que requieran escalabilidad. Con sus opciones de replicación y sharding, que son muy sencillas de configurar, podemos conseguir un sistema que escale horizontalmente sin demasiados problemas.
¿Dónde no se debe usar MongoDB?
En esta base de datos no existen las transacciones. Aunque nuestra aplicación puede utilizar alguna técnica para simular las transacciones, MongoDB no tiene esta capacidad. Solo garantiza operaciones atómicas a nivel de documento. Si las transacciones son algo indispensable en nuestro desarrollo, deberemos pensar en otro sistema.
Tampoco existen los JOINS. Para consultar datos relacionados en dos o más colecciones, tenemos que hacer más de una consulta. En general, si nuestros datos pueden ser estructurados en tablas, y necesitamos las relaciones, es mejor que optemos por un RDBMS clásico.
Y para finalizar, están las consultas de agregación. MongoDB tiene un framework para realizar consultas de este tipo llamado Aggregation Framework. También puede usar Map Reduce. Aún así, estos métodos no llegan a la potencia de un sistema relacional. Si vamos a necesitar explotar informes complejos, deberemos pensar en utilizar otro sistema. Eso sí, esta es una brecha que MongoDB va recortando con cada versión. En poco tiempo esto podría dejar de ser un problema.