이상치 패턴으로 데이터 그룹화
이 페이지의 내용
컬렉션에 일반적으로 동일한 크기와 모양의 문서가 저장되어 있는 경우, 크게 다른 문서(이상치)가 있으면 일반적인 쿼리에서 성능 문제가 발생할 수 있습니다.
컬렉션이 배열 필드를 저장하는 상황을 생각해 보겠습니다. 컬렉션의 다른 문서보다 배열 요소가 더 많이 포함된 문서의 경우 스키마에서 해당 문서를 다르게 처리해야 할 수 있습니다.
예상 모양과 일치하지 않는 문서를 나머지 컬렉션에서 분리하기 위해 이상값 패턴을 사용합니다. 스키마는 여전히 동일한 데이터를 모두 유지하지만 일반적인 쿼리는 하나의 대용량 문서에 영향을 받지 않습니다.
시작하기 전에
이상값을 처리하도록 스키마를 수정하기 전에 이상값 패턴의 장단점을 고려하세요.
장점
이상치 패턴은 일반적으로 실행되는 쿼리의 성능을 향상합니다. 일반적인 문서를 반환하는 쿼리는 큰 이상치 문서도 반환할 필요가 없습니다.
이상값 패턴은 애플리케이션의 엣지 케이스도 처리합니다. 예를 들어 애플리케이션이 일반적으로 배열의 결과 50개를 표시하는 경우 어떤 문서도 결과 2,000개를 포함하여 사용자 경험을 방해하지 않을 것입니다.
단점
이상값 패턴은 업데이트를 처리하기 위해 더 복잡한 로직이 필요합니다. 데이터를 자주 업데이트해야 하는 경우 다른 스키마 디자인 패턴을 고려할 수 있습니다. 자세한 내용은 이상값에 대한 업데이트를 참조하세요.
이 작업에 대하여
도서 판매를 추적하는 스키마를 생각해 보세요. 컬렉션의 일반적인 문서는 다음과 같습니다.
db.sales.insertOne( { "_id": 1, "title": "Invisible Cities", "year": 1972, "author": "Italo Calvino", "customers_purchased": [ "user00", "user01", "user02" ] } )
customers_purchased
배열은 무제한 이므로 책을 구매하는 고객이 많을수록 배열이 커집니다. 대부분의 문서의 경우 매장에서는 특정 책에 대해 소량 이상의 판매를 기대하지 않으므로 문제가 되지 않습니다.
인기 있는 신간 도서가 대량 구매로 이어진다고 가정해 보겠습니다. 현재 스키마 디자인으로 인해 문서가 너무 커져 성능에 부정적인 영향을 미칩니다. 이 문제를 해결하려면 일반적인 판매량이 없는 문서에 대해 이상치 패턴을 구현하세요.
단계
이상값 문서에 대한 표시기 추가
판매량이 50 이상인 도서의 경우 has_extras
(이)라는 새 문서 필드를 추가하고 값을 true
(으)로 설정합니다. 이 필드는 별도의 컬렉션에 저장된 판매량이 더 많음을 나타냅니다.
db.sales.insertOne( { "_id": 2, "title": "The Wooden Amulet", "year": 2023, "author": "Lesley Moreno", "customers_purchased": [ "user00", "user01", "user02", ... "user49" ], "has_extras": true } )
결과
이상치 패턴은 비정형 문서가 쿼리 성능에 영향을 미치는 것을 방지합니다. 결과 스키마를 사용하면 전체 판매 목록을 유지하면서 컬렉션에 큰 문서를 포함하지 않습니다.
책과 해당 책을 구매한 모든 사용자에 대한 정보를 표시하는 애플리케이션 페이지를 예로 들어 보겠습니다. 이상치 패턴을 구현한 후 페이지에는 대부분의 도서(일반 문서)에 대한 정보가 빠르게 표시됩니다.
인기 있는 책(이상치)의 경우 애플리케이션은 book_id
의 extra_sales
컬렉션에서 추가 쿼리를 수행합니다. 이 쿼리의 성능을 향상하려면 book_id
필드에 인덱스를 생성할 수 있습니다.
이상치에 대한 업데이트
일반적인 문서와 다르게 이상치 문서에 대한 업데이트를 처리해야 합니다. 업데이트를 수행하는 데 사용하는 로직은 스키마 디자인에 따라 다릅니다.
이전 스키마의 이상값에 대한 업데이트를 수행하려면 다음 애플리케이션 논리를 구현하세요.
업데이트 중인 문서의
has_extras
가true
로 설정되어 있는지 확인하세요.has_extras
가 누락되었거나false
인 경우sales
컬렉션에 새 구매 항목을 추가합니다.결과로 생성되는
customers_purchased
배열에 50개 이상의 요소가 포함된 경우has_extras
를true
로 설정합니다.
has_extras
가true
인 경우 해당book_id
의sales_extras
컬렉션에 새 구매 항목을 추가합니다.