Docs Menu
Docs Home
/ /
/ / /

하위 집합 패턴으로 데이터 그룹화

MongoDB 작업 세트 라고 하는 자주 액세스하는 데이터를 RAM 에 보관합니다. 데이터 및 인덱스의 작업 세트 물리적 RAM 할당량을 초과하면 디스크 액세스가 발생하기 시작하고 데이터가 RAM 에서 검색되지 않으므로 성능이 저하됩니다.

이 문제를 해결하기 위해 컬렉션 샤드 할 수 있습니다. 그러나 샤딩 애플리케이션 준비되지 않은 추가 비용과 복잡성을 초래할 수 있습니다. 컬렉션 샤딩 대신 하위 집합 패턴 사용하여 작업 세트 의 크기를 줄일 수 있습니다.

하위 집합 패턴 문서 내에 많은 항목 배열 있지만 해당 항목의 작은 하위 집합에 자주 액세스 해야 하는 시나리오를 처리하다 데 사용되는 데이터 모델링 기술입니다. 이 경우 문서 크기로 인해 작업 세트 컴퓨터의 RAM 용량을 초과하는 경우가 많습니다. 하위 집합 패턴 일반적인 쿼리를 위해 데이터베이스 에서 읽어야 하는 데이터의 양을 줄여 성능을 최적화하는 데 도움이 됩니다.

제품에 대한 리뷰 목록이 products 컬렉션 에 저장된 전자상거래 사이트 예로 들어 보겠습니다. 전자상거래 사이트 다음 스키마 가진 문서를 products 컬렉션 에 삽입합니다.

db.collection('products').insertOne( [
{
_id: ObjectId("507f1f77bcf86cd99338452"),
name: "Super Widget",
description: "This is the most useful item in your toolbox."
price: { value: Decimal128("119.99"), currency: "USD" },
reviews: [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widgt.",
published_date: ISODate("2019-02-18")
},
{
review_id: 785,
review_author: "Trina",
review_text: "Very nice product, slow shipping.",
published_date: ISODate("2019-02-17")
},
[...],
{
review_id: 1,
review_author: "Hans",
review_text: "Meh, it's ok.",
published_date: ISODate("2017-12-06")
}
]
}
] )

제품 데이터에 액세스할 때는 가장 최근의 리뷰만 필요할 가능성이 높습니다. 다음 절차에서는 위의 스키마 에 하위 집합 패턴 적용 방법을 보여 줍니다.

1

문서 에 대한 정보가 포함된 배열 필드 에서 가장 많이 액세스 데 필요한 정보의 하위 집합을 결정합니다. 예시 를 들어 products 컬렉션 에서는 가장 최근 리뷰 10개에만 액세스 해야 할 수 있습니다.

2

모든 리뷰를 제품과 함께 저장하는 대신 컬렉션 두 개의 컬렉션으로 분할 : 하나는 가장 많이 액세스하는 데이터용이고 다른 하나는 가장 적게 액세스한 데이터용입니다. 이를 통해 전체 배열 로드하지 않고도 가장 관련성이 높은 데이터에 빠르게 액세스 할 수 있습니다.

첫 번째 컬렉션 인 products 컬렉션 에는 현재 리뷰와 같이 가장 자주 사용되는 데이터가 포함되어 있습니다.

db.collection('products').insertOne( [
{
_id: ObjectId("507f1f77bcf86cd99338452"),
name: "Super Widget",
description: "This is the most useful item in your toolbox."
price: { value: Decimal128("119.99"), currency: "USD" },
reviews: [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widget.",
published_date: ISODate("2019-02-18")
},
[...],
{
review_id: 776,
review_author: "Pablo",
review_text: "Amazing!",
published_date: ISODate("2019-02-15")
}
]
}
] )

products 컬렉션 에는 가장 최근 리뷰 10개만 포함되어 있습니다. 이렇게 하면 전체 데이터의 일부 또는 하위 집합만 로드하여 작업 세트 줄일 수 있습니다.

두 번째 컬렉션 인 reviews 컬렉션 에는 이전 리뷰와 같이 사용 빈도가 낮은 데이터가 포함되어 있습니다.

db.collection('review').insertOne( [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widget.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2019-02-18")
},
{
review_id: 785,
review_author: "Trina",
review_text: "Very nice product, slow shipping.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2019-02-17")
},
[...],
{
review_id: 1,
review_author: "Hans",
review_text: "Meh, it's ok.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2017-12-06")
}
] )

추가 리뷰를 확인해야 할 때마다 reviews 컬렉션 액세스 할 수 있습니다. 데이터를 분할 할 위치를 고려할 때 문서에서 가장 많이 사용되는 필드는 기본 컬렉션 에 저장 하고 덜 자주 사용하는 데이터는 새 컬렉션 에 저장합니다.

더 자주 액세스하는 데이터와 함께 작은 문서를 사용하면 작업 세트 의 전체 크기를 줄일 수 있습니다. 이를 통해 애플리케이션 에 필요한 가장 자주 사용되는 정보에 대한 디스크 액세스 시간을 줄일 수 있습니다.

참고

하위 집합 패턴 사용하면 하나가 아닌 두 개의 컬렉션을 관리 해야 하며, 하위 집합이 아닌 문서 에 대한 포괄적인 정보를 수집해야 하는 경우 여러 데이터베이스를 쿼리 .

돌아가기

속성 패턴

이 페이지의 내용