Diseño de Repositorios NoSQL Con MongoDB
Diseño de Repositorios NoSQL Con MongoDB
RESUMEN 7
INTRODUCCIÓN 8
1 GENERALIDADES 9
2 METODOLOGÍA 10
4.3.1 ANALÍTICAS: 12
4.3.2 MAPREDUCE. 13
4.3.3 ESCALABILIDAD 13
4.3.4 DISPONIBILIDAD 13
4.3.5 REDUNDANCIA 13
4.3.6 FLEXIBILIDAD 14
3
4
6 MONGODB 16
6.5.1 REFERENCIAS 21
6.5.3 COLECCIONES 22
6.5.4 RELACIONES 23
A. RELACIONES 1 A 1 23
B. RELACIONES 1 A VARIOS 24
6.5.6 LA INCRUSTACIÓN 30
7 CONCLUSIONES 40
8 REFERENCIAS BIBLIOGRÁFICAS 41
6
ÍNDICE DE FIGURAS
RESUMEN
En la actualidad y en el futuro, la cantidad de datos digitales que se genera el mundo se
ha Multiplicado de forma exponencial. Las redes sociales, los archivos de imagen,
videos, sonidos y el acceso cada vez más fácil a la Internet, por los distintos dispositivos
que disponen las personas, hacen que el volumen de tráfico y de datos que se generan
sea cada vez mayor. Y a través del tiempo con el surgimiento de las bases de datos
relacionales las empresas encontraron el aliado perfecto para cubrir sus necesidades de
almacenamiento, disponibilidad, copiado de seguridad y gestión de sus datos.
Pero debido a las tendencias actuales del uso masivo de Internet, este tipo de sistemas
comenzó a experimentar dificultades técnicas, en algunos casos bloqueantes, que
impiden el buen funcionamiento de los sistemas de algunas de las empresas más
importantes de Internet. Este tipo de datos que son masivamente generados reciben un
nombre: BigData, y un tipo de tecnología surgió para tratar de poner solución a muchos
de los problemas de los que adolecen los sistemas de almacenamiento tradicionales
(modelo relacional) cuando intentan manejar este tipo de datos masivos.
Esta tecnología emergente se conoce como bases de datos no relacionales o NoSQL
acrónimo de Not only SQL – No sólo SQL y que han llegado con la intención de hacer
frente a las bases de datos relacionales utilizadas por la mayoría de los usuarios.
En este sentido, se orienta la presente monografía, en la cual se expondrá una referencia
en el diseño de una base de datos NoSQL, analizando las características del Gestor de
bases de datos, específicamente MongoDb.
MongoDB es una base de datos de documentos de código abierto que ofrece alto
rendimiento, alta disponibilidad y escalado automático, MongoDB es la más
representativa de las bases de datos NoSQL. También podemos denominarla con el
término de base de datos documental, ya que almacenara documentos JSON y no
registros, como sucede en las tablas de las bases de datos relacionales.
Palabras clave: Base de datos, Repositorio, SQL, NoSQL, BigData., MongoDB, JSON,
ACID, BASE.
8
INTRODUCCIÓN
El éxito de cada negocio se basa en su capacidad de utilizar, adaptarse a las tecnologías
emergentes, y en particular de software y datos. Las empresas quieren desarrollar
rápidamente nuevos productos y servicios digitales para impulsar la expansión de las
fuentes de ingresos, mejorar la experiencia del cliente. Para este cometido las empresas
adoptan diferentes estrategias, metodologías agiles, DevOps, micro servicios, servicios
en la nube, servicios móviles, inteligencia artificial.
A pesar de estas nuevas estrategias para hacer frente a las iniciativas de la tecnología,
la transformación y adaptación y el crecimiento exponencial de información, la
consolidación de las redes sociales utilizada por millones de usuarios, llevan a tener que
realizar modificaciones que faciliten la administración de los datos. Según (Schönberger,
pág. 19). A esto surgen las bases de datos no relacionales (NoSql), y entre los gestores
de datos emergentes como Cassandra, Redis entre otros, se eligió MongoDB, porque
respondió a estos retos mediante la creación de una base de tecnología que permite a
los equipos de desarrollo adaptarse a través de: 1. El modelo de datos de documentos,
2. Un diseño de sistemas distribuidos, 3. Una experiencia unificada, la libertad de ejecutar
en cualquier lugar.
Con estas capacidades, se puede construir una plataforma inteligente de datos
operativos, sustentado por MongoDB. con la finalidad de dejar de lado el modelo
relacional, pero Si venimos de un trasfondo “100% relacional”, nuestro primer instinto es
tratar de adaptar lo que sabemos a este nuevo modelo, pero así no solo perdemos sus
mejores virtudes, sino que podemos perjudicar el producto. En esta monografía, veremos
cómo identificar y realizar el modelado de una base de datos NoSQL con MongoDB,
aprovechando las características que este nos proporciona. Se presenta una alternativa
de modelado de datos con mongoDB, para los que tienen interés de adentrarse en este
gestor de base de datos en el desarrollo de sus aplicaciones. El diseño de datos deberá
pasar necesariamente por un análisis detallado de Modelo de datos conceptuales (MDL),
el Modelo de Datos Lógicos (LDM)y el Modelo de datos Físico (PDM). Este análisis de
diseño se pasará por alto en la presente monografía.
9
1 GENERALIDADES
1.1 ANTECEDENTES GENERALES
No todas las aplicaciones necesitan almacenar y procesar datos de la misma manera, la
arquitectura de almacenamiento debería pensarse de forma acorde a las necesidades.
Si se pretende desarrollar una aplicación que requiera la lectura/escritura de millones de
datos y pueda dar servicio a millones de usuarios sin perder rendimiento (escalabilidad),
entonces debe plantearse el uso de una base de datos NoSQL. Pues, el término NoSQL
se refiere al procesamiento de información en bases de datos que intentan solventar las
limitaciones que el modelo relacional encuentra en entornos de almacenamiento masivo
de datos, y concretamente al momento de escalar, donde es necesario disponer de
servidores de alta performance y de balanceo de carga. (Soumendra, Madhu, & Harsha,
pág. 14). Una vez tomada la decisión de la implementación de una base de datos
NoSQL, se tiene entre los más importantes gestores los siguientes: redis, Casandra,
MongoDB, de los cuales centraremos la atención en MongoDB.
2 METODOLOGÍA
Para el presente trabajo se utilizarán los siguientes métodos de investigación:
Método Bibliográfico, debido a que se realizará la lectura y compilación de
libros relacionados al tema de estudio.
Método Analítico, debido a que se procederá a revisar y analizar
ordenadamente documentos relacionados al tema de estudio, para la
redacción del presente trabajo.
El creador del término “NoSQL” fue Carlo Strozzi, quién en 1998 Según (Strozzi, 2017)
lo utilizó para referirse a una base de datos específica, a la cual utilizaba como base de
estudio. Luego, el concepto NoSQL fue reintroducido por varios investigadores, entre los
más destacados se encuentran Eric Evans y Johan Oskarsson, ambos en 2009. Eric
Evans se refirió a NoSQL para referirse específicamente a bases de datos no
relacionales. Johan Oskarsson definió el término refiriéndose a la variedad de sistemas
de bases de datos distribuidas y no relacionales que evolucionan constantemente.
Según (Evans, 2009) .
datos no proveen ACID, con lo cual las actualizaciones son una de las características
más complejas del modelo. Ya que, por ejemplo, no es posible propagar de manera
transaccional las actualizaciones de múltiples nodos en todo el sistema.
La cuestión de escalabilidad enfocado a la escalabilidad horizontal, no solo aplicable
para sistemas NoSQL, sino también para Cloud Computing. Se añaden más recursos
(como, por ejemplo, puede ser un disco duro o añadir más máquinas) a un nodo particular
dentro de un sistema. Este concepto de escalabilidad horizontal se dirige hacia la alta
disponibilidad del hardware; en la mayoría de los casos, no es confiable, con lo cual, es
necesario ampliar recursos.
Además de la carencia de un esquema predeterminado, la principal característica de las
bases de datos NoSQL, es que están pensadas para manipular cantidades de
información que crecen de manera muy rápida y de cantidad exponencial. También
proveen diversos tipos de esquemas de representación de la información, como lo son,
el esquema orientado a documentos, clave/valor, grafos y columnas.
En NoSQL, generalmente los datos son recuperados de manera más rápida que en un
RDBMS. Sin embargo, las consultas que se pueden hacer son más limitadas y requieren
trasladar complejidad a la aplicación. Es decir, para aquellas aplicaciones que generan
informes empleando consultas complejas, NoSQL a priori no sería inmediatamente
adecuado.
4.3.1 ANALÍTICAS:
Muchas bases de datos NoSQL son muy adecuadas para la realización de consultas
analíticas. Los desarrolladores pueden utilizar los mismos lenguajes de consulta para
realizar consultas analíticas en vez de realizar consultas atómicas. Normalmente esto
será alguna variación de una consulta.
13
4.3.2 MAPREDUCE.
Los términos Map Reduce intentan decir "agrupar por y seleccionar” al estilo “group by
/select” de SQL, aclarando esto último, para no confundir a las personas que están
acostumbradas al lenguaje SQL.
4.3.3 ESCALABILIDAD
Las Bases de datos NoSQL están diseñadas para escalar Horizontalmente. Es una de
las principales razones por las que se elige optar por una base de datos NoSQL. Por lo
general, con una base de datos relacional como SQL Server u Oracle, la escalabilidad
es lograda con la compra de servidores y de almacenamiento más grande y más rápido,
o con el empleo de especialistas para proporcionar un ajuste adicional. A diferencia de
las bases de datos relacionales, las bases de datos NoSQL están diseñadas para la
escalabilidad en forma transparente. En este aspecto, están preparadas para mantener
la misma velocidad de respuesta independientemente de la capacidad utilizada para el
almacenamiento.
4.3.4 DISPONIBILIDAD
La disponibilidad de un sistema es el resultado de los componentes requeridos para una
tarea específica. Las bases de datos NoSQL se construyen principalmente sobre la base
de alcanzar alta disponibilidad y escalabilidad, a través de la distribución sobre hardware
accesible o económico (commodity).
4.3.5 REDUNDANCIA
Las bases de datos NoSQL también están diseñadas para trabajar con datos replicados,
lo cual puede entenderse como tener redundancia en la información. Ahora bien, el
hecho de contar con redundancia de información no implica que sea una falla grave de
las bases de datos NoSQL, como sí podría serlo en las bases de datos relacionales (en
el caso que exista algún escenario en que se pueda presentar).
14
4.3.6 FLEXIBILIDAD
Si bien los problemas de representación de datos son muy diferentes en bases de datos
NoSQL, hay una flexibilidad en cómo se almacenan los datos para no comprometer los
tiempos de ejecución y los tiempos de respuesta.
Escalabilidad Automatizada.
Evitar la pérdida de datos.
Asegurar alta performance.
Mejorar la administración.
Coste acorde a la necesidad.
Existe un acrónimo análogo a ACID para NoSQL que prima disponibilidad frente a
consistencia. Dicho concepto es BASE (Basically Available, Soft state, Eventual
consistency).
Por lo general, estos documentos son referenciados por una clave que los representa
unívocamente.
Además de la búsqueda por clave de documentos, estas Bases de Datos suelen ofrecer
una API o lenguaje de consultas que permite recuperar documentos en base a su
contenido.
6 MONGODB
MongoDB (de la palabra en inglés “humongous” que significa enorme,gigantesco) es un
sistema de base de datos NoSQL orientado a documentos, desarrollado bajo el concepto
de código abierto.
MongoDB forma parte de la nueva familia de sistemas de base de datos NoSQL. En vez
de guardar los datos en tablas como lo hacen las bases de datos relacionales, MongoDB
guarda estructuras de datos en documentos tipo JSON con un esquema dinámico
(MongoDB llama ese formato BSON), haciendo que la integración de los datos en ciertas
aplicaciones sea más fácil y rápida.
17
Se ha puesto mucho esfuerzo en hacer que MongoDB sea fácil de comenzar y un placer
utilizar. MongoDB tiene un modelo de datos amigable para el desarrollador, una
configuración amigable para el administrador, opciones y API de lenguaje de
sentimientos naturales presentadas por los controladores y la base de datos, MongoDB
permitie programar en lugar de preocuparse sobre el almacenamiento de datos. Según:
(Kristina Chodorow, pág. 21).
MongoDB es una base de datos de documentos de código abierto que proporciona alto
rendimiento, alta disponibilidad y escalado.
JSON. Los valores de los campos pueden incluir otros documentos, matrices y matrices
de documentos.
Agregación de datos
Búsqueda de textos y consultas geoespaciales .
19
Failover automático.
Redundancia de datos.
{ "firstname": "Peter",
"lastname": "Membrey",
"phone_numbers": [
"+852 1234 5678",
"+44 1234 565 555"
]
}
Como los documentos son libres de esquemas, MongoDB no requiere que en una lista
de documentos aparezcan siempre la misma cantidad de campos para un documento.
Esto quiere decir que en el ejemplo si no se conocería ningún teléfono de una persona,
directamente la lista “phone_numbers” no aparecería.
21
La relación por documento embebido significa que podemos incluir uno o más
documentos dentro de un mismo documento, también se los denominan modelos de
datos de normalizados por el hecho de que se pueden almacenar más de un documento
dentro de un mismo documento sin realizar ninguna relación hacia otros documentos.
Según (MongoDB, Inc., 2018).
6.5.1 REFERENCIAS
En este ejemplo, los documentos “contact” el campo “user_id” incluye la referencia al
documento “user”.
6.5.3 COLECCIONES
Una colección en MongoDB es un contenedor de documentos, análogo a lo que es una
tabla en un RDBMS. Según (MongoDB, Inc)
6.5.4 RELACIONES
Las relaciones en MongoDB se entienden como la información que se puede encontrar
asociada en un mismo documento (información embebida) o referenciada, cuestión que
se mencionó en la “Estructura de modelo”. Según (MongoDB, Inc, 2018).
En MongoDB existen relaciones 1 a 1 y relaciones 1 a N (Varios). Si bien se pueden
modelar relaciones N a N (Varios a Varios).
A. RELACIONES 1 A 1
Estas relaciones se utilizan cuando tenemos relacionada un conjunto de información que
corresponde a una entidad de datos. Dicha entidad de datos puede ser relacionada o
embebida Según (MongoDB, Inc). Es decir que podemos representar de dos maneras
relaciones 1 a 1, presentadas en los siguientes ejemplos:
{ _id: "joe",
name: "Joe Bookreader"
}
{ patron_id: "joe",
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
En este ejemplo (información relacionada) se muestra que para acceder al nombre que
se encuentra en el primer documento, se debe acceder a “patron_id” y luego acceder al
primer documento para acceder al nombre. La desventaja que tiene que se debe realizar
una consulta adicional para obtener una información que es propia de una misma
entidad.
{
_id: "joe",
name: "Joe Bookreader",
address:
24
{
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
}
B. RELACIONES 1 A VARIOS
Estas relaciones se utilizan cuando se relaciona un documento que posee referencias a
más de un documento. Se muestran los siguientes ejemplos que muestran la manera de
representar estos tipos de relaciones. Según (MongoDB, Inc)
{
_id: "joe",
name: "Joe Bookreader"
}
{
patron_id: "joe",
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
{
patron_id: "joe",
street: "1 Some Other Street",
city: "Boston",
state: "MA",
zip: "12345"
}
25
En una base de datos relacional, las relaciones de varios a varios modelan con
frecuencia con tablas de unión, que simplemente unen registros de otras tablas.
Podría verse tentado a replicar lo mismo con documentos y producir un modelo de datos
que tenga un aspecto similar al siguiente.
Author documents:
{"id": "a1", "name": "Thomas Andersen" }
{"id": "a2", "name": "William Wakefield" }
Book documents:
{"id": "b1", "name": "Azure Cosmos DB 101" }
{"id": "b2", "name": "Azure Cosmos DB for RDBMS Users" }
{"id": "b3", "name": "Taking over the world one JSON doc at a time" }
{"id": "b4", "name": "Learn about Azure Cosmos DB" }
{"id": "b5", "name": "Deep Dive in to Azure Cosmos DB" }
Joining documents:
{"authorId": "a1", "bookId": "b1" }
{"authorId": "a2", "bookId": "b1" }
{"authorId": "a1", "bookId": "b2" }
{"authorId": "a1", "bookId": "b3" }
Esto funcionaría. Sin embargo, cargar un autor con sus libros o cargar un libro con su
autor siempre requeriría al menos dos consultas adicionales en la base de datos. Una
consulta para el documento de unión y, a continuación, otra consulta para capturar el
documento real que se está uniendo.
Si todo lo que hace esta tabla de unión es combinar dos datos, nos preguntamos por qué
no quitarla completamente.
Author documents:
{"id": "a1", "name": "Thomas Andersen", "books": ["b1, "b2", "b3"]}
{"id": "a2", "name": "William Wakefield", "books": ["b1", "b4"]}
Book documents:
{"id": "b1", "name": "Azure Cosmos DB 101", "authors": ["a1", "a2"]}
{"id": "b2", "name": "Azure Cosmos DB for RDBMS Users", "authors": ["a1"]}
{"id": "b3", "name": "Learn about Azure Cosmos DB", "authors": ["a1"]}
{"id": "b4", "name": "Deep Dive in to Azure Cosmos DB", "authors": ["a2"]}
Al trabajar con bases de datos relacionales, hemos aprendido durante años a normalizar
constantemente.
28
La normalización de los datos implica normalmente tomar una entidad, como una
persona, y dividirla en piezas de datos discretas. En el ejemplo anterior, una persona
puede tener varios registros de información de contacto, así como varios registros de
dirección. Podemos ir incluso un paso más allá y desglosar detalles de contacto
extrayendo aún más campos comunes, como un tipo. Al igual que ocurre con la dirección,
cada registro aquí tiene un tipo como doméstico o empresarial.
Ahora veamos cómo modelamos los mismos datos como una entidad independiente en
una base de datos de documentos.
{
"id": "1",
"firstName": "Thomas",
"lastName": "Andersen",
"addresses": [
{
"line1": "100 Some Street",
"line2": "Unit 1",
"city": "Seattle",
"state": "WA",
"zip": 98012
}
],
"contactDetails": [
{"email": "[email protected]"},
{"phone": "+1 555 555-5555", "extension":
5555}
]
}
6.5.6 LA INCRUSTACIÓN
De forma general, las operaciones con Join, (operación de manejo de datos que implica
tablas relacionadas entre sí), típicas de las bases de datos relacionales pueden resultar
no muy escalables, y puesto que éste es uno de los principales propósitos de MongoDB,
parece lógico no trabajar exactamente con Join.
A pesar de lo anterior, se debe buscar una forma de trabajar que proporcione una
funcionalidad parecida a los Joins, en tanto en cuanto necesitamos hacer consultas con
cierta complejidad. Una forma intuitiva de tratar este asunto es utilizar enlaces indirectos
dentro de la declaración de documentos, a modo de clave indirecta utilizada en bases de
datos relacionales. Según: (MicrosoftDocs)
El siguiente ejemplo muestra la base de datos de una cadena de tiendas, pertenecientes
a la colección tienda, que tienen asociados un identificador único, un nombre y la central
a la que pertenecen, en su caso. Primeramente, se muestra cómo se insertaría en la
base de datos, para continuar con una selección de información.
En estos ejemplos se relacionó las tiendas de Carlos V, y Dos Hermanas con una sede
central de la cual dependen: Gran Plaza.
Una rápida consulta nos daría las tiendas que dependen de Gran Plaza:
El resultado de lo anterior sería la aparición por pantalla de los documentos con nombre
Dos Hermanas, y CarlosV.
Por supuesto, la potencialidad de esta función se incrementa con el uso de arrays, siendo
capaces entonces de crear dependencias múltiples:
Se Puede observar que la nueva tienda creada, Avd Ciencias tiene dos dependencias,
una con Carlos V y otra con Gran Plaza. Esto se ha conseguido asociando el iD de las
dos tiendas, a la central de la que depende la recientemente creada.
De la misma forma, hay otras acciones que otorgan mayor potencial a MongoDB, como
es el anidamiento de documentos. En MongoDB se puede trabajar con documentos
embebidos, facilitando la tarea de tratar con los datos en algunos casos específicos:
>db.tienda.find({‘servicios.frescos’: ‘Abart’})
Este último comando encontrará las tiendas que tienen como proveedor de servicios de
productos frescos aquel con nombre Abart.
{
"id": "1",
"name": "What's new in the coolest Cloud",
"summary": "A blog post by someone real famous",
"comments": [
{"id": 1, "author": "anon", "comment": "something useful, I'm sure"},
{"id": 2, "author": "bob", "comment": "wisdom from the interwebs"},
…
{"id": 100001, "author": "jane", "comment": "and on we go ..."},
…
{"id": 1000000001, "author": "angry", "comment": "blah angry blah angry"},
…
{"id": ∞ + 1, "author": "bored", "comment": "oh man, will this ever end?"},
]
}
El problema con este ejemplo es que la matriz de comentarios no está limitada, lo que
significa que no hay ningún límite (práctico) para el número de comentarios que puede
tener cualquier publicación única. Esto será un problema, ya que el tamaño del
documento puede aumentar notablemente.
Puesto que el tamaño del documento aumenta la capacidad de transmisión de los datos
a través de la conexión, así como la lectura y actualización del documento, a escala, se
producirá un impacto en ellos.
33
En este caso sería mejor tener en cuenta el siguiente modelo. Según: (MicrosoftDocs).
"id": "1",
"name": "What's new in the coolest Cloud",
"summary": "A blog post by someone real famous",
"recentComments": [
{"id": 1, "author": "anon", "comment": "something
useful, I'm sure"},
{"id": 2, "author": "bob", "comment": "wisdom from
the interwebs"},
{"id": 3, "author": "jane", "comment": "....."}
]
}
Comment documents:
{
"postId": "1"
"comments": [
{"id": 4, "author": "anon", "comment": "more
goodness"},
{"id": 5, "author": "bob", "comment": "tails from the
field"},
...
{"id": 99, "author": "angry", "comment": "blah angry
blah angry"}
]
},
{
"postId": "1"
"comments": [
{"id": 100, "author": "anon", "comment": "yet more"},
...
{"id": 199, "author": "bored", "comment": "will this
ever end?"}
]
}
Este modelo tiene los tres últimos comentarios insertados en la propia publicación, que
es una matriz con un límite fijo esta vez. Los demás comentarios se agrupan en lotes
de 100 comentarios y se almacenan en documentos independientes. El tamaño del lote
se ha seleccionado como 100, puesto que nuestra aplicación ficticia permite al usuario
cargar 100 comentarios a la vez.
34
Otro caso en el que la incrustación de datos no es una buena opción es cuando los datos
incrustados se utilizan a menudo en documentos y cambian con frecuencia.
{
"id": "1",
"firstName": "Thomas",
"lastName": "Andersen",
"holdings": [
{
"numberHeld": 100,
"stock": { "symbol": "zaza", "open": 1, "high": 2, "low": 0.5 }
},
{
"numberHeld": 50,
"stock": { "symbol": "xcxc", "open": 89, "high": 93.24, "low": 88.87 }
}
]
}
Por lo tanto, la incrustación de datos funciona bien en muchos casos, pero está claro que
hay escenarios en los que la de normalización de los datos provocará más problemas
que ventajas.
35
Stock documents:
{
"id": "1",
"symbol": "zaza",
"open": 1,
"high": 2,
"low": 0.5,
"vol": 11970000,
"mkt-cap": 42000000,
"pe": 5.89
},
{
"id": "2",
"symbol": "xcxc",
"open": 89,
"high": 93.24,
"low": 88.87,
"vol": 2970200,
"mkt-cap": 1005000,
"pe": 75.82
}
Publisher document:
{
"id": "mspress",
"name": "Microsoft Press",
"books": [ 1, 2, 3, ..., 100, ..., 1000]
}
Book documents:
{"id": "1", "name": "Azure Cosmos DB 101" }
{"id": "2", "name": "Azure Cosmos DB for RDBMS Users" }
{"id": "3", "name": "Taking over the world one JSON doc at a time" }
...
{"id": "100", "name": "Learn about Azure Cosmos DB" }
...
{"id": "1000", "name": "Deep Dive in to Azure Cosmos DB" }
Publisher document:
{
"id": "mspress",
"name": "Microsoft Press"
}
Book documents:
{"id": "1","name": "Azure Cosmos DB 101", "pub-id": "mspress"}
{"id": "2","name": "Azure Cosmos DB for RDBMS Users", "pub-id": "mspress"}
{"id": "3","name": "Taking over the world one JSON doc at a time"}
...
{"id": "100","name": "Learn about Azure Cosmos DB", "pub-id": "mspress"}
...
{"id": "1000","name": "Deep Dive in to Azure Cosmos DB", "pub-id": "mspress"}
Author documents:
{
"id": "a1",
"firstName": "Thomas",
"lastName": "Andersen",
"countOfBooks": 3,
"books": ["b1", "b2", "b3"],
"images": [
{"thumbnail": "http://....png"}
{"profile": "http://....png"}
{"large": "http://....png"}
]
},
{
"id": "a2",
"firstName": "William",
"lastName": "Wakefield",
"countOfBooks": 1,
"books": ["b1"],
"images": [
{"thumbnail": "http://....png"}
]
}
Book documents:
{
"id": "b1",
"name": "Azure Cosmos DB 101",
"authors": [
{"id": "a1", "name": "Thomas Andersen",
"thumbnailUrl": "http://....png"},
{"id": "a2", "name": "William Wakefield",
"thumbnailUrl": "http://....png"}
]
}, {
"id": "b2",
"name": "Azure Cosmos DB for
RDBMS Users",
"authors": [
{"id": "a1", "name": "Thomas
Andersen", "thumbnailUrl":
"http://....png"},
]
}
39
Aquí hemos seguido principalmente el modelo de incrustación, donde los datos de otras
entidades se incrustan en el documento de nivel superior, pero se establece la referencia
en otros datos.
Si se observa el documento del libro, vemos algunos campos interesantes cuando nos
centramos en la matriz de autores. Hay un campo id que es el campo que se utiliza para
volver a hacer referencia a un documento de autor, una práctica estándar en un modelo
normalizado, pero también tenemos name y thumbnailUrl. Se pudo haber parado en id y
dejar la aplicación para obtener información adicional que necesita a partir del documento
de autor correspondiente mediante el "vínculo", pero como nuestra aplicación muestra el
nombre del autor y una imagen en miniatura con cada libro mostrado, puede ahorrar un
viaje de ida y vuelta al servidor por libro en una lista mediante la normalización
de algunos datos del autor.
Por supuesto, si cambia el nombre del autor o desean actualizar sus fotos, tendríamos
que realizar una actualización de cada libro publicado, pero para nuestra aplicación, que
se basa en la suposición de que los autores no cambian sus nombres muy a menudo, se
trata de una decisión de diseño aceptable.
En el ejemplo hay valores de adiciones calculadas previamente para ahorrar un
procesamiento costoso en una operación de lectura. En el ejemplo, algunos de los datos
incrustados en el documento del autor son datos que se calculan en tiempo de
ejecución. Cada vez que se publica un nuevo libro, se crea un documento de libro y el
campo countOfBooks se establece en un valor calculado en función del número de
documentos de libro que existen para un autor concreto. Esta optimización sería
adecuada en sistemas en los que se realizan muchas operaciones de lectura, donde
podemos permitirnos hacer cálculos en las escrituras para optimizarlas.
La capacidad de tener un modelo con campos calculados previamente es posible porque
MongoDB admite transacciones de varios documentos. Muchos almacenes NoSQL no
pueden realizar transacciones en documentos y, por lo tanto, recomiendan las decisiones
de diseño, por ejemplo, "siempre incrustar todo", debido a esa limitación. Según:
(MicrosoftDocs).
40
7 CONCLUSIONES
Las bases datos NoSQL, también conocidas como “No sólo SQL”, implican una amplia
clase de sistemas de gestión de datos o mecanismos para el almacenamiento y
recuperación de datos que no cumplen con el modelo relacional, por lo cual no usan SQL
como lenguaje de consulta. Las principales características a las que están orientadas
son: analíticas, escalabilidad, disponibilidad, flexibilidad.
Las bases datos NoSQL han sido diseñadas con la finalidad de almacenar grandes
cantidades de datos.
8 REFERENCIAS BIBLIOGRÁFICAS
MongoDB, Inc. (2018). Model embedded one to one relationships between document.
Recuperado el Octubre de 2018, de https://docs.mongodb.com:
https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-one-
relationships-between-document
MongoDB, Inc. (Octubre de 2018). Model embedded one to one relationships between
documents. Recuperado el Octubre de 2018, de https://docs.mongodb.com:
https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-one-
relationships-between-documents/
MongoDB, Inc. (Octubre de 2018). Data model design. Recuperado el Octubre de 2018,
de docs.mongodb.com: https://docs.mongodb.com/manual/core/data-model-
design/
Oath Tech. (2013 - 2018). 10gen. Recuperado el Octubre de 2018, de techcrunch.com:
https://techcrunch.com/tag/10gen/
Ruano, F. J. (2018). Analisis y desarrollo de MongoDB y Redis en Java. Ruano.
Salazar, Y., Herrera, D., & Brenes, R. (Octubre de 2018). mongodb. Recuperado el
Octubre de 2018, de prezi.com “MongoDB”:
https://prezi.com/izjqg7o_aqqn/mongodb/
Schönberger, V. M. (2013). Big data : la revolución de los datos masivos. Turner.
Soumendra, M., Madhu, J., & Harsha, S. (2013). Big Data Imperatives: Enterprise ‘Big
Data’ Warehouse, ‘BI’ Implementations and Analytics. Apress.
Strozzi, C. (2017). NoSQL: a Non-SQL RDBMS. Recuperado el Octubre de 2018, de
www.strozzi.it: http://www.strozzi.it/cgi-
bin/CSA/tw7/I/en_US/nosql/Home%20Page