더북(TheBook)

문서 데이터베이스에서 다대다 관계

두 엔터티의 모든 인스턴스가 다른 엔터티의 여러 인스턴스와 관계가 있을 때 다대다 관계가 생긴다. 몇 가지 예를 들면 다음과 같다.

의사는 많은 환자를 볼 수 있고 환자도 많은 의사를 볼 수 있다.

운영체제 사용자 그룹에는 많은 사용자가 포함되어 있고 사용자는 많은 운영 시스템 사용자 그룹에 속할 수 있다.

학생들은 많은 과목을 수강할 수 있고 여러 과목에는 많은 학생이 등록되어 있다.

사람들은 많은 클럽에 가입할 수 있고 클럽에도 많은 회원이 있다.

다대다 관계는 엔터티 유형별로 컬렉션 두 개를 사용해 모델링한다. 각 컬렉션은 관련된 엔터티를 참조하는 식별자 리스트를 관리한다. 예를 들어 다음과 같이 과목 데이터가 있는 문서에는 학생 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 값이 있더라도 학생 문서를 저장할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.