Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

중복 데이터 처리

이 페이지의 내용

  • 이 작업에 대하여
  • 예시: 예: 전자상거래 스키마에서 데이터 복제하기
  • 단계
  • 데이터 복제의 이점
  • 예시: 제품 리뷰에 대한 중복 데이터
  • 단계
  • 데이터 복제의 이점
  • 자세히 알아보기

단일 문서에 관련 데이터를 포함할 경우, 두 컬렉션 간에 데이터가 중복될 수 있습니다. 데이터를 복제하면 모델에서 엔티티를 논리적으로 분리하면서 애플리케이션에서 여러 엔티티에 대한 관련 정보를 한 번의 쿼리로 쿼리할 수 있습니다.

데이터 복제에 대한 한 가지 우려는 스토리지 비용 증가입니다. 그러나 액세스 패턴 최적화의 이점은 일반적으로 스토리지로 인한 잠재적 비용 증가보다 큽니다.

데이터를 복제하기 전에 다음 요소를 고려하세요.

  • 중복된 데이터를 업데이트해야 하는 빈도. 중복된 데이터를 자주 업데이트하면 워크로드가 과중해지고 성능 문제가 발생할 수 있습니다. 그러나 간헐적인 업데이트를 처리하는 데 필요한 추가 논리는 읽기 작업에서 조인(조회)을 수행하는 것보다 비용이 적게 듭니다.

  • 데이터가 중복되면 읽기 성능에 이점이 생깁니다. 데이터를 복제하면 여러 컬렉션에서 조인(join)을 수행할 필요가 없으므로 애플리케이션 성능을 향상할 수 있습니다.

다음 예시에서는 전자상거래 애플리케이션 스키마에서 데이터를 복제하여 데이터 액세스 및 성능을 개선하는 방법을 보여 줍니다.

1
use eCommerce
2

eCommerce 데이터베이스에 다음 컬렉션을 만듭니다.

컬렉션 이름
설명
샘플 문서
customers
이름, 이메일, 전화번호와 같은 고객 정보를 저장합니다.
db.customers.insertOne( {
customerId: 123,
name: "Alexa Edwards",
email: "a.edwards@randomEmail.com",
phone: "202-555-0183"
} )
products
가격, 크기, 재료 등의 제품 정보를 저장합니다.
db.products.insertOne( {
productId: 456,
product: "sweater",
price: 30,
size: "L",
material: "silk",
manufacturer: "Cool Clothes Co"
} )
orders
날짜 및 총 가격 등의 주문 정보를 저장합니다. orders 컬렉션의 문서에는 lineItems 필드의 해당 주문에 해당하는 제품이 포함됩니다.
db.orders.insertOne( {
orderId: 789,
customerId: 123,
totalPrice: 45,
date: ISODate("2023-05-22"),
lineItems: [
{
productId: 456,
product: "sweater",
price: 30,
size: "L"
},
{
productId: 809,
product: "t-shirt",
price: 10,
size: "M"
},
{
productId: 910,
product: "socks",
price: 5,
size: "S"
}
]
} )

products 컬렉션에서 나온 다음과 같은 속성은 orders 컬렉션에서 복제됩니다.

  • productId

  • product

  • price

  • size

애플리케이션 에 주문 정보가 표시되면 해당 주문의 항목이 표시됩니다. 주문 정보와 제품 정보가 별도의 컬렉션에 저장된 경우 애플리케이션 은 $lookup 를 수행하여 두 컬렉션의 데이터를 결합해야 합니다. 조회 작업은 비용이 많이 들고 성능이 저하되는 경우가 많습니다.

orders 컬렉션에 품목만 포함하는 것이 아니라 제품 정보를 복제하는 이유는 주문을 표시할 때 응용 프로그램에 제품 정보의 하위 집합만 필요하기 때문입니다. 필수 필드만 포함하면 응용 프로그램은 orders 컬렉션에 불필요한 팽창을 추가하지 않고 추가 제품 세부 정보를 저장할 수 있습니다.

다음 예제에서는 하위 집합 패턴 을 사용하여 온라인 스토어의 액세스 패턴을 최적화합니다.

사용자가 제품을 볼 때 해당 제품의 정보와 가장 최근 리뷰 5개를 표시하는 애플리케이션을 생각해 보세요. 리뷰는 products 컬렉션과 reviews 컬렉션 모두에 저장됩니다.

새 리뷰가 작성되면 다음과 같은 쓰기가 발생합니다.

  • reviews 컬렉션에 리뷰가 삽입됩니다.

  • products 컬렉션의 최근 리뷰 배열이 $pop$push으로 업데이트됩니다.

1
use productsAndReviews
2

productsAndReviews 데이터베이스에 다음 컬렉션을 만듭니다.

컬렉션 이름
설명
샘플 문서
products
제품 정보를 저장합니다. products 컬렉션의 문서에는 recentReviews 필드의 가장 최근 제품 리뷰 5개가 포함되어 있습니다.
db.products.insertOne( {
productId: 123,
name: "laptop",
price: 200,
recentReviews: [
{
reviewId: 456,
author: "Pat Simon",
stars: 4,
comment: "Great for schoolwork",
date: ISODate("2023-06-29")
},
{
reviewId: 789,
author: "Edie Short",
stars: 2,
comment: "Not enough RAM",
date: ISODate("2023-06-22")
}
]
} )
reviews
최근 리뷰뿐만 아니라 제품에 대한 모든 리뷰를 저장합니다. reviews 컬렉션의 문서에는 리뷰와 관련된 제품을 나타내는 productId 필드가 포함되어 있습니다.
db.reviews.insertOne( {
reviewId: 456,
productId: 123,
author: "Pat Simon",
stars: 4,
comment: "Great for schoolwork",
date: ISODate("2023-06-29")
} )

애플리케이션은 데이터베이스를 한 번만 호출하여 표시해야 하는 모든 정보를 반환할 수 있습니다. 데이터가 완전히 별도의 컬렉션에 저장된 경우 애플리케이션은 products 컬렉션과 reviews 컬렉션의 데이터를 결합해야 하므로 성능 문제가 발생할 수 있습니다.

리뷰는 거의 업데이트되지 않으므로 중복 데이터를 저장하는 데 비용이 많이 들지 않으며, 컬렉션 간에 데이터를 일관성 있게 유지하는 것도 어렵지 않습니다.

중복 데이터의 일관성을 유지하는 방법을 알아보려면 데이터 일관성을 참조하세요.

돌아가기

운영 요인