PostgreSQL vs MongoDB
이번 포스트에서는 PostgreSQL과 NoSQL DB 중 각광을 받고 있는 MongDB를 비교한 아티클을 소개합니다.
원문의 출처는 다음과 같습니다.
이 아티클은 가장 유명한 RDBMS 중 하나인 PostgreSQL과 가장 많이 사용되는 document database인 MongoDB를 비교하고 각각의 장단점을 소개합니다. 또한 실제 운영 상황에 맞는 선택이 어떤 것인지도 알려줍니다.
최근 DB-engines.com의 데이터베이스 순위에서 PostgreSQL이 MongoDB에게 4위 자리를 내줬습니다.
이 자료는 시장 점유율을 나타내는 것이 아니라 다양한 소스로부터 계산된 데이터베이스 인지도를 나타냅니다. MongoDB가 최근 스타트업을 중심으로 많이 사용되면서 개발자들에게 인지도가 높아지고 있음을 보여주고 있습니다.
이 아티클을 통해 PostgreSQL과 MongoDB의 차이점을 살펴보고 각각이 어느 상황에 맞는지 알아보도록 하겠습니다.
1. 트랜잭션
PostgreSQL은 ACID 트랜잭션을 제공하며 Serializable 및 Read committed, repeatable read의 isolation level을 제공합니다.
MongoDB는 자체적으로 제공하는 트랜잭션 기능은 없습니다. 대신 쓰기 연산의 영속성(durability)에 대한 레벨을 지정할 수 있습니다.
2. Denormalized data
PostgreSQL는 Hstore, Json, jsonb, Array 네 가지 컬럼 유형으로 denormalized data를 저장할 수 있습니다.
MondgoDB는 denormalized data인 json을 저장하는데 최적화 돼 있습니다.
3. Normalized data
PostgreSQL은 normalized data를 저장합니다. 즉 데이터를 테이블 형태로 나눠 저장하고, 이 테이블 간의 관계를 foreign key로 정의할 수 있으며 테이블의 경계를 넘는 데이터를 추출해야 하는 경우 조인(join) 연산을 사용할 수 있습니다.
엄밀하지는 않지만 MongoDB의 collection은 PostgreSQL의 테이블로, document는MongoDB의 경우 row로 매핑할 수 있습니다, MongoDB에서는 Join을 지원하지 않고 Join을 사용하려면 DBRef를 사용하거나 application level의 로직을 사용해야 합니다.
4. 확장성
확장성에는 보통 수직적 확장성(vertical scalability)와 수평적 확장성(horizontal scalability)가 있습니다. 수직적 확장성은 하나의 머신에 리소스를 추가하는 것을 의미하며 수평적 확장성은 머신의 개수를 늘리는 것을 의미합니다. PostgreSQL은 수직적 확장은 용이하나 수평적 확장은 쉽지 않습니다. 수평적 확장성의 방법으로는 복제를 통해 read-only 머신을 추가하거나 데이터 분할(sharding)을 하는 것입니다. MongoDB의 경우 자체적으로 데이터 샤딩을 제공합니다. Shard key를 지정해 collection을 분할할 수 있고, query router가 질의를 처리하기 위한 shard를 찾아 처리합니다.
5. 빠른 prototyping
지금까지는 확장성을 제외하고는 PostgreSQL이 대부분의 영역에서 우월하였지만 MongoDB가 제공하는 이점도 있습니다. 우선 MongoDB는 스키마가 없습니다(schema-less). 따라서 애플리케이션에 대한 요구 사항이 빠르게 변화하는 상황에 쉽게 대응할 수 있습니다. 또한 정규화와 같은 데이터 모델링에 대해 고민하지 않아도 되며 JSON과 비슷한 질의 언어로 쉽게 접근할 수 있습니다.
이 아티클은 원문의 코멘트에도 지적됐듯이 약간은 PostgreSQL이 우세하다는 논조로 작성됐습니다. 그렇지만 결론에서 얘기하듯 MongoDB는 대규모 분산 데이터를 저장하고 데이터가 비정규화 돼있고 unstructured인 경우, 그리고 데이터 손실이 크게 문제가 안 되는 시스템에 적합하다고 얘기하고 있습니다. 또한 PostgreSQL이 RDBMS로서 매우 뛰어나지만 비정규화된 데이터를 저장해야 하는 경우에는 PostgreSQL의 JSONB를 사용하면 쉽게 처리할 수 있다고 얘기합니다.
또한 원문의 코멘트에서 NoSQL 데이터베이스가 시장에서 성공한 이유로 1) 개발자가 사용하기 쉬운 API와 2) DBA 입장에서의 손쉬운 확장성 관리를 얘기하고 있습니다. 실제로 스키마가 없다는 것은 빠르게 변화하는 애플리케이션의 요구 사항이 있거나 프로토타입을 단기간 내에 개발해야 하는 경우에는 매우 큰 장점이 될 수 있습니다. 이러한 이유로 인해 MongoDB와 같은 NoSQL 데이터베이스가 새로운 시장을 만들고 현재 데이터베이스 시장에서 큰 점유율을 차지할 수 있었던 이유라고 볼 수 있습니다.
마지막으로 PostgreSQL의 단점으로 지적되는 수평적 확장성에 대해서도 언급한 코멘트가 있습니다. CITUSDATA사에서 만든 PostgreSQL의 확장 모듈인 pg_shard를 사용하면 MongoDB와 같은 데이터 샤딩을 할 수 있고 확장성을 얻을 수 있습니다. 또한 오픈소스 프로젝트로 진행 중인 PostgreSQL-XL과 같이 Multi-Master 분산 구조를 지원하는 시스템도 있습니다. 또한 Instagram의 경우에도 여러 가지 방법을 통해 확장성 있는 PostgreSQL 환경을 구축한 예도 있습니다.
(http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram)
Posted by Bitnine(비트나인)
'ARCHIVES' 카테고리의 다른 글
PostgreSQL 9.4 공식 가이드 Vol.1 서버 관리 (0) | 2015.11.03 |
---|---|
JavaScript 문장 끝의 ;에 대해 (0) | 2015.10.16 |
Docker (0) | 2015.09.23 |
아젠스(Agens) SQL의 장점 (0) | 2015.09.23 |
아젠스(Agens) SQL 제품소개 (0) | 2015.09.23 |