La estructura de datos es uno de los aspectos más importantes para decidir que sistema de base de datos utilizar.
Para los casos en los que se requiere flexibilidad, un sistema NoSQL es la opción a elegir.
Uno de los sistemas NoSQL más populares hoy en día en MongoDB. Este puede ser una gran herramienta si sabemos como utilizarlo correctamente.
¿Qué es MongoDB?
MongoDB es un manejador de base de datos NoSQL orientado a documentos. Específicamente documentos de tipo BSON, el cual es una representación binaria de un archivo JSON.
No es del todo correcto decir que es una base de datos en MongoDB es “orientada a objetos”, ya que existen manejadores de bases de datos propiamente orientados a objetos. MongoDB esta orientado a documentos, no objetos.
Sin embargo, tampoco estaría del todo mal. Lo que guardaríamos en la base de datos es literalmente un objeto JSON. Bueno… BSON. Y este lo podemos manipular de la misma forma que lo haríamos con un objeto JSON normal en nuestra aplicación.
Preguntas relacionadas:
MongoDB vs RDBMS
Para ver un ejemplo, pongamos el caso de un carrito de compras muy sencillo.
Esta seria la representación de un registro en un RDBMS tradicional:
Esto lo podríamos modelar en MongoDB de la siguiente manera:
Por lo tanto, para ver toda la data de un carrito solo seria necesaria una consulta sumamente sencilla. Por ejemplo, si quisiéramos consultar el carrito con «id» igual a 1 y todos los artículos del mismo bastaría con la siguiente consulta:
db.carritos.find( { id: 1 } )
En el que «carritos» es la colección en MongoDB y se llama al método find al cual se le pasa como parámetro un objeto JSON con datos a consultar. Es decir, se buscaran todos los objetos en la colección «carritos» que tengan dentro de sus propiedades un campo «id» y que este tenga el valor de 1.
Esto reduce el trabajo a nivel de código de aplicación. Ya que facilita la comunicación entre las interfaces de nuestro proyecto al manejar una misma sintaxis, en caso de ser aplicaciones en JavaScript.
O si estas utilizando otro lenguaje, no es necesario hacer mapeos complejos para comunicar las diferentes capas de la aplicación, ya que la mayoría de lenguajes tiene librerías que facilitan el manejo de objetos JSON.
Preguntas relacionadas:
Estructura de los datos en MongoDB
Esto permite que podamos tener estructuras de datos dinámicas. Las cuales son ideales para el desarrollo de aplicaciones actuales, en las que la gran variedad de datos que se pueden obtener a través de diferentes dispositivos puede tener formas muy diferentes. Sin mencionar que con el constante cambio que tienen las aplicaciones y tecnologías hoy en día, la data que manejamos también podría cambiar muy repentinamente.
Estos cambios podrían ser un gran dolor de cabeza en bases de datos relacionales. Si tenemos que agregar campos, o rediseñar el esquema, habría que ejecutar protocolos de migración de datos para no tener que tumbar el sistema momentáneamente. Como ven, suena sencillo pero conlleva una gran cantidad de trabajo . Nada bueno.
Por el contrario, MongoDB al no imponer un esquema a los datos, cambiar la estructura de datos es tan fácil como simplemente insertar un documento con una estructura diferente y ya. No estoy diciendo que no haya que trabajar un poco en los protocolos de migración ni mucho menos. Pero sin son mas sencillos de hacer y tenemos mas libertades para hacerlo.
Cabe destacar, que para los casos en los que se requiere algún tipo de esquema, o al menos validar cierto tipo de datos, MongoDB nos proporciona validación de documentos. Con este podemos agregar control sobre la variabilidad de los datos sin necesidad de depender de validaciones a nivel de código de la aplicación.
Es decir, que tenemos la libertad de decidir si utilizamos un esquema cerrado, o uno mas liberal.
Agregar un esquema a una colección en MongoDB
db.createCollection("carritos", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "id", "usuario", "estatus" ],
properties: {
id: {
bsonType: "int",
description: "El identificador del carrito.Debe ser entero."
},
usuario: {
bsonType: "string",
maxLength: 30,
description: "El usuario del carrito. Debe ser string de máximo 30 carácteres"
},
estatus: {
enum: [ "activo", "inactivo" ],
description: "El estatus. Solo puede ser activo o inactivo."
}
}
}
}
})
Aquí estamos diciendo que tanto el id, el usuario y el estatus son obligatorios. Además de que el id debe ser entero, el usuario un string de máximo 30 caracteres y el estatus solo puede tomar los valores «activo» o «inactivo».
Escalabilidad en MongoDB
Y esto también está relacionado con la forma en que se estructuran los datos en MongoDB. Al manejar documentos los cuales están compuestos por objetos, no es necesario el uso de relaciones con tablas foráneas. Por lo tanto, la partición o el sharding de una colección de documentos es mucho más sencilla de aplicar que en bases de datos relacionales.
Soporte y Comunidades de MongoDB
MongoDB da soporte oficial a los drivers de los lenguajes principales. Sin embargo, también existen drivers soportados por la comunidad para los lenguajes que no se les preste soporte oficial.
También tiene una comunidad muy activa que siempre está ansiosa de ayudar y ofrecer soluciones a problemas de cualquier tipo. Ya sea en StackOverflow o incluso en grupos de Slack.
Conclusión
Por estas características, MongoDB es una herramienta que cae como anillo al dedo para el desarrollo de aplicaciones como redes sociales, aplicaciones móviles, CMS, entre otras, que debido a lo antes mencionado, requieren de una base de datos que ofrezca alto rendimiento y flexibilidad, a la vez que mantiene consistencia y seguridad en los datos.
Personalmente, pienso que MongoDB es una herramienta muy fácil de aprender, bastante útil y sumamente divertida. Principalmente ya que cuando estamos trabajando en proyectos personales o por hobby, no tenemos que pasar por todo el proceso de definición y esquema de tablas y relaciones. Sencillamente con que este corriendo MongoDB ya le podemos enviar data desde nuestras aplicaciones.
Además, me parece perfecto para enseñar a niños o iniciados en materia de almacenamiento de datos, ya que el lenguaje de consultas no necesita de joins para realizar consultas relativamente sencillas, lo que reduce la curva de aprendizaje y hace más divertido el proceso, sin mencionar que si utiliza en conjunto con Node y Angular o React, tampoco es necesario aprender varios lenguajes para realizar una aplicación completa.
Publicado el 28 de abril de 2018