Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
/ / /

포함된 관계 및 수동 참조

이 가이드 에서는 MongoDB Entity Framework Core Provider를 사용하여 MongoDB database 에 있는 문서 간의 관계를 모델링하는 방법을 학습 수 있습니다. EF Core Provider는 다음과 같은 관계 유형을 지원합니다.

  • 포함된 관계: 상위 문서 내에 직접 포함된 하위 문서입니다. 이는 MongoDB 의 일대일 및 일대다 관계에 권장되는 접근 방식입니다.

  • 수동 참조: 문서 를 하위 문서로 포함하는 대신 필드 에 ID 를 저장하여 다른 문서 참조하는 문서 . 이 접근 방식은 다대다 관계를 모델링하거나 문서에 독립적으로 액세스 해야 하는 경우에 적합합니다.

쿼리 패턴에 대한 스키마 설계

MongoDB 용 데이터를 모델링할 때는 먼저 애플리케이션 가장 자주 실행하는 작업을 결정합니다. 그런 다음 이러한 작업을 효율적으로 지원하는 문서 구조를 선택합니다. MongoDB 에서 가장 효율적인 스키마 관계형 데이터베이스 에 사용하는 스키마 와 일치하지 않을 수 있습니다. 대신 어떤 데이터가 일반적으로 함께 검색되는지, 어떤 값이 자주 변경되는지, 시간이 지남에 따라 어떤 데이터 관계가 변경되는지 고려하세요.

데이터 모델링 및 관계형 데이터베이스 에서 MongoDB Server 로 마이그레이션하는 방법에 대해 자세히 학습 MongoDB Server설명서에서 SQL 에서 MongoDB 로의 매핑 차트 및 MongoDB 에서의 데이터 모델링을 참조하세요.

상위 문서 에 하위 문서를 포함하려면 내장된 문서 의 모델을 소유된 엔터티로 지정합니다. 포함된 관계는 관계를 모델링하고 함께 자주 액세스 문서에 대해 더 나은 성능을 제공하는 MongoDB 네이티브 방법입니다.

관련 데이터가 일반적으로 상위 데이터의 컨텍스트에서 표시되고 내장된 데이터의 크기가 합리적으로 제한되는 경우 내장된 문서를 사용합니다. 여기에는 주소, 설정 또는 제한된 최근 항목 목록과 같은 작은 하위 값 집합이 포함됩니다. 문서를 임베드할 때 MongoDB Server 단일 데이터베이스 작업으로 관련 데이터를 검색하고 단일 문서 내에서 관련 데이터를 원자적으로 업데이트하여 성능을 향상시킬 수 있습니다.

다음과 같은 경우 데이터 포함을 고려하세요.

  • 애플리케이션 은 일반적으로 상위 데이터와 하위 데이터를 함께 읽습니다. 하나의 쿼리 로 모든 항목을 가져오는 것이 별도로 호출하는 것보다 더 효율적입니다.

  • 관련 데이터는 명확한 상한이 없으면 증가하지 않습니다. 제한된 데이터로 인해 문서가 무한정 증가하거나 MongoDB의 16MB 문서 크기 제한에 도달하지 않습니다.

  • 관련 데이터는 상위 데이터와 독립적으로 자주 변경되지 않습니다. 이렇게 하면 상위 문서 다시 작성하는 데 드는 오버헤드 줄어듭니다.

참고

중첩된 계층 구조

중첩된 소유 엔터티의 속성 업데이트 하면 EF 핵심 제공자가 전체 루트 문서 다시 작성합니다. 3단계 이상의 중첩이 있는 엔터티 계층의 경우 트리 깊숙한 곳에 있는 작은 변경으로도 전체 상위 문서 재작성이 트리거되기 때문에 쓰기 (write) 비용 복잡해집니다. 모델에서 심층 중첩을 사용하고 애플리케이션 쓰기를 자주 수행하는 경우 계층 구조를 평면화하거나 내부 소유 엔터티를 수동 참조로 바꾸는 것이 좋습니다.

자세한 학습 은 MongoDB Server 설명서에서 내장된 데이터를 참조하세요.

다음과 같은 방법으로 소유된 엔터티를 지정할 수 있습니다.

  • [소유] 속성: [Owned] 하위 문서의 모델 클래스에 데이터 주석 속성을 적용합니다. 이 접근 방식은 선언적이며 간결하지만 소유된 유형의 모든 용도에 전역적으로 적용되므로 유연성이 떨어집니다.

  • Fluent API: 구성에서 OwnsOne() 또는 OwnsMany() 메서드를 DbContext 호출합니다. 이 접근 방식은 더 많은 제어와 유연성을 제공하므로 모델 클래스를 수정하지 않고도 특정 엔터티에 대해 관계 다르게 구성할 수 있습니다.

다음 섹션에서는 단일 및 다중 소유 엔터티를 모델링하기 위한 이러한 접근 방식의 예를 제공합니다.

상위 문서 내에 단일 문서 포함하려면 DbContext 구성에서 OwnsOne() 메서드를 호출하거나 포함된 클래스에 [Owned] 속성을 적용 .

다음 예시 내장된 Address 문서 포함된 Customer 엔티티를 보여줍니다. [Owned] Attribute 또는 Fluent API 탭 선택하여 해당 구문을 확인합니다.

[Owned]
public class Address
{
public string Street { get; set; } = null!;
public string City { get; set; } = null!;
public string Country { get; set; } = null!;
}
public class Customer
{
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
public Address Address { get; set; } = null!;
}
public class CustomerDbContext : DbContext
{
public DbSet<Customer> Customers { get; set; } = null!;
public CustomerDbContext(DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>(c =>
{
c.OwnsOne(c => c.Address);
c.ToCollection("customers");
});
}
}

