심심한 개발자의 취미생활

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
        }
    ]
}