참조 배열 을 사용하여 서로 다른 유형의 관련 문서를 단일 컬렉션 으로 그룹 데이터 모델 만듭니다. 단일 컬렉션 패턴은 데이터 사본이 하나만 있는 다대다 관계를 모델링하는 데 특히 유용할 수 있습니다. 이 패턴 복제 비용 이 우려되는 사용 사례에서 데이터 중복을 줄일 수 있습니다.
단일 컬렉션 패턴을 정의하는 특성은 다음과 같습니다.
자주 액세스하는 모든 문서를 단일 컬렉션 에 함께 저장합니다.
문서 간의 관계를 각 문서 내의 포인터 또는 구조로 저장합니다.
필드 또는 배열 의 인덱스를 통해 문서 간의 관계를 매핑합니다. 이 인덱스 데이터베이스 조인 작업을 사용하지 않고도 단일 쿼리 로 관련 문서를 검색할 수 있도록 지원합니다.
속도가 빠른 작업, 지연 시간이 짧은 요구 사항, 쓰기 (write) 작업이 빈번한 시스템을 모델링할 때는 단일 컬렉션 패턴을 사용하는 것이 좋습니다. 문서 큰 내장된 문서가 아닌 작은 부분으로 나누면 데이터베이스 더 작은 쓰기 (write) 작업을 수행하고 성능을 향상시킬 수 있습니다.
이 작업에 대하여
다음 예시 에서 학생은 애플리케이션 통해 해당 학기에 등록한 수업의 상태를 확인할 수 있습니다. 시스템은 각 클래스에 대한 여러 필드(예: current_topic, upcoming_session_summary 또는 next_class_time)를 자주 업데이트 해야 할 수 있습니다. 같은 수업을 수강하는 여러 학생에 대해 정보가 중복되는 것을 방지하기 위해 학생과 수업을 동일한 컬렉션 에서 별도의 문서 엔터티로 유지하고자 합니다.
예시
학급과 학생에 대한 다음 예시 스키마를 살펴보겠습니다. 둘의 관계 모델링하기 위해 학급 문서와 학생 문서에는 links 배열 포함되어 있습니다. 이 배열 학생과 학급 엔터티 간의 관계 참조하기 위한 doc_type 및 target 필드가 포함되어 있습니다.
클래스 문서:
{ _id : "CS101-001", doc_type : "class", class_name : "Introduction to Programming", course_id : "CS101", instructor : { name : "Dr. Emily Smith", email : "emily.smith@example.com", office_hours : "Tuesdays and Thursdays 2:00 PM - 4:00 PM" }, semester : "Spring 2025", schedule : [ { day_time : "Monday 10:00 AM - 11:30 AM", location : "Room 101, Science Building" }, { day_time : "Wednesday 10:00 AM - 11:30 AM", location : "Room 101, Science Building" }, { day_time : "Friday 10:00 AM - 11:30 AM", location : "Room 101, Science Building" } ], current_topic : "Loops and Iterations", next_class_time : "2025-01-09T10:00:00Z", upcoming_session_summary : "We will explore different types of loops (for, while) and how to use them effectively in Python.", links : [ { target : "CS101-001", doc_type : "class" }, { target : "S10023", doc_type : "student" }, { target : "S12345", doc_type : "student" }, ... { target : "S12355", doc_type : "student" } ] }
학생 문서:
{ _id : "S12345", doc_type : "student", name : "Jane Doe", major : "Computer Science", semester : "Spring 2025", registered_classes : [ { course_id : "CS101", class_instance_id : "CS101-001", class_name : "Introduction to Programming" }, { course_id : "MATH201", class_instance_id : "MATH201-002", class_name : "Calculus II" } ], links : [ { target : "CS101-001", doc_type : "class" }, { target : "MATH201-002", doc_type : "class" }, { target : "S12345", doc_type : "student" } ] }
쿼리를 최적화하려면 links 필드 인덱스 .
db.students_classes.createIndex({ "links.target": 1, "links.doc_type": 1 })
조인 작업을 수행하지 않고도 학생의 정보와 학생이 수강하는 모든 수업을 쿼리 할 수 있습니다.
db.students_classes.find({ "links.target": "S12345" })
마찬가지로 특정 학급에 등록된 모든 학생을 쿼리 할 수 있습니다.
db.students_classes.find({ "doc_type": "student", "links.target": "CS101-001" })