Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

임베딩으로 데이터 일관성 강화

이 페이지의 내용

  • 이 작업에 대하여
  • 시작하기 전에
  • 단계
  • 결과
  • 다음 단계
  • 자세히 알아보기

스키마가 여러 컬렉션에 동일한 데이터를 저장하는 경우 관련 데이터를 임베드하여 중복을 제거할 수 있습니다. 업데이트된 비정규화 스키마는 데이터 값을 단일 위치에 유지하여 데이터의 일관성을 유지합니다.

관련 데이터를 임베딩하면 스키마가 간소화되고 사용자가 항상 최신 데이터를 읽을 수 있습니다. 그러나 임베딩은 다대다와 같은 복잡한 관계를 나타내는 데에는 최선의 선택이 아닐 수 있습니다.

관련 데이터를 최적으로 내장하는 방법은 애플리케이션에서 실행하는 쿼리에 따라 다릅니다. 단일 컬렉션에 데이터를 내장할 때는 성능 좋은 쿼리를 지원하는 인덱스를 고려하고 효율적이고 논리적인 인덱스가 가능하도록 스키마를 구성하세요.

문서 및 참조 임베딩의 이점을 비교하려면 임베디드 데이터 대 참조를 참조하세요.

데이터 일관성을 시행하는 다양한 방법을 검토하여 임베딩이 애플리케이션에 가장 적합한 접근 방식인지 확인하세요. 자세한 내용은 데이터 일관성에서 확인하세요.

데이터베이스에 데이터가 저장되는 방식을 업데이트하면 기존 인덱스와 쿼리에 영향을 미칠 수 있습니다. 스키마를 업데이트할 때는 스키마 변경 사항을 고려하여 애플리케이션의 인덱스와 쿼리도 업데이트하세요.

다음 예는 전자상거래 애플리케이션에서 데이터 일관성을 적용하는 예입니다. 초기 스키마에서 제품 정보는 productssellers collection에 중복됩니다. products 컬렉션의 sellerId 필드는 sellers 컬렉션에 대한 참조 이며 데이터를 서로 연결합니다.

// products collection
[
{
_id: 111,
sellerId: 456,
name: "sweater",
price: 30,
rating: 4.9,
color: "green"
},
{
_id: 222,
sellerId: 456,
name: "t-shirt",
price: 10,
rating: 4.2,
color: "blue"
},
{
_id: 333,
sellerId: 456,
name: "vest",
price: 20,
rating: 4.7,
color: "red"
}
]
// sellers collection
[
{
_id: 456,
name: "Cool Clothes Co",
location: {
address: "21643 Andreane Shores",
state: "Ohio",
country: "United States"
},
phone: "567-555-0105",
products: [
{
id: 111,
name: "sweater",
price: 30
},
{
id: 222,
name: "t-shirt",
price: 10
},
{
id: 333
name: "vest",
price: 20
}
]
}
]

스키마를 비정규화하고 일관성을 시행하려면 sellers 컬렉션 내에 제품 정보를 내장하세요.

db.sellers.insertOne(
{
_id: 456,
name: "Cool Clothes Co",
location: {
address: "21643 Andreane Shores",
state: "Ohio",
country: "United States"
},
phone: "567-555-0105",
products: [
{
id: 111,
name: "sweater",
price: 30,
rating: 4.9,
color: "green"
},
{
id: 222,
name: "t-shirt",
price: 10,
rating: 4.2,
color: "blue"
},
{
id: 333,
name: "vest",
price: 20,
rating: 4.7,
color: "red"
}
]
}
)

업데이트된 스키마는 사용자가 특정 판매자를 쿼리할 때 모든 제품 정보를 반환합니다. 업데이트된 스키마에는 데이터가 단일 컬렉션에서 비정규화되므로 데이터 일관성을 유지하기 위한 추가 논리나 유지 관리가 필요하지 않습니다.

스키마를 재구성한 후 일반적인 쿼리를 지원하는 인덱스를 만들 수 있습니다. 예를 들어 사용자가 색상별로 제품을 자주 쿼리하는 경우 products.color 필드에 인덱스를 생성할 수 있습니다.

db.sellers.createIndex( { "products.color": 1 } )

돌아가기

트랜잭션 사용