MongoDB를 사용하게 될 수도 있을 것 같아 NoSQL과 MongoDB에 대해 정리해보았다!
NoSQL은 Not Only SQL, 즉 SQL을 사용하는 RDBMS가 아닌 데이터베이스를 의미한다.
대표적인 RDBMS
로는 MySQL, Oracle, PostgreSQL 등이 있고, NoSQL
진영에는 MongDB, Redis, HBase 등이 있다.
보통 서비스들은 RDBMS
를 기본으로 사용했지만 소셜 SNS를 비롯한 온라인 서비스들이 등장하면서 비정형 데이터를 쉽게 담아서 처리할 수 있는 DB에 대한 수요가 생겼다.
또한 클라우드, 분산형 컴퓨팅이 주목받고 있는데 SQL은 이에 적합하지 않다. SQL은 강력한 정보 저장 수단이지만 다양한 환경과 분산 컴퓨팅 추세에 따라 SQL의 약점이 나타나게 된 것이다.
그래서 이러한 약점을 보완할 수 있는 NoSQL
이 각광을 받게 되었다.
NoSQL
은 기존의 관계형 데이터베이스 시스템의 주요 특성을 보장하는 ACID를 지키지 않고, BASE를 선택했다. 뛰어난 확장성이나 성능 등 특성을 갖는 비관계형 데이터 베이스이다.
이는 단순 검색 및 추가 작업에 있어서 매우 최적화된 키 값 저장 기법을 사용하며 응답속도나 처리 효율등에 있어서 매우 뛰어난 성능을 나타낸다.
DB 트랜잭션이 안전하게 수행됨을 보장한다.
ACID와 대조적으로 가용성과 성능을 중시하는 분산 시스템의 특성이다
Base Available
부분적인 고장은 있을 수 있으나, 나머지는 사용이 가능하다
주 서버가 안되더라도 백업 서버는 동작한다
Soft State
노드의 상태는 외부에서 전송된 정보를 통해 결정됨
분산 노드 간 업데이트는 데이터가 노드에 도달한 시점에 갱신되고
최신 상태의 데이터로 덮어써진다
Eventually Consistent
일시적으로 비일관적인 상태가 되어도 최적으로는 일관성이 있는 상태가 되는 성질
시스템 부하, 네트워크 속도 등의 외부 요인으로 인해 일관성이 일시적으로 깨질 수 있음
SQL은 각 테이블 간의 관계 지정을 통해 테이블을 접근할 수 있고, 따라서 중복 없이 해당 데이터만을 다룰 수 있다
보통 하나의 컬렉션에 관련 데이터를 모두 작성한다. 이 컬렉션 만으로 원하는 데이터를 모두 볼 수 있다. 다만 SQL과 다르게 중복된 데이터가 생기게 된다. 그래서 데이터 업데이트시 주의해야 한다.
Key-Value DB
데이터가 Key-Value 쌍으로 저장되고 Key에는 어떠한 형태의 데이터도 담을 수 있다.
간단한 API를 제공하는 만큼 속도가 빠르다.
ex) Redis, Riak, Amazon Dynamo DB
Document DB
데이터가 Key-Document 형태로 저장된다.
Value가 계층적인 형태인 Document로 저장된다. 이는 객체 지향의 객체와 비슷하며 하나의 단위로 취급된다. 즉, 하나의 객체를 여러 테이블에 나눠 저장할 필요가 없어진다.
검색에 최적화 되어있고 단점은 사용이 번거롭고 쿼리가 SQL과 다르다.
ex) MongoDB, CouthDB
Wide Column DB
Column-family Model 기반의 DB이다
이는 키에서 필드를 결정한다. 키가 Row(키 값)와 Column-family, Column-name을 가진다. 연관된 데이터는 같은 Column-family안에 속하며 각자의 Column name을 가진다. 이렇게 저장 된 데이터는 커다란 하나의 Table로 표현이 가능하고 질의는 Row, Column-family, Column-name을 통해 수행된다.
ex) HBase, Hypertable
Graph DB
데이터를 Node와 Edge, Property와 함께 그래프 구조를 사용하여 데이터를 표현하고 저장하는 DB이다.
=> RDBMS
는 DB 구조가 변경될 여지가 없으며 명확한 스키마가 중요한 경우 사용한다. 또한 관계를 맺고 있는 데이터가 자주 변경되는 시스템에 적합하다.
=> NoSQL
는 정확한 데이터 구조를 알 수 없는 경우나 Scale-out이 가능하므로 막대한 데이터를 저장해야 하는 시스템에 적합하다.
mongoDB는 NoSQL DB로 Document 기반으로 구성되어 있다. 또한 오픈 소스이기 때문에 무료로 이용이 가능하다.
대표적인 특징은 다음과 같다
Document
는 HTML과 같은 특정 형식의 태그 구조를 의미하며 mongoDB는 JSON 형식으로 데이터를 관리하므로 NoSQL DB중 Document Database로 분류된다. 또한 이는 mongoDB가 데이터를 저장하는 최소 단위이기도 하다.
Document는 필드와 값의 쌍으로 구성되며, 관계를 갖는 데이터를 중첩 Document와 배열을 사용하여 1개의 Document로 표현할 수 있다.
데이터 입출력 시에는 JSON 형식의 Document를 사용하나 DB 저장시 시에는 Binary 포맷으로 인코딩한 BSON(Binary JSON) 형식의 Document로 변환되어 저장된다.
스키마의 선언 없이 필드의 추가와 삭제가 자유로운 Schema-less 구조이다.
관계형 DB는 테이블 내 모든 Row의 칼럼 집합이 동일하고 같은 칼럼은 동일한 데이터 타입을 가지는 정형 스키마이지만, mongoDB는 컬렉션 내 모든 Document들의 필드 집합이 동일하지 않고 같은 필드라도 데이터 타입이 다를 수 있는 비정형 스키마이다.
mongoDB는 관계 개념이 없는 비관계형 DB이다. 따라서 Join을 지원하지 않으며 임베디드 방식의 Document 구조를 사용하거나 레퍼런스 방식의 Document 구조를 사용한 후 애플리케이션 단에서 Join 해야 한다.
mongoDB는 트랜잭션을 지원하지 않고 각각의 Document 단위로 처리된다. 따라서 Commit과 Rollback 개념이 없으며 모두 Auto Commit으로 처리된다.
https://meetup.toast.com/posts/276
https://aws.amazon.com/ko/nosql/
https://www.samsungsds.com/kr/insights/1232564_4627.html
https://kciter.so/posts/about-mongodb
https://pythontoomuchinformation.tistory.com/528
https://atin.tistory.com/624
https://meetup.toast.com/posts/274