티스토리 뷰

DB/MongoDB

[MongoDB] 애플리케이션 설계

snail voyager 2023. 6. 20. 19:10
728x90
반응형

9.1 스키마 설계 고려 사항

제약 사항

  • 도큐먼트 최대 크기 16Mbyte
  • 디스크에서 전체 도큐먼트를 읽고 쓴다
  • 갱신은 전체 도큐먼트를 다시 쓰며, 원자성 갱신은 도큐먼트 단위로 실행

쿼리 및 쓰기의 접근 패턴

  • 쿼리 수를 최소화하고, 함께 쿼리되는 데이터가 동일한 도큐먼트에 저장되도록 설계
  • 쿼리에 사용되지 않는 데이터는 다른 컬렉션에 넣어야 한다.
  • 자주 사용하지 않는 데이터도 다른 컬렉션으로 넣는다.

관계 유형

  • 요구 사항 측면과 도큐먼트 간 관계 측면 고려하여 도큐먼트를 내장하거나 참조할 방법을 결정
  • 쿼리하지 않고 도큐먼트를 참조하는 방법을 파악해야 하며,
  • 관계가 변경될 때 갱신되는 도큐먼트 개수를 알아야함.

카디널리티

  • 일대일, 일대다, 다대다 인지 고려
  • 도큐먼트 간에 데이터를 비정규화해야 할지, 도큐먼트를 내장할지, 참조할지 결정하는데 도움

9.1.1 스키마 설계 패턴

다형성 패턴 Polymorphic Pattern

  • 컬렉션 내 모든 도큐먼트가 유사하지만 동일하지 않은 구조를 가질 때 적합
  • 공통 쿼리를 지원하는 도큐먼트에서 공통 필드를 식별하는 것이 포함

속성 패턴 Attribute Pattern

  • 정렬하거나 쿼리하려는 도큐먼트에 필드의 서브셋이 있는 경우
  • 정렬하려는 필드가 도큐먼트의 서브셋에만 존재하는 경우
  • 두 조건이 모두 해당하는 경우에 적합

버킷 패턴 Bucket Pattern

  • 데이터가 일정 기간 동안 스트림으로 유입되는 시계열 데이터에 적합

이상치 패턴 Outlier Pattern

  • 도큐먼트의 쿼리가 애플리케이션의 정상적인 패턴을 벗어날 때 사용
  • 인기도가 중요한 상황을 위해 설계된 고급 스키마 패턴

계산된 패턴 Computed Pattern

  • 데이터를 자주 계산해야 할 때나 데이터 접근 패턴이 읽기 집약적일 때 사용
  • 주요 도쿠먼트가 주기적으로 갱신되는 백그라운드에서 계산을 수행하도록 권장

서브셋 패턴 Subset Pattern

  • 장비의 램 용량을 초과하는 작업 셋이 있을 때 사용
  • 사용하지 않는 정보를 많이 포함하는 대용량 도큐먼트 때문에 발생
  • 서브셋 패턴은 자주 사용하는 데이터와 자주 사용하지 않는 데이터를 두 개의 개별 컬렉션으로 분할

확장된 참조 패턴 Extended Reference Pattern

  • 각각 고유한 컬렉션이 있는 여러 논리 엔티티가 있고, 특정 기능을 위해 엔티티들을 모을 때 사용
  • 데이터를 중복시키는 대신 정보를 조합하는데 필요한 쿼리 수를 줄인다
  • 자주 사용하는 정보로 서브 도큐먼트의 배열 생성, 추가적인 정보는 실제 도큐먼트를 참조하는 방식

근사 패턴 Approximation Pattern

  • 리소스가 많이 드는 계산이 필요하지만 높은 정확도가 반드시 필요하지 않은 상황에 유용
  • 이미지나 게시글의 추천 수, 페이지 조회 수

트리 패턴 Tree Pattern

  • 쿼리가 많고 구조적으로 주로 계층적인 데이터가 있을 때 적용
  • 함께 쿼리되는 데이터를 한데 저장하는 방식

사전 할당 패턴 Preallocation Pattern

  • MMAP 스토리지 엔진과 함께 사용
  • 빈 구조를 사전 할당
  • 예약 정보를 매일 관리하는 시스템에서 예약 가능 여부와 현재 예약상태를 추적하는데 적용

