Relaciones Muchos a Muchos en Bases de Datos Documentales

Clase 18 de 22Curso de Modelado de Datos en MongoDB

Resumen

¿Cómo manejar relaciones muchos a muchos con referencias autoreferenciadas?

Las relaciones muchos a muchos son esenciales para modelar sistemas complejos en bases de datos, pero también pueden ser un desafío. En esta sesión, exploramos cómo crear una relación muchos a muchos entre tiendas y productos, permitiendo que ambos elementos refieran de manera cruzada.

¿Cómo actualizamos un producto para incluir referencias a tiendas?

Para tener una relación que permita saber en qué tiendas se encuentra un producto específico, primero debemos actualizar el producto con los IDs de las tiendas correspondientes. Para ello, podemos seguir estos pasos:

  1. Identificar el producto y la tienda:

    • Realiza una consulta para obtener el ID del producto que deseas actualizar.
    • Realiza otra consulta para identificar qué tienda quieres vincular con el producto.
  2. Realizar la actualización en la base de datos:

    • Crea un nuevo script para realizar un Update en lugar de un Insert.
    • Especifica la base de datos y realiza un updateOne sobre el producto en cuestión.
    db.productos.updateOne(
        { _id: ObjectId("ID_del_producto") },
        {
            $set: { StoreIDs: ["ID_de_la_tienda"] }
        }
    )
    

Al ejecutar el script, la base de datos actualizará el documento del producto añadiendo un campo StoreIDs, que contendrá una lista de las tiendas asociadas.

¿Cómo verificamos las referencias entre productos y tiendas?

Una vez actualizado el producto, es crucial verificar que las relaciones están correctamente implementadas:

  1. Consulta el producto para verificar las referencias:

    • Realiza una consulta para comprobar si el producto tiene el campo StoreIDs con los IDs de las tiendas asociadas.
    db.productos.findOne(
        { _id: ObjectId("ID_del_producto") }
    )
    
  2. Garantiza que las relaciones puedan consultarse desde ambas direcciones:

    • Asegúrate de que los Stores también puedan relacionarse con los productos.
    • Permite resolver las relaciones desde la colección Stores, así como desde la colección Productos.
    db.productos.aggregate([
        {
            $lookup: {
                from: "stores",
                localField: "StoreIDs",
                foreignField: "_id",
                as: "DetalleStores"
            }
        }
    ])
    

¿Cuándo deberías usar referencias autoreferenciadas?

Las autoreferencias son útiles cuando se necesita acceder a la información desde cualquiera de los dos lados de la relación. Es clave decidir si la información debe estar referenciada desde ambos lados o solamente desde uno con base en la experiencia del usuario o las necesidades del negocio.

  • Referencias bidireccionales: Son recomendables cuando la información se consume de manera frecuente y conjunta desde distintos puntos de la aplicación (por ejemplo, un sistema de conferencias donde es necesario conocer tanto las sesiones de un speaker como los speakers de una sesión).

  • Referencias unilaterales: Son suficientes cuando la mayoría de las consultas o acciones se centran en uno de los lados de la relación.

Adoptar la estrategia adecuada para implementar autoreferencias en bases de datos contribuye significativamente a la eficiencia de la aplicación y evita redundancias innecesarias.