ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB] NoSQL 중 하나인 MongoDB 란?
    Programing/DataBase 2016. 3. 22. 15:27

    데이터베이스에 대해 공부를 하다보면 한번쯤은 듣게되는 MongoDB

    MongoDB에 대해 간단하게 글을 써보겠다.

    (짧은 지식과 좁은 소견으로 인해 틀린정보가 있을 수 있습니다.)

    (사용법에 대한 글이 아닙니다.)

    몽고디비는 NoSQL중 하나다.

    마치 RDB에 Oracle, Mysql, MariaDB 등등 이 있듯이

    NoSQL에도 많은 종류가 있다.


    데이터 모델로 NoSQL 종류를 구분하곤 하는데,

    mongoDB는 도큐먼트 저장형식으로 구성된다.


    말그대로 폴더로 디비를 구분한다고 보면 편하다.

    그 외에 NoSQL의 구분 방법으로는 Key/Value로 나누는 경우도 있고, 그래프로 나누는방법 등 많은 종류로 나눠진다.


    종류별로 무엇이 있는지는 구글링을 하면 상당히 많은 글이 나오므로 생략하겠다.


    일단 mongoDB는 각 종 값들을 JSON형식으로 저장을 한다.

    또한 NoSQL이므로 RDB와 다르게 서로 관계가 없다.


    이말인 즉슨 Join하기가 힘들다는 것이다.

    (못하는 것은 아니다.. 다만 힘들뿐이지)


    또한 RDB처럼 테이블을 작성하지 않는다.

    콜렉션이라는 개념이 있지만 테이블과는 다르다.

    (각 종 제약들이 없기 때문에)


    기존 RDB와의 비교를 하는 것이 조금은 이상하다고 생각하지만


    굳이 비교를 해보자면

    (RDB는 비슷비슷하기때문에 MySQL과 비교를 해보겠다.)


    MySQL 

    MongoDB 

    Table

    Collection 

     제약이 있다.

    (Table형식에 맞게 삽입)

    제약이 없다.

    (맘대로 넣어도 된다.)

     테이블 간의 관계로 이루어진다.

    서로 관계가 없다. 



    관계가 없다는 것은 엄청난 장점이자 엄청난 단점? 이라고 생각한다.


    서비스하는 모델이 ACID를 엄격하게 지켜야하는 서로의 유기적인 연결이 필수인 서비스라면

    RDB를 사용하는 것이 좋다.


    이렇게만 보면 무슨말이야? 할텐데 별거 없다.

    예를들어 mysql에서 테이블을 하나 작성한다고 해보자


    1
    2
    3
    4
    5
    create table study(
    id int auto_incremnt primary key,
    title varchar(20),
    name varchar(20))
    DEFAULT CHARACTER SET=utf8;
    cs

    이렇게 스터디라는 테이블을 작성하면


    id 

    title 

    name 

     int(auto_increment) primary key

    varchar(20) 

    varchar(20) 


    이렇게 테이블이 생성 될 것이다.


    그러면 우리는 데이터를 삽입할때 이 테이블의 규약대로 title에는 텍스트20글자 name에도 텍스트20글자

    id값은 굳이 삽입하지 않아도 1씩 증가 이런식으로 테이블 규약에 맞춰서 데이터를 사용한다.


    id값을 이용하여 다른테이블의 foreign key와의 join을 할 것이며, 혹여나 형식이 다른 값이 들어가면 오류가 날 것이다.





    mongoDB의 콜렉션을 보자


    db.createColletion("study");


    스키마에 제약이 없기 때문에 그냥 생성한다.

    사용한다. 끝이다.


    그러면 '뭐야? 그러면 값들 구분을 안해?' 라고 생각한다.

    그렇다 구분을 안한다.


    물론 디비의 콜렉션 설계시에 프로젝트를 하는 사람들끼리 제약을 정할 수는 있다.

    다만 암묵적인 약속일 뿐


    따라서 값을 막 넣을 수 있다.

    위의 예시로둔 mysql에서는 title과 name값 외에는 집어넣을 수 없다.



    1. insert into study(title, name) values('안녕','투윅스');


    2. insert into study(title, name, nick) values('안녕','투윅스','twowix');


    2번의 insert문은 동작이 되지 않는다.

    당연하다 nick이라는 컬럼이 없는데 어디다가 값을 집어 넣을 것인가


    하지만 mongoDB에서는


    1. db.study.insert({title:"안녕",name:"투윅스"});


    2. db.study.insert({title:"안녕",name:"투윅스",nick:"twowix"});


    둘 다 들어간다.


    여기서 시사하는 점은 데이터가 유동적으로 자주 변하는 각 종 값들이 제약이 없는 데이터 모델이라면 NoSQL을

    데이터의 값들이 제약적이어야 하고 서로 관계로 얼기설기 묶여야한다면 RDB를 사용하면 되는 것이다.


    사실 이 짧은 글만으로는 mongoDB를 설명하기는 부족하다.

    다만 어느정도 이해가 가능 할 것이다.

    (틀린 정보도 있을 수 있으니.. 혹시 틀린부분 있으면 댓글 부탁드립니다.)


    SQL이 좋나 NoSQL이 좋나 이것은 의미없는 말이다.

    각자의 장단점이 있고 서비스에 맞게 사용을 하면 되는 것이다.


    공부할 겸 RDB가 유리한 서비스에 NoSQL을 적용해보기도 하고,

    NoSQL이 유리한서비스에 RDB설계를 기가 막히게해서 적용해보기도 하고

    각 자의 장단점을 파악하면 될 것이다.


    다시한번 말하지만 뭐가 좋고 뭐가 나쁘고는 없다.

    (자꾸 이분법적으로 접근하는 사람들이 있어서..)



    마치며..

    필자는 취준생이므로 많은 채용공고를 보곤한다.

    특히 스타트업에 관심이 많아서 스타트업 채용 공고를 많이 보곤하는데

    SQL과 NoSQL을 병행하는 기업들이 많이 보인다.

    나 역시 그것이 맞다고 본다.

    (유기적인 관계의 데이터와 오로지 데이터만 쌓아야하는 경우가 공존하기 때문에)


    따라서 두 가지를 다알면 손해볼건 없다고 생각한다.

    공부하자

    댓글

Designed by Tistory.