¿Cómo manejar relaciones muchos a muchos en bases de datos?
Las relaciones muchos a muchos son un pilar en el modelado de bases de datos que permite representar conexiones complejas entre entidades. Un ejemplo común es una tienda y sus productos, donde una tienda puede vender múltiples productos y a su vez, un producto puede estar presente en varias tiendas. Entender y manipular este tipo de relaciones es crucial para diseñar bases de datos eficientes y funcionales.
¿Por qué usar referencias en relaciones muchos a muchos?
Las relaciones muchos a muchos se gestionan mejor utilizando una forma referenciada. Esto es porque embebiendo las relaciones se limitaría la flexibilidad, ya que una vez embebido un documento, el otro documento no podría hacer una referencia a él.
Ejemplo práctico en Visual Studio Code
Para ilustrar, supongamos que tenemos una base de datos para gestionar tiendas y productos:
Insertar productos en la colección: Crearemos una colección de productos y añadiremos algunos artículos con sus propiedades, como nombre, tamaño y precio. Aquí un ejemplo básico para añadir productos:
Relacionar tiendas con productos: Creamos una nueva colección para tiendas donde cada tienda tiene un array de referencias a los productos mediante sus Object IDs:
Para resolver y presentar estas relaciones, puedes usar el aggregate framework de MongoDB. Esto permite unir datos mediante consultas avanzadas y devolver resultados enriquecidos.
Este tipo de consulta no solo devuelve las referencias como IDs, sino que adicionalmente embebe los detalles del producto directamente en el resultado de la tienda, optimizando así la manipulación y visualización de los datos de tus aplicaciones.
¿Qué escenarios reales presentan relaciones muchos a muchos?
Como guía, considera un evento como una conferencia, donde las sesiones están compuestas por múltiples speakers (oradores). En este contexto:
Un speaker puede participar en varias sesiones.
Una sesión puede involucrar a varios speakers.
Este ejemplo ilustra cómo tener relaciones bidireccionales: tanto las sesiones tienen un array de reference hacia los speakers, como los speakers hacia las sesiones. Esto se alinea con el principio de que en las relaciones muchos a muchos, ambas entidades frecuentemente se refieren mutuamente.
Conclusión: aprovechamiento de bases de datos más robustas
Las relaciones muchos a muchos proporcionan la versatilidad necesaria para reflejar la complejidad del mundo real en la representación de datos. Al comprender y aplicar este conocimiento, no solo mejoran la eficiencia y organización de tus bases de datos, sino que también habilitas tu capacidad para desarrollar sistemas más completos y funcionales. Invita a continuar explorando las interacciones más avanzadas y cómo resolverlas de manera efectiva.
La relacion muchos a muchos (N-N) es cuando un documento de una coleccion A puede estar relacionado con varios documentos de una coleccion B y viceversa.
Esta relacion es siempre Referencial.
Se pueden realizar de 2 formas:
Con una coleccion intermediaria, que hace de puente entre 1 o más colecciones.
Embeber dentro de cada documento un arreglo con los identificadores de sus relaciones.
Casos de uso
Usar referencia cuando la relacion es N-N
Ejemplo:
Primera parte.
Un producto puede pertenecer a varias tiendas y una tienda puede tener varios productos. Lo realizaremos mediante un arreglo para referenciar.
Se utiliza una nomenclatura como cualquier otra propiedad pero con un doble corchete y de tipo ObjectId: products_ids[]:<ObjectId>.
db.stores.aggregate([{$lookup:{from:'products',localField:'products_ids',// automaticamente detecta que es una listaforeignField:'_id',as:'products'}}])
Excelente aporte. Me ayuda un buen para agilizar los apuntes y prestar más atención a la clase
Para que me traiga los productos a stores tuve que poner products_id en el localfield sino no funcionaba, sera por alguna razon?
El profe lo muestra asi mismo.
Para incluir los productos en la consulta de tiendas, se le entrega en el localfield la propiedad que hace referencia a los productos.
O puede ser por el nombre que le pusiste a ese mismo arreglo no coincidia con el lookup.
Hola, disculpen tengo una api utilizando mongoose y desde ella actualizo la información de un usuario, pero el problema que tengo es que tengo que actualizar dos colecciones en donde se guarda también información del usuario, hay algún concepto que pueda investigar que me permita realizar por ejemplo una transacción?
Es decir que si al actualizar la segunda colección existe algún error me realice una especie de rollback sobre la actualización del usuario y de la primer colección?
Investigue a cerca de transacciones en mondogoDB pero me dice que no están habilitadas
Hay alguna forma de obtener el id del ultimo documento insertado como en sql el scope_identity?
Una de las formas es haciendo una consulta aplicando un sort y limitando la respuesta a un unico documento, por ejemplo: ```txt
db.products.find().sort({_id: -1}).limit(1)
Aprender de la mano de MongoDB University es bueno pero Nicolas tambien es excelente Profesor para aprender Modelado de Datos en MongoDB