[MongoDB]MongoDB 소개


MongoDB


MongoDB는 C++로 작성된 문서지향(Document-Oriented)적 데이터 베이스이며, NoSQL중 인지도 1위를 유지하고 있습니다.

NoSQL이란?

NoSQL은 Not Only SQL이라는 뜻으로 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터 저장소입니다.

## Document Document는 RDMS의 record와 비슷한 개념입니다. 이는 한개 이상의 key-value pair로 이루어져 있습니다. ```javascript { "_id": ObjectId("5099803df3f4948bd2f98391"), "username": "mozi", "name": { first: "donghun", last: "Lee" } } ``` 여기서 _id,username,name은 ``key``이고 오른쪽에 있는 값들은 ``value``입니다. ``_id``는 12bytes의 hexadecimal 값으로서, 각 document의 유일함을 제공합니다. Document는 동적의 schema를 가지고 있습니다. 같은 Collection안에 있는 Document끼리 다른 schema를 갖고 있을 수 있습니다. ## Collection Collection은 Document의 그룹입니다. Document들이 Collection 내부에 위치하고 있습니다. RDBMS의 table과 비슷한 개념. RDBMS와 달리 schema를 따로 가지고 있지는 않습니다. # 장점 * 각 객체의 구조가 뚜렷합니다. * 복잡한 JOIN이 없습니다. * Deep Query ability(문서 지향적 Query를 사용) * Schema-less # Data Modeling ## schema 디자인 할 때 고려사항 * 사용자의 요구에 따라 schema를 디자인 한다. * 객체들을 함께 사용하게 된다면 한 Document에 합쳐서 사용합니다.(ex: 게시물과 댓글). 그렇지 않을 경우 따로 사용합니다. * 읽을때 JOIN을 하는 것이 아닌, 작성할 때 JOIN을 합니다. ## 예시 만약 다음과 같은 요구사항을 만족하는 데이터 베이스를 디자인한다고 가정한다면 * 게시글에는 작성자 이름,제목,내용이 담겨있음. * 각 게시글은 0개 이상의 태그를 가지고 있을 수 있다. * 게시글엔 댓글을 달 수 있다. 댓글은 작성자 이름, 작성 시간을 담고 있다. RDBMS와 달리 NoSQL은 이를 하나의 Document에 담습니다. ```javascript { _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 } ] } ```