본문 바로가기

IT/Database

몽고DB란 무엇인가?

<위키백과>

몽고DB(MongoDB)는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이다. NoSQL 데이터베이스로 분류되는 몽고DB는 JSON과 같은 동적 스키마형 문서들(몽고DB는 이러한 포맷을 BSON이라 부름)을 선호함에 따라 전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼간다. 이로써 특정한 종류의 애플리케이션을 더 쉽고 더 빠르게 데이터 통합을 가능케 한다. 아페로 GPL아파치 라이선스를 결합하여 공개된 몽고DB는 자유-오픈 소스 소프트웨어이다.

http://ko.wikipedia.org/wiki/%EB%AA%BD%EA%B3%A0DB


특징

- Document-Oriented Storage : 모든 데이터가 JSON 형태로 저장되며 schema가 없습니다.
- Full Index Support : RDBMS에 뒤지지 않는 다양한 인덱싱을 제공합니다.
- Replication & High Availability : 데이터 복제를 통해 가용성을 향상시킬 수 있습니다.
- Auto-Sharding : Primary key를 기반으로 여러 서버에 데이터를 나누는 scale-out이 가능합니다.
- Querying : key 기반의 get, put 뿐만이 아니라 다양한 종류의 쿼리들을 제공합니다.
- Fast In-Place Updates : 고성능의 atomic operation을 지원합니다.
- Map/Reduce : 맵리듀스를 지원합니다.
- GridFS : 별도 스토리지 엔진을 통해 파일을 저장할 수 있습니다.



1. Indexing이 자유롭습니다.

MongoDB에서는 가장 많이 쓰이는 RDBMS인 MySQL에서 지원하는 대부분의 인덱스를 지원합니다. 지원하는 인덱스의 목록은 대략 다음과 같습니다.

- Single Field Indexes : 가장 기본적인 인덱스 타입
- Compound Indexes : RDBMS에서 많이 쓰이는 복합 인덱스
- Multikey Indexes : Array에 매칭되는 값이 하나라도 있으면 인덱스에 추가하는 멀티키 인덱스
- Geospatial Indexes and Queries : 위치 기반 인덱스와 쿼리
- Text Indexes : String 컨텐츠에도 인덱싱이 가능
- Hashed Index : BTree 인덱스가 아닌 Hash 타입의 인덱스도 사용 가능

이처럼 강력한 인덱스 기능 덕분에 거의 모든 쿼리들을 빠르게 처리할 수 있습니다. 이는 MongoDB를 선택한 가장 큰 이유인 동시에, 다른 NoSQL들에서는 찾아보기 힘든 장점이기도 합니다.


2. 많은 데이터를 한꺼번에 insert하면 안됩니다.

Row 단위의 락을 지원하는 대부분의 RDBMS와는 달리 MongoDB에서는 데이터베이스 단위의 락을 사용합니다

기존의 RDBMS 사용자들에게는 그야말로 충격과 공포죠.  하지만 여기서 끝이 아닙니다. MongoDB에서는 데이터베이스별로 Read Lock과 Write Lock이 있는데, read lock은 여러 개의 operation에서 공유가 가능하지만 write lock은 하나의 operation만이 사용할 수 있으며 (중간에 read operation도 허용하지 않습니다.) write lock은 항상 read lock보다 우선권을 갖습니다. 즉, read operation과 write operation이 동시에 queue에서 대기하고 있으면 항상 write operation이 실행된다는 것입니다. 따라서 MongoDB에서 대량의 데이터 (수만 이상) 를 한꺼번에 insert하면, DB가 insert의 수행때문에 다른 작업을 수행하지 못하게 됩니다. 장비를 정지합니다. 아..안되잖아?

따라서 지금 Hey에서는 대량의 insert 시에는 항상 수천 개 정도의 작은 단위로 쪼개어서 실행하고 있습니다. 그나마 MongoDB의 write가 메모리에 쓰는 방식이기 때문에 RDBMS에 비해 성능 저하는 덜하고, 긴 operation의 경우 lock을 양보하기도 하지만 (자세한 내용은 공식 문서를 참조) 그래도 찜찜한건 사실입니다.

 

3. 쿼리 문법이 불편합니다.

JSON 기반의 데이터베이스인데다가 NoSQL이기 때문에, 쿼리를 작성할 때 JSON으로 작성해야 합니다. 우선 간단하게 range 쿼리입니다.

4. Subdocument가 계속해서 늘어날 땐 별도의

collection으로 만들고 인덱스를 거세요.

Join이 안되는 MongoDB에서 1:N 관계를 표현할 때에는 referencing과 embedding의 두 가지 방법이 있습니다.



5. ActiveRecord와의 연동이 깔끔하지 않습니다.

Hey에서는 Ruby on Rails의 RDBMS 기반 ORM인 Activerecord와, MongoDB기반 ORM인 Mongoid를 동시에 사용합니다. 따라서, 당연하게도, ActiveRecord object에서는 mongoid와의 association을 선언할 수 없습니다.

출처 : http://bigmatch.i-um.net/2013/12/mongodb%EB%A5%BC-%EC%93%B0%EB%A9%B4%EC%84%9C-%EC%95%8C%EA%B2%8C-%EB%90%9C-%EA%B2%83%EB%93%A4/


'IT > Database' 카테고리의 다른 글

[mongodb] update , upsert  (0) 2014.09.11
[mongodb] Index 설정, 확인  (0) 2014.08.19
ubuntu에서 mongodb와 php 연동  (0) 2014.08.11
mongoDB - java 코드에서 insert 명령 수행해보기  (0) 2014.08.10
mongoDB query문 만들기  (0) 2014.08.10