MongoDB 소개 및 데이터 모델링
참고 사이트
https://velopert.com/category/dev-log/tech-log/mongodb
소개
MongoDB는 C++로 작성된 오픈소스 문서 지향적 Cross-platform 데이터 베이스이며, 뛰어난 확장성과 성능을 자랑합니다.
Document
- Document는 RDMS의 recode와 비슷한 개념으로, 이의 데이터 구조는 한개이상의 key-value 쌍으로 이루어져 있습니다.
{
"_id": OjbectId("60608c7833d0ccdc15a53007"),
"username":"ballboy",
"name": {
"first":"SeungWoo",
"last":"Yang"
}
}
- 여기서 _id, username, name은 key이고 그 오른쪽의 있는 값들은 value입니다. _id는 12bytes의 hexadecimal 값으로, 각 document의 유일함(uniqueness)을 제공합니다. 이 값의 첫 4bytes는 현재 timestamp, 다음 3bytes는 machine id, 다음 2bytes는 MongoDB 서버의 프로세스id, 마지막 3bytes는 순차번호 입니다.
- Document는 동적의 schema를 가지고 있습니다. 같은 Collectino안에 있는 Document끼리 다른 Schema를 가지고 있을 수 있습니다.
Collection
- Collection은 MongoDB Document의 그룹입니다. Document들이 Collection내부에 위치하고 있습니다. RDMS의 table과 비슷한 개념입니다. 하지만 RDMS와 달리 schema를 따로 가지고 있지 않습니다.
Database
- Database는 Collection들의 물리적인 컨테이너 입니다. 각 Database는 파일시스템에 여러 파일들로 저장됩니다.
RDMS와의 비교
RDBMS | MongoDB |
---|---|
Database | Database |
Table | Collection |
Tuple/Row | Document |
Column | Key/Field |
Table Join | Embedded Documents |
Primary Key | Primary Key(_id) |
장점
- Schema-less
- 각 객체의 구조가 뚜렷하다.
- 복잡한 JOIN이 없다.
- Deep Query Ability (문서지향적 Query Language를 사용하여 SQL 만큼 강력한 Query 성능을 제공한다.)
- 어플리케이션에서 사용되는 객체를 데이터베이스에 추가 할 떄 Conversion / Mapping 이 불필요하다
Data Modelling
schema 디자인 할 때 고려 사항
- 사용자 요구에 따라 schema를 디자인한다.
- 객체들을 함께 사용하게 된다면 한 Document에 합쳐서 사용한다.
- ex) 게시물 - 덧글 관계
- 읽을 떄 Join 하는게 아니라 데이터를 작성 할 떄 Join한다.
예제
- 간단한 게시글 저장 데이터 베이스 디자인
- 게시글에는 작성자 이름, 제목, 내용이 담겨져 있다.
- 각 게시글은 0ㅐ 이상의 태그를 가지고 있을 수 있따.
- 게시글엔 덧글을 달 수 있다. 덧글은 작성자 이름, 내용, 작성시간을 담고 있다.
- MongoDB 구조
{
"_id": POST_ID,
"title": POST_TITLE,
"content": POST_CONTENT,
"username": POST_WRITER,
"tags": [ TAG1, TAG2, TAG3 ],
"time": POST_TIME,
"comments": [
{
"username": COMMENT1_WRITER,
"message": COMMENT1_MESSAGE,
"time": COMMENT1_TIME
}, {
"username": COMMENT2_WRITER,
"message": COMMENT2_MESSAGE,
"time": COMMENT2_TIME
}
]
}