MongoDB란?

hwwwa·2022년 4월 17일
0
post-thumbnail

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

RDBMSMongoDB
DatabaseDatabase
TableCollection
Tuple / RowDocument
ColumnKey / Field
Table JoinEmbedded Documents
Database Server & Client
mysqldmongod
mysqlmongo

장점

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

0개의 댓글