Tipos de Relaciones en MongoDB
En esta página:
Las aplicaciones que funcionan con bases de datos, en un estado inicial suelen ser sencillas y no requieren de consultas avanzadas a un documento de MongoDB. Pero con el paso del tiempo, ya sea por un requerimiento del proyecto u otro factor, es necesario realizar consultas más complejas que deben de funcionar con relaciones entre los datos. Las relaciones son habituales en las aplicaciones y en las que usan MongoDB también. En este post te compartiré los Tipos de Relaciones en MongoDB, vamos con ello.
Antes de continuar te invito a leer los siguientes artículos:
- Como usar MongoDB (Creación de Tabla Postres) – Parte 1
- Que es MongoDB y otros Detalles
- 5 GUIs para trabajar con MongoDB
- Tipos de Datos en MongoDB – Parte 1
- Como Conectar MongoDB Compass a MongoDB + Listado de Datos
- Puedes leer más en la categoría MongoDB
Asimismo, te invito a escuchar el Podcast: “Que Hacer Cuando Estamos En Casa” y “Ventajas y Desventajas de Usar 2 o Más Monitores Para un Desarrollador” (Anchor Podcast):
Spotify: | Sound Cloud: | Apple Podcasts | Anchor Podcasts |
Bien ahora continuemos con el Post: Tipos de Relaciones en MongoDB.
Tipos de Relaciones en MongoDB
A diferencia de las bases de datos relacionales, MongoDB no proporciona técnicas para definir buenas relaciones, pero brinda flexibilidad para definir el esquema de nuestra colección, esta es una de las principales ventajas de MongoDB.
MongoDB al ser flexible en cuanto a las relaciones, no es necesario seguir las reglas comunes y puedes definir el esquema en un formato de objeto como desees. Un esquema bien definido es muy importante en MongoDB para consultar los datos de manera más eficiente con menos prisa y también para mejorar la escalabilidad. Es posible que los objetos de esquema no deseados no afecten a tu base de datos en etapas anteriores, pero con la creciente cantidad de datos, las consultas pueden ralentizar el rendimiento y adquirir más memoria.
Las relaciones representan cómo los múltiples documentos están conectados lógicamente en MongoDB para crear una base de datos más manejable. Esto no es como normalizar en tablas, sino crear a través de relaciones incrustadas y referenciadas. Puedes configurar la relación según la necesidad de tus datos y el rendimiento de la consulta.
A continuación veamos los tipos de relaciones en MongoDB:
One to One (Uno a Uno)
One to One es la relación más fundamental. Una clave principal con un documento secundario incrustado crea una relación 1:1. Por ejemplo, un usuario puede tener un solo dni (documento nacional de identidad).
En una colección podria verse de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "_id": ObjectId("475236adtgh24782cfh42654"). "nombre": "Luis Gomez", "celular": "19945256784", "ciudad": "Lima", "dni": [ // Relación One to One (Uno a Uno) { "nro_dni": "62356456", "expira": "25 Ago 2095" } ] } |
Aquí, los detalles del dni del usuario están incrustados en nro del dni, no hay necesidad de crear una colección separada.
One to Many (Uno a Muchos)
Una relación de uno a muchos es tener un documento principal con una clave con documentos secundarios incrustados o referenciados, lo que crea una relación 1:N. Por ejemplo un usuario puede tener varias mascotas, para esto, podemos crear relaciones mediante incrustaciones o referencias.
En una colección podria verse de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "_id": ObjectId("475236adtgh24782cfh42654"), "nombre": "Luis Gomez", "celular": "19945256784", "ciudad": "Lima", "mascotas": [ // Relación One to Many (Uno a Muchos) { "_id": ObjectId("476259djftg4692dhg236548"), "nombre": "Doby", "tipo": "Perro" }, { "_id": ObjectId("349652ydflo3467qer167426"), "nombre": "Tom", "tipo": "Gato" }, { "_id": ObjectId("136974gsrty3495mft647925"), "nombre": "Alita", "tipo": "Loro" } ] } |
Aquí, los datos de las mascotas están incrustados en la referencia mascotas, si deseas obtener los nombres de las mascotas del usuario, puedes usar la referencia.
One to Few (Uno a Pocos)
Las relaciones de uno a pocos se utilizan para conectar los datos principales con algunos datos secundarios. Por ejemplo, un solo usuario puede tener varias certificados, para almacenar esos pocos documentos, se deben usar relaciones incrustadas para tener un mejor rendimiento en las consultas.
En una colección podria verse de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "_id": "ObjectId('CCC')", "nombre": "Luis Gomez", "celular": "19945256784", "ciudad": "Lima", "certificados": [ // Relación One to Few (Uno a Pocos) {"certificado": "Reparación de Bicicleta", "tiempo": "3 meses", "modalidad": "Presencial"}, {"certificado": "Diseño de Páginas Web", "tiempo": "3 meses", "modalidad": "Virtual"}, {"certificado": "Marketing", "tiempo": "3 años", "modalidad": "Presencial"} ] } |
One to Squillions (Uno a Squillions)
Ahora supongamos que tienes millones de registros secundarios, como comenarios de YouTube de un video viral, probablemente se harían cada vez más grandes, para esto no incrustamos documentos secundarios ni almacenamos las matrices de Id de objetos de colección a los que se hace referencia, ya que estarán fuera de límite. La única forma preferida será tener un documento de respuesta, luego almacenar el objectId de respuesta en los documentos del comentario.
En una colección podria verse de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "_id": ObjectId('DDER'), "nombre": "Fernanda Diaz", "responder": "fdiaz@correo.com", "usuarioId": "54GG974", } { time: ISODate("2029-05-27T05:35.236Z"), comentario: "Impresionantes colinas !", responder: ObjectId('DDER') // Referencia al documento de respuesta } |
Many to Many (Muchos a Muchos)
Ahora que hemos visto el padre único y los diferentes tipos de documentos secundarios, veamos la relación N:N. Por ejemplo tenemos conciertos, donde un usuario puede ser invitado a múltiples conciertos y un concierto puede tener múltiples usuarios.
En una colección podria verse de la siguiente manera, cuando un usuario tiene varios conciertos:
1 2 3 4 5 6 7 |
{ "_id": ObjectID("PDG3"), "nombre": "Pedro Rojas", "conciertos": [ObjectID("BCO1"), ObjectID("GUP2"), ObjectID("CGT4")] } |
Y cuando un concierto tiene varios usuarios:
1 2 3 4 5 6 7 |
{ "_id": ObjectID("CCU1"), "concierto": "Aerosmith Tour", "invitados": [ObjectID("BFG6"), ObjectID("ZTJ8"), ObjectID("RFY5")] } |
En ambas colecciones, hay un subarreglo de objectID, creando relaciones de muchos a muchos.
Conclusión
En este post te he compartido los Tipos de Relaciones en MongoDB. Cuando hagas tus relaciones, trata de que sean coherentes evitando la redundancia y preservando la integridad de los datos. Diseñar el modelo de esquema correcto parece bastante complicado, en el que intervienen varios conceptos y términos como ACID vs BASE vs BASEPROPERTIES, esquema dinámico y cómo manejar los diferentes escenarios del diseño del esquema para construir un sistema de producción robusto. Empieza por prácticar las relaciones y en el camino irás dominándolas, como se dice la práctica hace al maestro.
Nota(s)
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.
- MongoDB
- 12-07-2023
- 27-07-2023
- Crear un Post - Eventos Devs - Foro
Social
Redes Sociales (Developers)
Redes Sociales (Digital)