Saltar al contenido

¿Cómo manejar la relación Muchos a Muchos en mongoDB?

Si encuentras algo que te causa duda puedes comentarlo y haremos todo lo posible de ayudarte rápidamente.

Solución:

Comencemos detallando nuestra relación de muchos a muchos para su caso e intentemos comprender qué se puede y qué no se puede hacer:

  • Una canción puede ser cantada por hasta 10 o quizás 20 artistas (suponiendo que no sea tan compleja/diversa como para requerir quizás 100 artistas).

    En este caso, depositar la identificación del artista dentro de songs la colección está perfectamente bien y podemos asumir con seguridad que incluso en el peor de los casos (almacenando una canción compleja/diversa cantada por 100 artistas) nunca forzará nuestra colección de canciones más allá de 16 MB.

  • Sin embargo, un artista puede muy bien cantar hasta miles de canciones o tal vez más en toda su carrera. Un ObjectId de 12 bytes de largo, en este caso hará crecer una colección a un tamaño de solo 12000 bytes, que es mucho menor que 16000000 bytes. Todavía te queda mucho espacio. Por lo tanto, no debe preocuparse por alcanzar el límite de 16 MB.

Enfoque – 1

Inter-bucketing funciona muy bien para las relaciones que esperan lecturas altas.

Las canciones de algunos artistas se pueden buscar en una sola consulta e incluso viceversa. Y esto sería aún más sencillo con índices esparcidos sobre estas dos colecciones.

Pero si agrupamos a los artistas dentro de las canciones y las canciones dentro de los artistas, entonces nuestras actualizaciones ya no son atómicas, pero para eso aún podemos implementar un compromiso de dos fases a nivel de aplicación para CRUD de artistas y canciones, que incluso después de ser un poco problemático. , resuelve el problema.

Enfoque – 2:

¿Por qué no incluir solo los ID de artistas dentro de la colección de canciones y tener un índice multiclave en ese campo?

La lista de artistas que cantaron una canción es demasiado corta que la lista de canciones cantadas por un artista. Así que solo clasificamos a los artistas dentro de la colección de canciones.

De esta manera lo haremos –

1. evitar la posibilidad casi imposible de alcanzar el tamaño máximo de la colección del artista si hubiéramos agrupado canciones dentro de la colección del artista.

2. evite escribir confirmaciones 2P por lo menos songs colecciones Todas las lecturas relacionales se pueden satisfacer solo a través de la colección de canciones (aquí estoy excluyendo la búsqueda de _id para el artista)

3. garantizar un acceso rápido a los datos en una sola consulta, incluso cuando se realiza una consulta inversa en la colección de canciones para canciones cantadas por un artista.

Ya tendrá información (_id) del artista para el que necesita buscar canciones. Simplemente redacta una consulta como esta:

 db.songs.find( artists: 'your-artist-id' );

Y cuando explicas esta consulta, encuentras felicidad cuando te das cuenta de que utiliza tu multi-key índices ¡Gran trabajo allí!

Ahora, ¿qué enfoque elegir?

Considero que el segundo enfoque es un poco más sutil para su caso de uso, ya que reduce parte de la complejidad de administrar confirmaciones 2P para la atomicidad y aún proporciona un buen rendimiento de lectura. El primer enfoque definitivamente está orientado a las lecturas, por lo que si está seguro de que recibirá muchas lecturas en ambas colecciones, elija la primera; de lo contrario, la segunda debería funcionar.

Implementé una relación de muchos a muchos en mongodb tomando una tercera colección similar a lo que hacemos en sql.

Colección de canciones


  _id:ObjectId("dge547567hheheasfw3454df12"),
   title:"xyz",
   length : 123

Colección de artistas


   _id:ObjectId("dge547567hheheasfw3454d32"),
   name:"abc",

Colección SongArtist


   _id:ObjectId("dge547567hheheasdfsdfsdfgdfga42"),
   artist: ObjectId("dge547567hheheasfw3454dfg32"),
   song: ObjectId("dge547567hheheasfw3454df12"),

  • Ahora, cuando realiza operaciones rudimentarias y desea eliminar al artista de una canción, puede hacerlo en una sola consulta en SongArtist Collection.
  • Nunca tendrá ningún problema por exceder el tamaño del documento.
  • Si desea eliminar un artista en particular en una canción en particular, debe consultar una vez
  • Aumentará la cantidad de registros en una colección, pero mongodb puede manejar eso muy fácilmente.
  • Puede encontrar todas las canciones relacionadas con un artista en una sola consulta y viceversa.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *