relaciones cascada actualizacion mongodb database-design cascading-deletes non-relational-database database

actualizacion - ¿Cuál es el equivalente recomendado de eliminación en cascada en MongoDB para las relaciones N: M?



actualizacion en cascada mysql (2)

Asumiendo el siguiente diseño de "esquema / relación", ¿cuál es la práctica recomendada para manejar la eliminación con la operación de eliminación en cascada?

Esquema relacional:

+---------+ +--------+ | Student |-*--------1-[Enrollment]-1--------*-| Course | +---------+ +--------+

MongoDB:

+---------+ +--------+ | Student |-*----------------*-| Course | +---------+ +--------+

Dado este diseño clásico de inscripción de estudiantes en cursos, tener una colección de cursos para estudiantes y viceversa parece ser un modelo de datos apropiado cuando se usa MongoDB (que no es nada para la tabla de relación / inscripción). Pero viniendo de un mundo relacional, ¿cómo debo manejar la semántica de eliminar un curso? Es decir, cuando se elimina un curso, todos los registros de "inscripción" también deben eliminarse. Es decir, debería eliminar el curso de la colección de cada registro de estudiante. Parece que tengo que disparar 2 consultas: una para eliminar el curso y luego eliminarla de la colección de cada estudiante. ¿Hay una manera de tener una sola consulta para realizar esta "eliminación en cascada" como semántica sin la consulta adicional? ¿El modelo de datos necesita cambiar?

NOTA: Para todos los demás casos de uso, el modelo de datos anterior funciona bien:

  • Eliminar un estudiante => simplemente eliminar ese estudiante y la colección asociada de cursos eliminados junto con él.
  • Estudiante dispuesto a abandonar un curso => simplemente elimínelo de la colección de cursos de estudiantes
  • Agregue student / course => simplemente agréguelo a la ''tabla'' correspondiente en esencia.

Lo único difícil es manejar la eliminación de un curso. ¿Cómo debo manejar este escenario en MongoDB, ya que provengo de un fondo relacional y no puedo resolverlo?


Lo que estás haciendo es la mejor y la mejor manera de hacerlo en Mongo. Estoy en una situación similar y, después de pasar por todas las implementaciones posibles del patrón de diseño N: M, también he llegado a esta misma solución.

Aparentemente, esto no es una cosa mongodb, sino más bien un concepto de NoSQL, en donde, los datos menos cambiantes (Cursos) se pueden mantener por separado. Y dado que eliminar un Curso no va a ser una operación muy frecuente, es lo suficientemente factible para revisar todos los registros y eliminarlo.

Por otro lado, puedes dejar que sea como es. En la lógica de su aplicación, simplemente ignore los valores de los Cursos en el documento del Estudiante que no tienen ningún reference_id en el documento del Curso. Pero en ese caso, debe asegurarse de que los antiguos Course_id eliminados no se estén reutilizando.

O simplemente use las marcas eliminadas en el documento del curso y maneje todo lo demás en la lógica de su aplicación.


Voy a responder en base a las recomendaciones del equipo de Mongo. También vine de la base de datos relacional y al principio tuve algunos problemas para entender los conceptos. El equipo de Mongo recomienda diseñar con la idea del esquema "Dirigido por la aplicación", por lo que primero tiene que descubrir qué datos van juntos. Recuerde que no hay tal concepto de transacción de ninguna manera posible en Mongo, incluso si inventamos un controlador que maneje las transacciones, deberíamos implementar nuestra propia solución para esto. Significa que si tengo dos objetos de negocio que requieren que se actualicen al mismo tiempo siempre y no puedo tolerar una falla en esta operación, tengo que unirlos en un solo documento (atómico).

En su caso, tiene dos documentos, Estudiante y Cursos, y una relación entre ellos (Un estudiante se inscribe en N cursos). Supongo que no es necesario modificar los cursos todo el tiempo, por lo que se pueden almacenar en una colección diferente. Pero el punto es la relación entre ellos, en este caso, debe eliminar atómicamente un Estudiante y todos los cursos en los que se inscribió. Por lo tanto, la mejor solución adecuada para esto es incrustar la relación en el Estudiante y mantener una colección de Cursos separada. Cuando borras al alumno, la relación se descarta al mismo tiempo:

Estudiante Json:

{ _id: ObjectId(''...''), name:"John", lastname:"Smith", courses: [ 1, 100, 50, 67 ], ... }

Los cursos pueden ser una colección separada entre ellos. Esta es la forma de manejarlo en Mongo. Las operaciones atómicas deben estar integradas en un solo documento. Asumí que Cursos es una lista de cursos que no cambian tanto, en caso de que los diseñe Student, podríamos cambiar un poco la solución.