MongoDB
- C++로 작성된 오픈소스 문서지향(Document-Oriented)적 Cross-plaform 데이터베이스
NoSQL
- Not Only SQL
- 기존 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터저장소
- 관계형 DB가 아니므로 RDBMS처럼 고정된 스키마 및 JOIN이 존재하지 않음
Document
- RDBMS의 record와 비슷한 개념
- 데이터 구조는 한개 이상의 key-value pair로 이루어져 있음
- ex)
{
"_id": ObjectId("5099803df3f4948bd2f98391"),
"username": "velopert",
"name": { first: "M.J.", last: "Kim" }
}
_id
, username
은 key, 오른쪽에 있는 값들은 value
_id
는 12bytes의 hexadecimal 값이며 각 document의 uniqueness를 제공
첫 4bytes는 현재 timestamp, 다음 3bytes는 machine id, 다음 2bytes는 MongoDB 서버의 프로세스id, 마지막 3bytes는 순차번호이며 추가될때마다 값이 높아짐
- Document는 동적의 스키마를 갖고있음
- 같은 Collection 안에 있는 Document끼리 다른 스키마를 가질 수 있음
- 즉, 서로 다른 데이터(다른 key)들을 가질 수 있음
Collection
- MongoDB Document의 그룹. Collection 내부에 Document들이 위치함
- RDBMS의 table과 비슷한 개념이지만 RDBMS와 달리 스키마를 따로 가지고 있지 않음
Database
- Collection들의 물리적인 컨테이너
- 각 Database는 파일 시스템에 여러 파일들로 저장됨
RDBMS vs. MongoDB
RDBMS | MongoDB |
---|
Database | Database |
Table | Collection |
Tuple / Row | Document |
Column | Key / Field |
Table Join | Embedded Documents |
| Database Server & Client |
mysqld | mongod |
mysql | mongo |
장점
- Schema-less: 스키마가 없음. 같은 Collection 안에 있어도 다른 스키마를 가질 수 있음
- 각 객체의 구조가 뚜렷함
- 복잡한 JOIN이 없음
- Deep Query ability: 문서지향적 Query Language를 사용하여 SQL 만큼 강력한 쿼리 성능 제공
- 어플리케이션에서 사용되는 객체를 데이터베이스에 추가할 때 Conversioin / Mapping이 필요하지 않음
Data Modeling
Schema 디자인 시 고려사항
- 사용자 요구에 따라 스키마를 디자인
- 객체들을 함께 사용하게 된다면 한 Document에 합쳐서 사용 (ex. 게시물-덧글 관계)
- 함께 사용하지 않으면(join을 사용하지 않는 것이 확실하면) 따로 Document 사용
- 읽을 때 join 하는 것이 아닌 데이터 작성 시 join
예제
- 간단한 블로그를 위한 데이터베이스 디자인
- 요구사항
- 게시글에는 작성자의 이름, 제목, 내용이 담겨져있음
- 각 게시글은 0개 이상의 태그를 가지고 있을 수 있음
- 게시글엔 덧글을 달 수 있음. 덧글은 작성자 이름, 내용, 작성시간을 담고있음
- RDBMS라면 comment, post, tag의 3개의 테이블을 생성하는 것이 효율적이지만 NoSQL에서는 모든 것을 하나의 Document에 넣음
{
_id: POST_ID,
title: POST_TITLE,
content: POST_CONTENT,
username: POST_WRITER,
tags: [ TAG1, TAG2, TAG3 ],
time: POST_TIME
comments: [
{
username: COMMENT_WRITER,
mesage: COMMENT_MESSAGE,
time: COMMENT_TIME
},
{
username: COMMENT_WRITER,
mesage: COMMENT_MESSAGE,
time: COMMENT_TIME
}
]
}