티스토리 뷰
MongoDB는 NoSQL로 분류되는 도큐먼트 지향 데이터베이스 시스템입니다.
> NoSQL이란?
- NoSQL = "Not only SQL". 즉, SQL만을 사용하지 않는 Schema-less 데이터베이스 관리 시스템을 지칭합니다.
- 대부분 클러스터에서 실행할 목적으로 만들어졌기 때문에 관계형 모델을 사용하지 않습니다.
- 대부분 오픈소스입니다.
- 스키마 없이 동작하며, 구조에 대한 정의를 변경할 필요 없이 데이터베이스 레코드에 자유롭게 필드를 추가할 수 있습니다.
> NoSQL의 등장 배경
- 웹 2.0 환경과 빅데이터가 등장하면서 RDBMS는 '데이터를 처리하는 데 필요한 비용의 증가' 때문에 난관을 겪습니다. 데이터와 트래픽의 양이 기하급수적으로 증가함으로써 관계형 데이터베이스를 사용하는 것은 하드웨어적으로 큰 비용이 들게 되었습니다. 장비의 성능이 좋을수록, 성능을 향상시키는 데(Scale-up: 수직적 확장) 비용이 기하급수적으로 증가하기 때문입니다.
- NoSQL은 데이터의 일관성을 약간 포기하는 대신 여러 대의 컴퓨터에 데이터를 분산하여 저장하는 것(Scale-out: 수평적 확장)을 목표로 등장하였습니다. NoSQL의 등장으로 작고 값싼 장비 여러 대로 대량의 데이터와 컴퓨팅 부하를 처리하는 것이 가능하게 되었습니다.
> NoSQL의 특징
- 일관성과 확장성 사이의 Trade-off (비일관성 감수)
- 다수가 동시에 읽고 쓰는 상황에서의 성능 향상을 위하여
- 분산 환경에서 노드들이 잘 작동하고 있음에도, 시스템의 일부가 고장나면 데이터베이스를 사용할 수 없게 되는 문제를 해결하기 위하여
- 분산 저장
- 샤딩(Sharding)
- 샤드 키(Shard key)를 기준으로 하나의 테이블을 수평 분할하여 서로 다른 클러스터에 분산 저장하고 질의할 수 있는 기법입니다.
- 이를 통해 관계형 데이터베이스에서도 부하를 분산할 수 있지만 어플리케이션 레벨에서 모든 샤딩을 제어해야 합니다. (어떤 데이터를 어느 클러스터에서 처리해야 하는지 등) 또한 여러 샤드에 걸치는 쿼리나 참조 정합성, 트랜잭션, 일관성의 제어에 문제가 발생합니다.
- 분산 저장을 지원하는 NoSQL 데이터베이스의 경우, 집합-지향(Aggregate-oriented) 모델을 사용하여 이러한 문제를 해결합니다. 연관된 데이터들이 함께 분산되므로, 관계형 모델에서처럼 복잡한 제어가 필요하지 않게 됩니다.
- 샤딩(Sharding)
- 데이터 일치
- RDBMS에서 관계형 튜플 안의 값은 단순해야 하며 중첩된 레코드나 리스트 등 다른 구조를 포함할 수 없는 반면, 메모리 내 데이터 구조에서는 이런 제약이 없어 훨씬 복잡한 구조를 사용합니다. (ex: 리스트, 딕셔너리, 중첩된 객체 구조) 그 결과 복잡한 메모리 내 데이터 구조를 데이터베이스에 저장하려면 먼저 관계형 표현으로 변환해야 합니다. 물론 이는 ORM(Objective-Relational Mapping: 객체-관계 매핑) 프레임워크를 통해 해결할 수 있지만, 여전히 관계형 모델과 메모리 내 데이터 구조 간에는 데이터 불일치는 존재합니다. 이를 Impedance mismatch라 합니다.
- 하지만 NoSQL은 그런 게 없습니다. 메모리 내의 데이터가 어떤 구조이든지 상관하지 않고 하나의 Aggregation으로 취급하여 저장해버리기 때문입니다. 따라서 NoSQL에서는 ORM 프레임워크가 필요하지 않습니다.
- Schema-less
- NoSQL 데이터베이스의 공통적인 특징은 스키마 없이 동작한다는 점입니다. 따라서 데이터 구조를 미리 정의할 필요가 없으며, 시간이 지나더라도 언제든지 바꿀 수 있기 때문에 비형식적인 데이터를 저장하는 데 용이합니다. 하지만 이는 데이터베이스가 스키마를 직접 관리하지 않는 것을 의미할 뿐, 데이터 타입에 따른 암묵적인 스키마는 여전히 존재합니다. 이 때문에 단일 값에 대한 데이터 타입에서 불일치가 발생할 수 있습니다.
- 예를 들어 필드의 이름을 "Quantity"라고 하기로 했을 때, 이것은 앞으로 저장할 때 반드시 필드의 이름을 "Quantity"라고 저장하겠다는 암묵적인 스키마가 됩니다. 암묵적인 스키마를 무시할 경우 Quantity를 quantity, qty, QUANTITY 등으로 저장할지도 모릅니다. 뜬금없이 새로운 필드가 추가되는 것이나 마찬가지입니다. 이는 NoSQL 데이터베이스가 암묵적인 스키마에 대해 전혀 알지 못하며, 이를 강제하지 않기 때문에 발생하는 문제입니다. 그렇기 때문에 NoSQL을 사용할 때는 주의를 기울여야 합니다.
> NoSQL의 종류
NoSQL 데이터베이스는 크게 네 가지 모델로 나눌 수 있습니다.
- Key-value
- Document (MongoDB 해당)
- Column-family
- Graph
이 중 그래프 모델을 제외한 나머지 세 모델은 집합-지향(Aggregate-oriented) 모델입니다.
- 집합-지향(Aggregate-oriented 모델)
- 집합(Aggregate)이란 연산의 한 단위로 취급되는 연관된 객체들의 집합입니다. 집합 지향 데이터베이스는 집합 자료구조로 이루어져 있습니다. 관계형 모델처럼 하나의 엔티티에 대한 ACID 트랜잭션을 지원하지는 않지만, 하나의 집합에 대한 연산에서는 트랜잭션을 지원합니다.
- 집합 지향 데이터베이스는 여러 대의 클러스터로 이루어진 시스템에서 사용하기 적합합니다. 다시 말해 수평적 확장이 용이합니다. 이는 관계형 데이터베이스와는 다리 연관된 데이터들이 함께 움직이기 때문입니다. 또한 메모리 내의 자료구조와 집합 간 데이터가 잘 일치하므로, 관계형 데이터베이스처럼 객체-관계 매핑 프레임워크가 필요하지 않습니다. 데이터의 검색도 아주 쉬운 편으로, 키나 ID를 사용하면 쉽게 집합 레코드를 찾아낼 수 있습니다. 데이터의 검색도 아주 쉬운 편으로, 키나 ID를 사용하면 쉽게 집합 레코드를 찾아낼 수 있습니다.
- 집합 지향 데이터베이스는 조인 연산이 불가능한데, 이를 보완하기 위해 MongoDB나 Cassandra 등의 데이터베이스에서는 맵 리듀스(MapReduce) 기능을 제공함으로써 조인과 유사한 연산을 가능하도록 설계했습니다. 이를 사용하여 데이터 분석도 가능합니다. 하지만 사용이 어렵고 Hadoop의 맵 리듀스에 비하면 속도도 매우 느립니다.
- Document
- 데이터는 키와 도큐먼트(Document)의 형태로 저장됩니다. Value가 계층적인 형태인 도큐먼트로 저장되는 것입니다. 객체지향에서의 객체와 유사하며, 이들은 하나의 단위로 취급되어 저장됩니다. 다시 말해 하나의 객체를 여러 개의 테이블에 나눠 저장할 필요가 없어진다는 뜻입니다. 또한 Document 모델에서는 도큐먼트 내의 item을 이용한 쿼리가 가능합니다.
- 객체를 도큐먼트의 형태로 바로 저장 가능하기 때문에 객체-관계 매핑이 필요하지 않습니다. 또한 검색에 최적회되어 있습니다. 단점이라면 사용이 번거롭고 쿼리가 SQL과는 다르다는 점입니다. 도큐먼트 모델에서는 질의의 결과가 JSON이나 xml형태로 출력되기 때문에 그 사용 방법이 RDBMS에서의 질의 결과를 사용하는 방법과 다릅니다.
- Document 모델을 사용하는 NoSQL 데이터베이스로는 MongoDB, CouchDB, MarkLogin 등이 있습니다.
> SQL / MongoDB 사용 용어 비교
SQL 사용 용어 | MongoDB 사용 용어 |
데이터베이스(database) | 데이터베이스(database) |
테이블(table) | 컬렉션(collection) |
행(row) | 문서(document) 또는 BSON 문서 |
열(column) | 필드(field) |
색인(index) | 색인(index) |
테이블 조인(table joins) | 임베디드 문서 & 링킹(linking) |
기본키(primary key) | 기본키(primary key, _id 필드 자동 생성) |
집합(aggregation, 예: group by) | 집합(aggregation) 프레임워크 |
참고자료:
https://namu.wiki/w/NoSQL
728x90
'dev > mongodb' 카테고리의 다른 글
[번역] MongoDB Aggregation / 어그리게이션, 집합, 집계 (0) | 2019.10.03 |
---|---|
[번역] MongoDB Delete Documents / 도큐먼트 삭제 (0) | 2019.09.14 |
[번역] MongoDB Update Documents / 도큐먼트 업데이트 (0) | 2019.09.14 |
[번역] MongoDB Query Documents / 도큐먼트 쿼리 (0) | 2019.09.14 |
[번역] MongoDB Insert Documents / 도큐먼트 삽입 (0) | 2019.09.11 |
댓글