04. 도큐먼트 지향 데이터

스키마 설계#

이론에따라 스키마를 설계해야 하지만, 실제에서는 이론을 융통성 있게 적용해야 한다

  • MongoDB가 모든 애플리케이션에 적합한 것은 아니다
  • 데이터 모델을 결정할 때 여러 질문을 하며 따져봐야함
    • 읽기/쓰기 비율
    • 집계는 필요한가
    • 쿼리는 쉬운가
    • 데이터는 얼마나 저장되는가
  • MongoDB 특징
    • 애드혹 쿼리 지원
    • 조인 지원 X
    • 트랜잭션 지원 X
    • 원자적 업데이트를 다양하게 지원
  • MongoDB 에서 기본키는 _id 를 어떻게 채울 것인가에 따라 달림

전자상거래 데이터 모델#

  • MongoDB는 객체-관계 매핑 (ORM) 툴에 대한 필요성이 상대적으로 낮다
    • 도큐먼트가 이미 객체와 같은 표현이라서
    • 사용하기 쉬운 드라이버가 MongoDB에 대해 상위 계층 인터페이스를 잘 제공하고 있음
  • 사용 컬렉션
    • products
    • categories: 상품 카테고리
    • users
    • orders
    • reviews
  • 도큐먼트 표현 이점
    • 사람이 이해하기 쉬움
    • 상품이 구매된 후 주문 아이템들이 주문 도큐먼트 내에서 효과적으로 동결됨
    • 주문 도큐먼트에 대한 질의와 수정이 용이
  • reviews에 username이 들어 있음
    • 거의 바뀌지 않으므로 매번 users 다큐먼트를 조회하는 것 보단 비정규화를 택함
    • MongoDB는 도큐먼트내 필드내 배열의 크기를 질의하는 것을 허용하지 않음
      • 따라서 배열의 크기를 따로 가지는 필드가 필요함 (helpful_votes)

데이터베이스, 컬렉션, 도큐먼트의 실제적 세부사항들#

  • main points
    • DB, Collection, Document 사용 세부사항
    • 데이터 파일을 어떻게 할당하는가
    • 도큐먼트 내 허용되는 데이터 타입
    • capped 컬렉션의 의미와 이점

DB#

  • Collection, Index 의 물리적 모음, 네임스페이스
  • db를 drop하면 관련 파일들이 디스크에서 삭제되어 취소 불가능

데이터 파일과 할당#

  • mongod.lock: 서버 프로세스 ID (관련에러가 있으면 복구해야함)
  • garden.*: DB 파일
    • garden.ns: namespace, 컬렉션과 인덱스 메타에 대한 해시테이블
      • 네임스페이스 제한은 WiredTiger 엔진에선 적용 X
    • garden.{number}: 실제 저장되는 공간
      • 64mb 부터 두배씩 증가하며 파일이 늘어남 (2gb 까진)
  • db.stats() 로 할당된 크기 확인 가능
    • fileSize: 할당된 파일 크기
    • dataSize: 실제 BSON 데이터 크기
    • storageSize: 컬렉션이 증가할 것에 대비한 여분 공간, 삭제되었지만 아직 할당되지 않은 공간
    • indexSize: 메인 메모리에 인덱스가 다올라가면 성능이 좋으므로 볼필요가 있음

Collection#

  • 구조적, 개념적으로 비슷한 도큐먼트가 담긴 컨테이너
  • products.categoriesproducts 는 다른 컬렉션

capped 컬렉션#

  • 높은 성능의 로깅 기능을 위해 설계
  • 고정된 크기를 갖는다
  • 더 이상 공간이 없게 되면 document 삽입 시, 컬렉션에서 추가된 지 가장 오래된 document를 덮게됨
  • db.createCollection("users.actions", {capped: ture, size: 16384, max: 100})
    • max: 다큐먼트 최대 저장 수
    • size: 최대 파일 크기
  • 도큐먼트 삭제, 업데이트 불가

TTL 컬렉션#

  • db.reviews.createIndex({time_field: 1}, {expireAfterSeconds: 3600})
    • time_field 필드가 1시간 이상 경과되면 삭제됨
  • 한계
    • _id, 이미 인덱스가 잡혀있는 필드는 사용 불가
    • 캡드 컬렉션은 TTL 컬렉션 사용 불가
    • 필드가 타임스탬프 배열이라면 배열 중 가장 빠른 타임 스탬프에 TTL 인덱스를 적용하여 체크함

시스템 컬렉션#

3.6 에선 system.namespaces system.indexes 확인 불가

Document#

  • MongoDB에 저장되기 전 BSON으로 시리얼라이즈되어 저장한다
  • 도큐먼트 내에 키값이 포함되어 저장공간을 차지함 (RDB 와 다른점)
  • 형식
    • 문자열: utf-8 을 따름
    • 숫자: int, long, double 중 하나
      • 보통 자동으로 드라이버가 판단
      • 쉘에서는 지정할 수 있음 NumberLong("10") 이런식으로 지정 가능
    • 날짜와 시간
      • BSON을 타임존을 인식하지 못함
      • 따로 타임존을 도큐먼트에 명시해줘야함
  • 도큐먼트 크기는 16mb 로 제한됨
    • db.isMaster() 내용 중 maxBsonObjectSize 로 알 수 있음
    • 이유
      • 과도하게 큰 도큐먼트를 가지는 스키마를 방지
      • 성능: 도큐먼트가 거대해지면 일부만 필요한 경우가 생기는데 다른것도 다 불러와야해서 성능이슈
  • insert_many 를 이용해 bulk insert로 대용량 삽일을 할 수 있음
    • 너무 크면 여러 단위로 쪼개서 하는 것을 추천
    • 16mb 이하 단위를 권장
Last updated on