Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

이상치 패턴으로 데이터 그룹화

이 페이지의 내용

  • 시작하기 전에
  • 장점
  • 단점
  • 이 작업에 대하여
  • 단계
  • 이상값에 대한 임계값 식별
  • 이상값 처리 방법 결정
  • 이상값 문서에 대한 표시기 추가
  • 추가 판매를 별도의 컬렉션에 저장합니다
  • 결과
  • 이상치에 대한 업데이트
  • 자세히 알아보기

컬렉션에 일반적으로 동일한 크기와 모양의 문서가 저장되어 있는 경우, 크게 다른 문서(이상치)가 있으면 일반적인 쿼리에서 성능 문제가 발생할 수 있습니다.

컬렉션이 배열 필드를 저장하는 상황을 생각해 보겠습니다. 컬렉션의 다른 문서보다 배열 요소가 더 많이 포함된 문서의 경우 스키마에서 해당 문서를 다르게 처리해야 할 수 있습니다.

예상 모양과 일치하지 않는 문서를 나머지 컬렉션에서 분리하기 위해 이상값 패턴을 사용합니다. 스키마는 여전히 동일한 데이터를 모두 유지하지만 일반적인 쿼리는 하나의 대용량 문서에 영향을 받지 않습니다.

이상값을 처리하도록 스키마를 수정하기 전에 이상값 패턴의 장단점을 고려하세요.

이상치 패턴은 일반적으로 실행되는 쿼리의 성능을 향상합니다. 일반적인 문서를 반환하는 쿼리는 큰 이상치 문서도 반환할 필요가 없습니다.

이상값 패턴은 애플리케이션의 엣지 케이스도 처리합니다. 예를 들어 애플리케이션이 일반적으로 배열의 결과 50개를 표시하는 경우 어떤 문서도 결과 2,000개를 포함하여 사용자 경험을 방해하지 않을 것입니다.

이상값 패턴은 업데이트를 처리하기 위해 더 복잡한 로직이 필요합니다. 데이터를 자주 업데이트해야 하는 경우 다른 스키마 디자인 패턴을 고려할 수 있습니다. 자세한 내용은 이상값에 대한 업데이트를 참조하세요.

도서 판매를 추적하는 스키마를 생각해 보세요. 컬렉션의 일반적인 문서는 다음과 같습니다.

db.sales.insertOne(
{
"_id": 1,
"title": "Invisible Cities",
"year": 1972,
"author": "Italo Calvino",
"customers_purchased": [ "user00", "user01", "user02" ]
}
)

customers_purchased 배열은 무제한 이므로 책을 구매하는 고객이 많을수록 배열이 커집니다. 대부분의 문서의 경우 매장에서는 특정 책에 대해 소량 이상의 판매를 기대하지 않으므로 문제가 되지 않습니다.

인기 있는 신간 도서가 대량 구매로 이어진다고 가정해 보겠습니다. 현재 스키마 디자인으로 인해 문서가 너무 커져 성능에 부정적인 영향을 미칩니다. 이 문제를 해결하려면 일반적인 판매량이 없는 문서에 대해 이상치 패턴을 구현하세요.

1

스키마의 일반적인 문서 구조를 고려해 문서가 이상값이 되는 시점을 파악합니다. 임계값은 애플리케이션의 UI가 요구하는 사항이나 문서에서 실행하는 쿼리에 따라 달라질 수 있습니다.

이 예시에서 판매량이 50건을 초과하는 책은 이상값입니다.

2

대형 배열을 처리할 때 이상치를 처리하는 일반적인 방법은 임계값을 초과하는 값을 별도의 컬렉션에 저장하는 것입니다. 판매량이 50 이상인 책의 경우 추가 customers_purchased 값을 별도의 컬렉션에 저장합니다.

3

판매량이 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
}
)
4

초기 50 이후의 판매액을 저장하려면 extra_sales(이)라는 컬렉션을 만듭니다. 참조를 사용하여 extra_sales 컬렉션의 문서를 sales 컬렉션에 연결합니다.

db.extra_sales.insertOne(
{
"book_id": 2,
"customers_purchased_extra": [ "user50", "user51", "user52", ... "user999" ]
}
)

이상치 패턴은 비정형 문서가 쿼리 성능에 영향을 미치는 것을 방지합니다. 결과 스키마를 사용하면 전체 판매 목록을 유지하면서 컬렉션에 큰 문서를 포함하지 않습니다.

책과 해당 책을 구매한 모든 사용자에 대한 정보를 표시하는 애플리케이션 페이지를 예로 들어 보겠습니다. 이상치 패턴을 구현한 후 페이지에는 대부분의 도서(일반 문서)에 대한 정보가 빠르게 표시됩니다.

인기 있는 책(이상치)의 경우 애플리케이션은 book_idextra_sales 컬렉션에서 추가 쿼리를 수행합니다. 이 쿼리의 성능을 향상하려면 book_id 필드에 인덱스를 생성할 수 있습니다.

일반적인 문서와 다르게 이상치 문서에 대한 업데이트를 처리해야 합니다. 업데이트를 수행하는 데 사용하는 로직은 스키마 디자인에 따라 다릅니다.

이전 스키마의 이상값에 대한 업데이트를 수행하려면 다음 애플리케이션 논리를 구현하세요.

  • 업데이트 중인 문서의 has_extrastrue로 설정되어 있는지 확인하세요.

    • has_extras가 누락되었거나 false인 경우sales 컬렉션에 새 구매 항목을 추가합니다.

      • 결과로 생성되는 customers_purchased 배열에 50개 이상의 요소가 포함된 경우 has_extrastrue로 설정합니다.

    • has_extrastrue인 경우 해당 book_idsales_extras 컬렉션에 새 구매 항목을 추가합니다.

  • 버킷 패턴으로 데이터 그룹화하기

  • 무제한 배열 피하기

  • 임베디드된 데이터 및 참조 비교

  • 계산된 데이터 저장

돌아가기

버킷 패턴