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.categories
와products
는 다른 컬렉션
#
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 이하 단위를 권장