무제한 배열 피하기
개요
MongoDB의 풍부한 스키마 모델의 이점 중 하나는 문서 필드 값으로 배열을 저장하는 기능입니다. 배열을 필드 값으로 저장하면 관계형 데이터베이스에서처럼 별도의 collection이 아닌 단일 문서에서 일대다 또는 다대다 관계를 모델링할 수 있습니다.
그러나 문서의 배열에 요소를 지속적으로 추가하는 경우 주의해야 합니다. 배열의 요소 수를 제한하지 않으면 문서 크기가 예측할 수 없을 정도로 커질 수 있습니다. 배열이 계속해서 커지면 해당 배열에서 인덱스를 읽고 작성하는 작업의 성능이 점차 저하됩니다. 배열이 커지면 애플리케이션 리소스에 부하가 걸리고 문서가 BSON 문서 크기 제한을 초과할 위험이 있습니다.
대신 성능을 향상시키고 문서를 관리 가능한 크기로 유지하기 위해 배열에 제한을 지정하는 것을 고려하세요.
예시
publishers
컬렉션에 대한 다음 스키마를 가정해 보겠습니다.
// publishers collection { "_id": "orielly", "name": "O'Reilly Media", "founded": 1980, "location": "CA", "books": [ { "_id": 123456789, "title": "MongoDB: The Definitive Guide", "author": [ "Kristina Chodorow", "Mike Dirolf" ], "published_date": ISODate("2010-09-24"), "pages": 216, "language": "English" }, { "_id": 234567890, "title": "50 Tips and Tricks for MongoDB Developer", "author": "Kristina Chodorow", "published_date": ISODate("2011-05-06"), "pages": 68, "language": "English" } ] }
이 시나리오에서 books
배열은 바인딩되지 않습니다 . 이 출판사가 출간한 각 신규 도서는 books
배열에 새 하위 문서를 추가합니다. 출판사에서 책을 계속 출간함에 따라 결국 문서 크기가 매우 커져 애플리케이션에 불균형적인 메모리 부하가 발생합니다.
변경 가능하고 제한이 없는 배열을 피하려면 publishers
컬렉션을 두 컬렉션(publishers
용 컬렉션과 books
용 컬렉션)으로 분리합니다. publishers
문서에 book
문서 전체를 삽입하는 대신 책 문서 내부에 출판사에 대한 참조를 포함합니다.
// publishers collection { "_id": "oreilly", "name": "O'Reilly Media", "founded": 1980, "location": "CA" }
// books collection { "_id": 123456789, "title": "MongoDB: The Definitive Guide", "author": [ "Kristina Chodorow", "Mike Dirolf" ], "published_date": ISODate("2010-09-24"), "pages": 216, "language": "English", "publisher_id": "oreilly" } { "_id": 234567890, "title": "50 Tips and Tricks for MongoDB Developer", "author": "Kristina Chodorow", "published_date": ISODate("2011-05-06"), "pages": 68, "language": "English", "publisher_id": "oreilly" }
이 업데이트된 스키마는 publishers
컬렉션에서 제한이 없는 배열을 제거하고 publisher_id
필드를 사용하여 각 책 문서에 출판사에 대한 레퍼런스를 배치합니다. 이렇게 하면 각 문서의 크기를 관리할 수 있고 문서 필드가 비정상적으로 커질 위험이 없습니다.
문서 레퍼런스가 필요할 수 있음 $lookups
이 방법은 애플리케이션이 도서와 출판사 정보를 별도로 로드하는 경우에 특히 효과적입니다. 애플리케이션에 도서와 정보가 함께 필요한 경우 $lookup
작업을 수행하여 publishers
및 books
컬렉션의 데이터를 결합해야 합니다. $lookup
연산은 그다지 성능이 뛰어나지 않지만, 이 시나리오에서는 무제한 배열을 피하기 위해 절충할 가치가 있을 수 있습니다.
자세히 알아보기
MongoDB의 데이터 모델링과 유연한 스키마 모델에 대해 자세히 알아보려면 데이터 모델링 소개를 참조하세요.
문서 참조와의 관계를 모델링하는 방법을 알아보려면 문서 참조를 통한 일대다 관계 모델링을 참조하세요.
MongoDB에서 배열을 쿼리하는 방법을 알아보려면 배열 쿼리를 참조하세요.
MongoDB는 또한 데이터 모델링에 대한 무료 MongoDB 대학 과정: MongoDB용 데이터 모델링을 제공합니다.
MongoDB.live 2020 프레젠테이션
유연한 데이터 모델을 스키마에 통합하는 방법을 알아보려면 MongoDB.live 2020의 다음 프레젠테이션을 참조하세요:
MongoDB의엔티티 관계에 대해 알아보고, MongoDB를 사용한 데이터 모델링으로 구현한 예시를 살펴보세요.
고급 스키마 설계 패턴을 통해 스키마에 통합할 수 있는 고급 데이터 모델링 디자인 패턴에 대해 알아보세요.