본문 바로가기

IT/Database

[NoSQL] MongoDB (문서, 콜렉션 ,데이터베이스)



1. 문서(Document)  : 하나의 레코드

  : 몽고 DB의 핵심은 정렬된 키와 연결된 값의 집합으로 이루어진 문서

  ; 문서는 RDBMS에서는 테이블의 하나의 행(JSON)이라고 생각하면 됨

    

  Ex1) { "userid" : "idkhs04"}

  Ex2) { "userid" : "idkhs04", 

          "username" : "김아무개", 

          "country" :"South Korea"

          "tags" : ["mongo", "db"]

          }

       위의 예를 보면 그냥 일반적인 JSON 데이터 일 뿐입니다.

       하지만 아래의 경우는 몇가지 규칙이 있으니 천천히 살펴 보셔야 겠습니다.

 

  가. 문서의 키-쌍은 정렬 되어 있으므로 아래의 문서는 다른 문서임

    - {"userid" : "idkhs04", "username" : "김아무개"} != { "username" : "김아무개", "userid" : "idkhs04"}

 

  나.  문서의 키는 문자열의 형

    - 키는 \0(null 문자)을 포함하지 않습니다. 이 문자는 키의 끝을 나타내는데 쓰이기 때문.

    - ‘.’ 과 ‘$’ 문자는 몇 가지 특별한 속성을 가지고 있으며 특정 상황에서만 사용해야 함.  

      이 문자들은 보통 예약어로 취급해야 하며, 부적절하게 사용하는 경우 드라이버에서 경고가 발생 됨.

    - 엄격하게 지켜지는 것은 아니지만 ‘_’로 시작하는 키는 예약어로 생각하는 편이 좋음

 

  다. 대소문자 구분

  라. 쉘 내의 모든 숫자는 64bit 부동소수점형

  마. 모든 문자는 utf-8 

  바. boolean 형 : true, false

  사. null 지원 ex) {"x" : null}

  아. 날짜형 지원 ex) {"write_date" : new Data()}  // 표준시간대는 저장 하지 않음

  자. 정규표현식 지원 : 문서내 자바스크립트 문법의 정규표현식 포함 가능

      ex) {"x" : /footbar/i}

  차. 문서는 자바스크립트 코드 포함 가능

      ex) {"x" : function(){/**/}}

  

  

위의 예를 본다면

하나의 문서(Document)를 구조적으로 나타낸것입니다.

하나의 JSON 데이터로 나타내면 위와 같으며, 

주의깊게 볼점은 커맨트수가 많아진다고 어떠한 행(레코드)가 늘어나는것이 아니라

JSON의 배열형태로 저장되는것을 볼 수 있습니다. "comment" : [{.....}, {.....}]

그렇기 때문에 COMMENT 의 INSERT가 나오는게 아니라 COMMENT의 업데이트로 

데이터가 저장되게 됩니다. 물론 구조적으로는 삽입이 맞지만 DB관점에서 그렇다(update)는 것이죠

 

여기서 흥미로운점은 RDMBS에서 하나의 컬럼을 추가 및 수정하기 위해서 어떠한 막대한 지출을 감수했지만

몽고DB는 전혀 고민 안해도 된다는 것..

 

DB중심적이 아니라 애플리케이션 중심의 non-scheme db이므로 어찌보면 두말하면 잔소리인거죠

그렇지만 생각없이 난잡하게 하는건 자제 해야겠죠. 

 

 

2. 컬렉션(Collection) : 하나의 (문서)테이블

  : 문서(Document)(의 모음으로서 RDBMS에서는 하나의 테이블로 생각하면 됨

  ; 단계적으로 봤을때 테이블이지만 RDBMS에서의 정규화된 테이블로 생각하면 안됨

    --> 스키마가 없음(scheme-free)

     + JSON으로 이루어진 문서(행)의 모음이라고 생각하는게 좀 더 정확함

     + 내부적으로는 BSON을 사용(BSON : Binary JSON)

    --> system으로 시작하는 이름은 사용불가(예약어)

  ex) db.컬렉션이름.명령어

  가. 생성 : db.createCollection("myTestCollection")

                -> db.myTestCollections.insert({ number : 1}) : 동시에 생성 및 문서값 저장

  나. 보기 : show collections ; 현재 db에 존재하는 모든 콜렉션들을 보여줍니다.

                -> mysql의 show tables 와 유사

  다. 삭제 : db.myTestCollection.drop()

       - 스키마 삭제, 데이터 삭제

  라. 데이터만 삭제 : db.myTestCollection.delete();

       - 이부분 또한 일반적인 T-SQL 문법과 유사합니다.  

 

  여러 NoSQL이 있지만 특히나 MongoDB는 데이터를 Binary 형태로 변환되어 저장됩니다.

  그래서 BSON 데이터라고 부릅니다.

 

 

 

3. 데이터베이스(DataBase)

  : 몽고디비는 문서를 컬렉션으로 모아두고, 여러 컬렉션들을 데이터베이스에 모아둠 

  - 하나의 데이터베이스는 따로 분리된 파일로 디스크에 저장됨

  - 데이터베이스 이름은 모두 소문자로 지정

  - 이름은 최대 64바이트

  - use myDB ; T-SQL문법이 같습니다.

     -> myDB를 사용하겠다

 

 

몽고 DB는 지금까지 배우고 사용해왔던 SQL과는 개념이 많이 다르면서도

참신하거 같다는 생각이 듭니다. 복잡한 데이터 화면 설계를 어떻게 해야하나 란 걱정을 단번에 떨쳐버린 느낌입니다.

이래서 복잡한 조인 연산이나, DB 정규화 등등에 대해서 자유로울수가 있구나 란 생각이 들었습니다.

 

문법적인 측에서도 기존의 개발자들이 JavaScript 및 JSON 에 대해서 무리 없이 사용하고 있으므로

도입에 대한 부분에 대해서는 아주 낙관적인 생각이 드네요