MongoDB는 document 기반의 오픈소스 데이터베이스다.
뛰어난 성능, 사용성, auto scaling을 제공하고 있다.
몽고디비는 키와 값으로 이루어진 document 형태로 저장이 됩니다.
몽고디비의 document는 JSON이랑 매우 유사한 형태를 가지고 있습니다.
각 필드의 값은 documents, array, documents로 이루어진 array로 구성이 됩니다.
document 형식의 이점은 다음과 같습니다.
- Document는 다양한 프로그래밍 언어의 원시형 데이터 타입입니다. (ex: objects)
- 내장 (Embeded) documents나 array를 통해서 비싼 비용의 조인 작업을 줄일 수 있습니다.
- Dynamic Schema를 통한 풍부한 데이터 형태의 표현이 가능합니다.
Embeded는 간단히 말해서 document내에 다른 document나 배열을 삽입할 수 있는 방법을 가르킵니다. 이로 인해서 다른 document의 정보들을 간단하게 가져올 수 있습니다.
Dynamic Schema는 데이터를 표현하는 Document의 구조를 동적으로 정의할 수 있음을 의미합니다.
문서의 구조가 동적으로 정의될 수 있기 때문에 동적 스키마라고 합니다.
동적 스키마를 사용하면 각 문서가 서로 다른 구조를 가질 수 있습니다. 즉 동일한 컬렉션에 속하는 두 문서가 서로 다른 필드를 가질 수 있습니다.
그래서 새로운 필드를 추가하거나 삭제할때 유연성을 제공합니다.
그러나 데이터의 유효성이나 일관성을 유지하기 위해서 데이터 모델을 쉽게 확장하고 수정할 수 있도록 해야합니다.
[[MongoDB - Document Database]] 여기서 Document기반의 DB의 장점을 알아보고 이제 트레이드오프에 대해서 알아보겠습니다.
RDBMS의 대표격이라고 볼 수 있는 MySQL과 MongoDB와 비교를 해보겠다.
어떤 상황에 사용해야할까?
관계형 데이터베이스 시스템 즉 정형와된 데이터 구조를 다루어야 하고 ACID 트랜잭션을 지원해야하며 복잡한 쿼리 및 조인 작업이 필요한 경우에는 RDB MySQL을 선택하는 것이 좋을 수 있다.
그리고 몽고디비는 유연한 데이터 모델이 필요하며 비정형 데이터 또는 다양한 데이터 유형들을 저장해야하는 경우, 확장성이 중요한 경우, 대용량의 데이터를 다루어야하는 경우, JSON 형식의 문서를 다루는 것에 중점을 두는 경우에 몽고디비를 고려해볼 수 있다.
여기서 한 가지 의문점이 들었다. MySQL에서 조인을 쓰지 않고 조회한다면 MongoDB에서 그냥 조회하는거랑 무엇이 다른가?
사실 다를 건 없다. MySQL에서도 조인을 사용하지 않고 조회하게된다면 인덱싱을 통해 데이터를 검색하기때문에 인덱스의 설정에 따라 무엇이 더 빠를지 정해진다. 즉 뭐가 더 좋은지는 알 수 없다.
오히려 트랜잭션이 필요한 상황이라면 MySQL을 더 고려해볼 수 있다.
추가로 MySQL 5.7부터 JSON 데이터 타입을 지원하기 시작했다. embeded documents와 유사한 구조를 만들 수 있다. NoSQL의 장점을 모방하며 트랜잭션까지 지원하여 장점을 유지할 수도 있다.
근데 솔직히 개인적인 생각으로는 RDB가 만들어진 이유와 추구하는 방향성에 따라 nosql을 모방하는것은 그렇게 좋게 보이지는 않는다.
샤딩 방식에서의 차이가 있는데 그것은 다른 글에서 언급하도록 하겠다.