몽고DB란?
몽고DB는 강력하고 유연하면 확장성 높은 도큐먼트 지향 데이터베이스다.
관계형 모델로 대용량 데이터 작업을 하게 되면 스키마에 맞게 데이터를 조작해서 작업해야 한다.
몽고DB는 솔루션 자체적으로 분산 처리, 샤딩, 데이터 리밸런싱, 데이터 복제, 복구 등을 지원하고 무엇보다 스키마가 없기 때문에 대용량의 데이터 작업에 아주 효율적인 데이터베이스이다.
도큐먼트
몽고DB의 핵심이자, 기본 단위는 도큐먼트이며, 이는 관계형 데이터베이스의 행과 유사하다.
도큐먼트는 정렬된 키와 연결된 값의 집합으로 이뤄져있다.
도큐먼트 표현 방식은 프로그래밍 언어마다 다르지만 대부분의 언어는 맵(Map), 해시(Hash), 딕셔너리(dictionary)와 같이 도큐먼트를 자연스럽게 표현하는 자료구조를 가진다.
{"greeting": "Hello, world!", "views": 3}
위 도큐먼트는 greeting 키 값의 Hello, world!라는 값, views라는 키 값의 값으로 3을 가진다.
도큐먼트의 값은 단지 blob형이 아니다. 값은 데이터 형이어야 한다.(Hello, world!는 문자열, 3은 정수)
도큐먼트의 키는 문자열이고 \0(null 문자)을 포함하지 않는다. \0은 키의 끝을 나타나내는데 사용된다.
.과 $ 문자는 몇 가지 특별한 속성을 가지며 특정 상황에서만 사용해야 한다.
이 문자들은 예약어로 취급하며 부적절하게 사용하면 드러이버에서 경고를 발생한다.
그리고 몽고DB에서는 데이터형과 대소문자를 구별하고, 키 값은 중복이 될 수 없다.
{"count": 5} != {"count": "5"}
{"count": 5} != {"Count": 5}
{"name": "devbeekei", "name": "hong gil dong"} // 올바른 도큐먼트가 아님
컬렉션
컬렉션은 도큐먼트의 모음이다.
몽고 DB의 도큐먼트가 관계형 데이터베이스의 행에 대응된다면 컬렉션은 테이블에 대응된다고 볼 수 있다.
동적 스키마
컬렉션은 동적 스키마를 가진다. 하나의 컬렉션 내 도큐먼트들이 모두 다른 구조를 가질 수 있다는 의미다.
{"hello": "world"}
{"name": "devbeekei", "job": "developer", "age": 28}
위 두개의 도큐먼트처럼 키, 키의 개수, 데이터형의 값이 다른 도큐먼트들을 한 컬렉션에 저장할 수 있다.
다른 구조의 도큐먼트라도 같은 컬렉션에 저장할 수 있는데 왜 별도의 컬렉션이 필요한가 생각할 수 있는데, 이는 몇가지 합당한 이유가 있다.
- 같은 컬렉션에 다른 종류의 도큐먼트를 저장하면 개발자와 관리자에게 번거로운 일이 생길 수 있다.
예를 들어 블로그 게시물을 쿼리한 데이터 중 작성자 데이터만 제거하려면 상당히 번거롭다. - 컬렉션 별로 목록을 뽑으면 한 컬렉션에서 목록을 뽑을 때보다 훨씬 빠르다.
- 같은 종류의 데이터를 하나의 컬렉션에 모아두면 데이터 지역성에도 좋다.
- 인덱스를 만들면 도큐먼트는 특정 구조를 가져야 한다. 이러한 인덱스는 컬렉션 별로 정의한다.
같은 유형의 도큐먼트를 하나의 컬렉션에 넣음으로써 컬렉션을 효율적으로 인덱싱할 수 있다.
애플리케이션 스키마는 기본적으로 필요하지는 않지만 정의하면 좋다.
몽고DB의 도큐먼트 유효성 검사 기능(document validation functionality)과 객체-도큐먼트 매핑 라이브러리(object-document mapping library)를 이용하며, 이는 많은 프로그래밍 언어에서 사용이 가능하다.
네이밍
켈렉션의 이름으로 식별된다.
컬렉션명은 어떤 UTF-8 문자열이든 쓸 수 있지만 몇 가지 제약 조건이 있다.
- 빈 문자열("")은 유효한 컬렉션명이 아니다.
- \0(null 문자)은 컬렉션명의 끝을 나타내는 문자이므로 컬렉션명에 사용할 수 없다.
- system.으로 시작하는 컬렉션명은 시스템 컬렉션에서 사용하는 예약어이므로 사용할 수 없다.
- 사용자가 만든 컬렉션은 이름에 예약어인 $를 포함할 수 없다.
시스템에서 생성한 몇몇 컬렉션에서 $를 사용하므로 지원은 하지만, 이런 컬렉션에 접근할때가 아니라면 사용해서는 안 된다.
서브컬렉션
서브컬렉션(subcollection)의 네임스페이스(namespace)에 .(마침표) 문자를 사용해 컬렉션을 체계화한다.
예를 들어 블로그 기능이 있는 애플리케이션은 blog.posts와 blog.authors라는 컬렉션을 가질 수 있다.
이는 단지 체계화를 위함이며 blog 컬렉션이나 자식 컬렉션과는 아무런 관계가 없다. 심지어 blog 컬렉션은 없어도 된다.
서브클렉션은 특별한 속성은 없지만 여러 몽고 DB툴에서 지원하므로 유용하다.
서브컬렉션은 몽고DB의 데이터를 체계화하는 훌륭한 방법이다.
데이터베이스
몽고DB는 컬렉션에 도큐먼트를 그룹화할 뿐 아니라 데이터베이스에 컬렉션을 그룹지어 놓는다.
몽고 DB의 단일 인스턴스는 여러 데이터베이스를 호스팅할 수 있으며, 각 데이터베이스를 완전히 독립적으로 취급할 수 있다.
한 애플리케이션의 데이터를 동일한 데이터베이스에 저장하는 것은 좋은 방식이다.
데이터베이스를 나누면 하나의 몽고DB 서버에서 여러 애플리케이션이나 여러 사용자 데이터를 저장할 때 유용하다.
데이터베이스는 컬렉션과 마찬가지로 이름으로 식별된다. 데이터베이스 이름에는 어떤 UTF-8 문자열이든 쓸 수 있지만 몇 가지 제약 조건이 있다.
- 빈 문자열("")은 유요한 데이터베이스 이름이 아니다.
- 데이터베이스 이름은 다음 문자를 포함할 수 없다. /, \, ., ' ', *, <, >, :, |, ?, $, (단일 공간), \0(null 문자)
- 데이터베이스 이름은 대소문자를 구별한다.
- 데이터베이스 이름은 최대 64바이트다.
또한 직접 접근할 수 있지만 특별한 의미론을 갖는 예약된 데이터베이스 이름도 있다.
admin
admin 데이터베이스는 인증과 권한 부여 역활을 한다.
또한 일부 관리 작업을 하려면 이 데이터베이스에 대한 접근이 필요하다.
local
local 데이터베이스는 단일 서버에 대한 데이터를 저장한다.
복제 셋에서 local은 복제 프로세스에 사용된 데이터를 저장한다.
local 데이터베이스 자체는 복제되지 않는다.
config
샤딩(sharding)된 몽고DB 클러스터는 config 데이터베이스를 사용홰 각 샤드의 정보를 저장한다.
컬렉션을 저장하는 데이터베이스의 이름을 컬렉션명 앞에 붙이면 올바른 컬렉션명인 네임스페이스를 얻는다.
예를 들어 cms 데이터베이스의 blog.posts 컬렉션을 사용한다면 컬렉션의 네임스페이스는 cms.blog.posts가 된다.
네임스페이스의 최대 길이는 120바이트지만 실제로는 100바이트보다 짧아야 한다.
'MongoDB' 카테고리의 다른 글
몽고DB 도큐먼트 삽입, 삭제하기 (0) | 2022.05.26 |
---|---|
몽고DB 셸 사용해보기 (0) | 2022.05.26 |
몽고DB의 데이터형 (0) | 2022.05.25 |
몽고DB 셸 소개 (0) | 2022.05.25 |
Docker로 몽고DB 시작하기 (0) | 2022.05.25 |