문서 데이터베이스에서 다대다 관계
두 엔터티의 모든 인스턴스가 다른 엔터티의 여러 인스턴스와 관계가 있을 때 다대다 관계가 생긴다. 몇 가지 예를 들면 다음과 같다.
• 의사는 많은 환자를 볼 수 있고 환자도 많은 의사를 볼 수 있다.
• 운영체제 사용자 그룹에는 많은 사용자가 포함되어 있고 사용자는 많은 운영 시스템 사용자 그룹에 속할 수 있다.
• 학생들은 많은 과목을 수강할 수 있고 여러 과목에는 많은 학생이 등록되어 있다.
• 사람들은 많은 클럽에 가입할 수 있고 클럽에도 많은 회원이 있다.
다대다 관계는 엔터티 유형별로 컬렉션 두 개를 사용해 모델링한다. 각 컬렉션은 관련된 엔터티를 참조하는 식별자 리스트를 관리한다. 예를 들어 다음과 같이 과목 데이터가 있는 문서에는 학생 ID로 이루어진 배열이 있고 학생 문서에는 과목 ID 리스트가 있다.
과목: { { courseID: 'C1667', title: 'Introduction to Anthropology', instructor: 'Dr. Margret Austin', credits: 3, enrolledStudents: ['S1837', 'S3737', 'S9825' … 'S1847'] }, { courseID: 'C2873', title: 'Algorithms and Data Structures', instructor: 'Dr. Susan Johnson', credits: 3, enrolledStudents: ['S1837','S3737', 'S4321', 'S9825' … 'S1847'] }, { courseID: C3876, title: 'Macroeconomics', instructor: 'Dr. James Schulen', credits: 3, enrolledStudents: ['S1837', 'S4321', 'S1470', 'S9825' … 'S1847'] }, ... 학생: { { studentID:'S1837', name: 'Brian Nelson', gradYear: 2018, courses: ['C1667', C2873,'C3876']}, { studentID: 'S3737', name: 'Yolanda Deltor', gradYear: 2017, courses: [ 'C1667','C2873']}, … }
이 패턴은 중첩 문서 대신 식별자를 사용해 관련된 문서를 참조하여 데이터 중복을 최소화하고 있다.
다대다 관계에서 갱신 작업을 수행할 때 두 엔터티가 제대로 갱신되도록 하는 데 주의를 기울여야 한다. 문서 데이터베이스는 관계형 데이터베이스와 달리 참조 무결성 에러를 잡아내지 않는다는 점도 기억해 두자. 즉, 문서 데이터베이스에서는 기존에 없는 courseID 값이 있더라도 학생 문서를 저장할 수 있다.