programing

N:M 관계에 대해 MongoDB에서 계단식 삭제를 권장하는 것은 무엇입니까?

bestprogram 2023. 7. 16. 13:43

N:M 관계에 대해 MongoDB에서 계단식 삭제를 권장하는 것은 무엇입니까?

다음 "구성표/관계" 설계를 가정할 때 캐스케이드 삭제와 유사한 작업을 통해 삭제를 처리할 때 권장되는 방법은 무엇입니까?

관계 스키마:

+---------+                                    +--------+학생 |-*--------1-[등록]-1------*-| 과정 |+---------+                                    +--------+

MongoDB:

+---------+                    +--------+학생 |-*------------------------------------------------------------------- 과정+---------+                    +--------+

학생을 과정에 등록하는 이러한 고전적인 설계를 고려할 때, MongoDB를 사용할 때 학생 및 그 반대의 경우 과정 모음을 갖는 것이 적절한 데이터 모델인 것 같습니다(관계/등록 테이블에는 해당되지 않습니다).하지만 관계형 세계에서 온 제가 과정 삭제의 의미를 어떻게 처리해야 할까요?즉, 과정이 삭제되면 모든 "등록" 레코드도 삭제해야 합니다.즉, 저는 각 학생부 수집에서 과정을 삭제해야 합니다.두 개의 쿼리를 실행해야 할 것 같습니다. 하나는 과정을 삭제하고 다른 하나는 각 학생의 컬렉션에서 삭제하는 것입니다.추가 쿼리 없이 의미론적인 "캐스케이드 삭제"와 같은 단일 쿼리를 수행할 수 있는 방법이 있습니까?데이터 모델을 변경해야 합니까?

참고: 다른 모든 사용 사례에서 위의 데이터 모델은 정상적으로 작동합니다.

  • =>해당 학생과 함께 삭제된 관련 과정 모음만 삭제합니다.
  • 을 가 있는 =>의 강좌 .
  • =>해당하는 '표'에 본질적으로 추가하기만 하면 됩니다.

유일하게 까다로운 것은 과정 삭제 처리입니다.저는 관계적 배경이 있고 이 시나리오를 이해할 수 없기 때문에 MongoDB에서 이 시나리오를 어떻게 처리해야 합니까?

당신이 하고 있는 일이 몽고에서 가장 좋고 최적의 방법입니다.저도 비슷한 상황에 처해 있고 N:M 디자인 패턴의 가능한 모든 구현을 거친 후에 이와 같은 해결책에 도달했습니다.

분명히, 이것은 몽고드브가 아니라 NoSQL의 개념에 더 가깝습니다. 여기서 변경이 적은 데이터(과정)를 별도로 보관할 수 있습니다.과정을 삭제하는 작업은 자주 수행되지 않으므로, 과정을 삭제하기 위해 모든 기록을 검토할 수 있습니다.

반면에, 당신은 그대로 내버려둘 수 있습니다.응용프로그램 논리에서 과정 문서에 reference_id가 전혀 없는 학생 문서의 과정 값은 무시하십시오.그러나 이 경우 삭제된 이전 Course_id가 재사용되지 않는지 확인해야 합니다.

또는 과정 문서에서 삭제된 플래그를 사용하고 응용프로그램 논리의 다른 모든 항목을 처리합니다.

저는 Mongo 팀의 추천을 바탕으로 답변을 하려고 합니다.저도 관계형 데이터베이스에서 왔는데 처음에는 개념을 이해하는 데 문제가 있었습니다.Mongo 팀은 "애플리케이션 중심" 스키마를 사용하여 설계할 것을 권장합니다. 따라서 어떤 데이터가 함께 사용되는지 먼저 파악해야 합니다.Mongo에는 어떠한 가능한 방식으로도 그러한 거래 개념이 없다는 것을 기억하세요. 거래를 처리하는 드라이버를 발명하더라도 우리는 이를 위해 우리만의 솔루션을 구현해야 합니다.즉, 항상 동시에 업데이트해야 하는 두 개의 비즈니스 개체가 있는데 이 작업에서 오류가 발생하는 것을 허용할 수 없는 경우 이러한 개체를 단일 문서(원자)에 결합해야 합니다.

이 경우 학생과 과정이라는 두 개의 문서와 그 사이의 관계가 있습니다(학생은 N개의 과정에 등록).과정을 항상 변경할 필요는 없기 때문에 다른 컬렉션에 저장할 수 있습니다.그러나 중요한 것은 이들 사이의 관계입니다. 이 경우 학생과 학생이 등록한 모든 과정을 원자적으로 삭제해야 합니다.따라서 이에 가장 적합한 해결책은 학생에 관계를 포함시키고 별도의 과정 모음을 유지하는 것입니다.학생을 삭제하면 관계가 동시에 삭제됩니다.

학생 Json:

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

과정은 과정 간에 별도의 모음이 될 수 있습니다.이것이 몽고에서 그것을 다루는 방법입니다.원자성 작업은 단일 문서에 포함되어야 합니다.과정은 크게 변경되지 않는 과정 목록이라고 생각했습니다. 학생이 설계한 경우에는 솔루션을 조금 변경할 수 있습니다.

언급URL : https://stackoverflow.com/questions/20370791/what-is-the-recommended-equivalent-of-cascaded-delete-in-mongodb-for-nm-relatio