도큐먼트 버전 관리 패턴 Document Versioning Pattern

  • 도큐먼트의 이전 버전을 유지하는 메커니즘
  • 각 도큐먼트에 부가 필드를 추가, 도큐먼트의 모든 수정 사항을 포함하는 추가 컬렉션 필요
  • 각 도큐먼트의 개정은 횟수 제한, 버전 관리가 필요한 도큐먼트가 적음
  • 쿼리는 각 도큐먼트의 현재 버전에서 먼저 수행

9.2 정규화 vs. 비정규화

  • 정규화는 컬렉션 간의 참조를 이용해 데이터를 여러 컬렉션으로 나누는 작업
    • 데이터는 하나의 컬렉션에 들어 있고, 데이터를 변경하려면 한 도큐먼트만 갱신
    • 쓰기가 빠름
  • 비정규화는 모든 데이터를 하나의 도큐먼트에 내장
    • 여러 도큐먼트가 최종 데이터 사본에 대한 참조.
    • 정보가 변경되면 여러 도큐먼트가 갱신돼야 하지만, 하나의 쿼리로 관련된 모든 데이터를 가져올 수 있음
    • 읽기가 빠름

9.2.1 데이터 표현 예제

확장 참조 패턴

//Users
{
  _id: ObjectId("user1"),
  name: "John Doe",
  email: "john.doe@example.com"
}
//Posts
{
  _id: ObjectId("post1"),
  title: "Introduction to MongoDB",
  content: "MongoDB is a flexible and scalable NoSQL database.",
  author: {		//내장
    userId: ObjectId("user1"),		//참조
    name: "John Doe"
  }
}
내장 방식이 좋은 경우 참조 방식이 좋은 경우
작은 서브 도큐먼트 큰 서브 도큐먼트
주기적으로 변하지 않는 데이터 자주 변하는 데이터
결과적인 일관성이 허용될 때 즉각적인 일관성이 필요할 때
증가량이 적은 도큐먼트 증가량이 많은 도큐먼트
두 번째 쿼리를 수행하는 데 자주 필요한 데이터 결과에서 자주 제외되는 데이터
빠른 읽기 빠른 쓰기

9.2.2 카디널리티

  • '다수'라는 개념을 '많음'과 '적음'이라는 범주로 나눠 개념상 이해
  • '적음' 관계는 내장이 더 적합, '많음' 관계는 참조가 더 적합

9.3 데이터 조작을 위한 최적화

9.3.1 오래된 데이터 제거

  • 제한 컬렉션 사용
  • TTL 컬렉션 사용
  • 여러 개의 컬렉션 사용

9.4 데이터베이스와 컬렉션 구상

  • 스키마가 유사한 도큐먼트는 같은 컬렉션에 보관
  • 컬렉션에서는 락과 저장을 중요하게 고려
  • 데이터베이스 내 모든 항목이 품질, 비슷한 접근 패턴, 비슷한 트래픽 수준을 갖는 것이 좋음

9.5 일관성 관리

  • 서버는 각 연결에 대한 요청 큐를 보관
  • 각 연결은 데이터베이스에 대해 일관적인 관점을 가지며 자신의 쓰기를 항상 읽을 수 있음

9.6 스키마 마이그레이션

  • 스키마를 애플리케이션의 요구에 맞춰 변화시키는 방법 → 코드를 복잡하게 만든다
  • 각 도큐먼트에 "version" 필드를 추가 → 구 버전에 대한 지원이 필요
  • 스키마가 변경될 때 모든 데이터를 마이그레이션 → 모든 도큐먼트가 성공적으로 갱신됐는지 확인

9.7 스키마 관리

  • 유효성 검사는 기존 도큐먼트가 수정되기 전에는 확인하지 않으며 컬렉션별로 구성

9.8 몽고 DB를 사용하지 않는 경우

  • 다양한 유형의 데이터를 여러 차원에 걸쳐 조인하는 작업
  • 몽고 DB를 지원하지 않는 도구를 사용할 때
728x90
반응형

'DB > MongoDB' 카테고리의 다른 글

[MongoDB] 복제 셋 설정  (0) 2023.07.11
[MongoDB] 트랜잭션  (0) 2023.07.02
[MongoDB] 집계 프레임워크  (0) 2023.05.10
[MongoDB] 공간 정보 인덱스  (0) 2023.04.26
[MongoDB] 인덱싱2  (0) 2023.04.18
반응형
300x250