Customer 엔티티를 저장하면 MongoDB AddressCustomer 문서 내에 내장된 문서 로 저장합니다. 다음 JSON 이 관계 MongoDB 에서 어떻게 나타나는지 보여줍니다.

{
"_id": ObjectId("..."),
"Name": "John Doe",
"Address": {
"Street": "123 Main St",
"City": "New York",
"Country": "USA"
}
}

상위 문서 에 여러 문서를 포함하려면 OwnsMany() 메서드를 호출하거나 포함된 클래스에 [Owned] 속성을 적용 하고 컬렉션 속성 정의합니다.

다음 예시 여러 개의 내장된 Order 문서를 포함하는 Customer 엔티티를 보여줍니다. [Owned] Attribute 또는 Fluent API 탭 선택하여 해당 구문을 확인합니다.

[Owned]
public class Order
{
public string Product { get; set; } = null!;
public int Quantity { get; set; }
}
public class CustomerWithOrders
{
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
public List<Order> Orders { get; set; } = new();
}
public class OrderDbContext : DbContext
{
public DbSet<CustomerWithOrders> Customers { get; set; } = null!;
public OrderDbContext(DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<CustomerWithOrders>(c =>
{
c.OwnsMany(c => c.Orders);
c.ToCollection("customers");
});
}
}

CustomerWithOrders 엔터티를 저장하면 MongoDB 다음 JSON 과 같이 Orders 를 내장된 문서의 배열 로 저장합니다.

{
"_id": ObjectId("..."),
"Name": "Jane Smith",
"Orders": [
{ "Product": "Laptop", "Quantity": 1 },
{ "Product": "Mouse", "Quantity": 2 }
]
}

포함되지 않은 엔터티 간의 관계를 모델링하려면 한 문서 의 ID 를 다른 문서 의 필드 에 저장하여 참조를 수동으로 저장 수 있습니다. 이 접근 방식을 사용하려면 애플리케이션 코드에서 관계 관리 해야 합니다.

부모와 독립적으로 관련 데이터를 정기적으로 쿼리 하거나, 자식 설정하다 매우 커질 수 있거나, 관련 데이터가 자주 변경되는 경우 참조를 사용합니다.

다음과 같은 경우에는 참조를 사용하는 것이 좋습니다.

  • 관련 데이터는 명확한 상한 없이 증가합니다. 배열이 제한되지 않으면 성능 문제가 발생할 수 있으며 MongoDB의 16MB 문서 크기 제한에 도달할 수 있습니다.

  • 관련 엔터티를 자체적으로 쿼리 해야 합니다. 상위 문서를 스캔하지 않고도 하위 컬렉션 직접 쿼리 하고 인덱스 할 수 있습니다.

  • 관련 데이터는 상위 데이터와 독립적으로 자주 변경됩니다. 내장된 데이터를 자주 업데이트하려면 매번 상위 문서 전체를 다시 작성해야 하므로 비효율적입니다.

  • 애플리케이션 일반적으로 상위 데이터와 하위 데이터를 함께 읽지 않습니다. 참조를 사용하면 필요하지 않은 하위 데이터를 가져오는 것을 방지할 수 있습니다.

  • 관계 다대다이거나 복잡합니다.

  • 데이터를 복제하면 너무 많은 업데이트 오버헤드 발생합니다.

자세한 학습 은 MongoDB Server 문서에서 참조 데이터를 참조하세요.

다음 예시 관련 엔터티에 대한 참조를 저장 방법을 보여 줍니다.

public class Author
{
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
}
public class Book
{
public ObjectId Id { get; set; }
public string Title { get; set; } = null!;
// Store reference to Author by storing the Author's Id
public ObjectId AuthorId { get; set; }
}

관련 엔터티를 조회 하려면 다음 예시 와 같이 참조된 컬렉션 별도로 쿼리 해야 합니다.

// Query a book and its author
var book = db.Books.FirstOrDefault(b => b.Title == "My Book");
var author = db.Authors.FirstOrDefault(a => a.Id == book!.AuthorId);

상위 문서 에 큰 배열 포함되어 있지만 애플리케이션 일반적으로 가장 최근 항목이나 가장 자주 액세스하는 항목만 사용하는 경우 하위 세트 패턴을 고려하는 것이 좋습니다.

하위 집합 패턴 에서는 가장 자주 액세스하는 항목을 기본 문서 에 유지하고 나머지는 별도의 컬렉션 으로 옮깁니다. 이 접근 방식은 문서 크기를 줄이고 더 많은 작업 세트 RAM 에 보관하여 쿼리 성능을 향상시킬 수 있습니다.

이 패턴 임베딩의 성능 이점을 원하지만 전체 임베딩된 기록으로 인해 문서가 너무 커지거나 로드하기에 비용이 너무 많이 드는 경우에 유용합니다.

MongoDB 의 스키마 설계 권장사항 에 대해 자세히 학습 MongoDB MongoDB Server 문서에서 데이터 모델링 모범 사례 및 스키마 설계를 참조하세요.

MongoDB 에서 데이터를 모델링하는 방법에 대해 자세히 학습 MongoDB Server 설명서에서 데이터 모델링을 참조하세요.

Entity Framework Core의 소유 엔터티 유형에 대해 자세히 학습 보려면 Microsoft Entity Framework Core 문서의 소유 엔터티 유형을 참조하세요.

이 가이드 에 설명된 메서드 및 유형에 대해 자세히 학습 다음 Microsoft API 설명서를 참조하세요.

돌아가기

데이터 쓰기

이 페이지의 내용