• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

질문있습니다!

21.04.13 22:21 작성 조회수 153

2

안녕하세요! 좋은 강의 감사드립니다 :)

강의를 들으면서 mongodb의 data 저장에 대해 한가지 의문사항이 생겨 글 남깁니다!

mongodb 같은 경우에는

{

    _id: ...

    content: ...

    user: ...

 }

와 같은 형태로 data를 저장하는데요.

이럴 경우 해당 collection의 모든 document에서 _id, content, user 값이 즉, key에 해당하는 값이 중복되어 저장되는 구조인가요? (예를 들어, 위와 같은 형식의 document가 10000개 저장된다면 _id, content, user 값 또한 10000번 중복되어 저장)

만약 그렇다면, mongodb는 저장하는 data 형태의 특성상 저장 공간을 효율적으로 사용하지 못한다는 단점을 가지고 있다고 생각해도 되는 걸까요? 

답변 1

답변을 작성해보세요.

1

ygh님 안녕하세요 :)

매우 좋은 질문입니다!

ygh님께서 추측하신대로 몽고디비는 key도 모두 중복으로 저장됩니다. 관계형 데이터베이스는 컬럼 값만 저장되고 컬럼명은 중복으로 저장되지 않죠. 딱 봐도 몽고디비가 저장면에서 더 비효율적으로 보여요.

하지만 여기서 중요한 trade off가 있어요. 일단 얻는 장점으로는 key도 저장할 수 있기 때문에 schemaless가 가능해져요. 보여주신 예시는 딱히 변동여지가 없지만 필수가 아닌 key들이 존재할 수도 있고 여러 자식문서들이 배열로 내장될 수도 있겠죠? 그 자식들 안에 또 내장된 자식이 있을 수도 있구요. 그리고 각 내장된 문서마다 필수가 아닌 key들도 존재하겠죠. 

schemaless가 가능하기 때문에 몽고디비의 핵심 중 하나인 자식문서 내장이 가능해지죠. 그리고 디스크 한 공간에 같이 저장이 되기 때문에 한번의 I/O작업으로 하드디스크에서 불러올 수 있는 이점도 있죠.

잃는건 말씀하신 저장공간 효율인데요. 요즘 시대에 이건 상대적으로 문제가 되지 않아요. 디스크가 매우매우 저렴하기 때문이죠. 데이터베이스 성능에 정말 중요한 CPU, Memory에 비하면 디스크 비용은 무시할 수 있을 정도로 미미하다고 볼 수 있어요. 디스크가 만약 비싼 부품이었다면 이런 데이터베이스는 대중화되기 어려웠을거에요. 따라서 저장공간 효율이 떨어지는건 맞으나 신경쓸 필요가 없다입니다!

이건 질문의 영역을 벗어난거 같지만 테이터가 수백 수천 기가바이트 이상 너무나도 많이 쌓여서 부담이 되는 상황을 생각해볼게요. 이 경우 데이터가 오래 되서 서비스에서 사용될일이 없는게 확실하다(히스토리, 데이터 변경 내역, 탈퇴한 회원의 관계된 정보들 등) 근데 자리만 차지한다. 그런 데이터들은 훨씬 저렴한 Data Warehouse, Data Lake 같은 곳으로 옮겨두면 되요. 서비스에서는 사용할 일은 없을 수 있겠지만 모든 데이터는 기계학습에 있어 매우 매우 중요한 데이터이기 때문에 일종에 백업을 해두는거죠.

그리고 관계형 데이터베이스는 그러면 왜 이렇게 저장 공간(정규화)에 집차하느냐고 할 수 있는데요. 이유는 다양하겠지만 중요한 이유 중 하나로 수평 확장이 가능은 하지만 쉽지 않기 때문이라고 봐요. 그에 반면 몽고디비는 수평적 확장을 초기 설계 때부터 고려해서 만들어진 데이터베이스에요. 수평 확장이 가능하다는건 내가 원하는만큼 서버를 증설해서 사양을 올릴 수 있다는거에요. 이건 강의 후반부에 설명드리니 참고하시면 될 것 같아요!

ygh님의 프로필

ygh

질문자

2021.04.14

궁금증이 해결됐습니다. 정말 감사드립니다 :)