작성
·
549
1
항상 좋은 강의 해주셔셔 감사합니다.
이번 강의에서 배운 populate가 일반적인 관계형DB에서 JOIN해서 가져오는 것과 비슷한 부분인 것 같아서요. 근데 관계형에서 join은 연산이 많이 필요하다고 알고있는데 populate가 그럼 join보다 훨씬 빠른 속도를 제공하는건가요?
두번째 질문은 populate는 몽구스의 기능이지 몽고db의 기능은 아닌것인가요?
답변 2
1
시훈님 저도 여기에 대한 질문이 있습니다.
몽고디비는 이러한 데이터 취합/가공 접근방식이 달라요. 애초에 JOIN과 같은 populate기능 사용을 최소화합니다. 대신에 관계된(JOIN, GROUP BY 등 이런 가공이 완려된) 데이터를 통째로 하나의 문서에 저장하는거죠. 이렇게 하면 JOIN/populate를 아예 사용할 필요가 없어지고 따라서 제일 빨라집니다. 단순히 데이터를 읽어서 백엔드 넘기기만 하면되니깐요. populate를 사용하더라도 10번 populate해야할걸 1~3번만 해도 되죠.
라고 답변을 해주셨는데... 현재 강의에서 예제가 관계형데이터처럼 구조가 되어있는것같아 혼동이됩니다.
답변해주신 내용에 따르면, blog와 comment를 통째로 저장하는게 맞는것같은데, 제 인식이 다르다면 지적을 부탁드리겠습니다
0
우동이님 안녕하세요 :)
말씀하신대로 JOIN은 상당히 무거운 연산이에요. Populate도 마찬가지에요. 오히려 더 느립니다.
JOIN, populate가 모두 무거울 수 밖에 없는 이유는 관계된 데이터를 "탐색"해야되서에요. populate가 JOIN보다 느린 이유는 populate가 말씀하신대로 몽고디비가 아닌 몽구스 기능이기 때문이에요. 이게 무슨 의미냐면 관계된 populate가 백엔드(Node.js)에서 이루어진다는거에요. JOIN은 데이터베이스에서 이루어지고요.
populate의 경우 이러면 데이터가 네트워크상으로 통신이 되어야 하기 때문에 아무래도 더 느려집니다.
이렇게만 보면 몽고디비를 쓸 이유가 없어요. populate를 난발하는건 몽고디비를 관계형 데이터베이스처럼 사용하는거에요. 아시다시피 JOIN도 결국에는 느려집니다. 아무리 데이터베이스 서버 성능을 올리고 모든걸 최대한 효과적으로 연산하고 쿼리를 최적화시켜도 데이터가 많아지고 관계가 복잡해지면(더 많은 JOIN, GROUP BY 등등) 한계는 와요.
몽고디비는 이러한 데이터 취합/가공 접근방식이 달라요. 애초에 JOIN과 같은 populate기능 사용을 최소화합니다. 대신에 관계된(JOIN, GROUP BY 등 이런 가공이 완려된) 데이터를 통째로 하나의 문서에 저장하는거죠. 이렇게 하면 JOIN/populate를 아예 사용할 필요가 없어지고 따라서 제일 빨라집니다. 단순히 데이터를 읽어서 백엔드 넘기기만 하면되니깐요. populate를 사용하더라도 10번 populate해야할걸 1~3번만 해도 되죠.
즉, populate 자체는 JOIN보다 느리지만 데이터를 내장함으로써 그 어떤 관계형 데이터베이스보다 빨라질 수 있는겁니다(데이터가 많고 관계도가 복잡해도요).
정말 중요한 내용을 짧게 설명해봤는데요. 앞으로 강의에서 자세하게 다룰 내용들이에요.
커리큘럼 고민을 정말 많이 했는데요. 커리큘럼을 보시면 알겠지만 시작은 대부분이 익숙한 방식인 관계형 방식으로 데이터 구조를 짜게 됩니다. 그리고 점진적으로 데이터 구조를 수정하면서 최종적으로 몽고디비 방식에 적합한 방식으로 바꿔나가고 있어요. 이렇게 하는 이유는 처음부터 몽고디비 방식만 보여주면 왜 이 방법이 더 좋은지 공감하기 어렵다고 판단이 되서에요. 성능 비교도 중간중간에 계속합니다! 또 한가지 이유는 몽고디비 핵심 중 하나라고 할 수 있는데요. 몽고디비는 상황에 따라서 데이터 구조를 다르게 가져갈 수 있어요. 그래서 관계형디비처럼 데이터를 정규화해서 저장하는 경우도 있을 수 있어요. 언제 어떤 구조를 가져가는게 좋은지도 강의 마지막 부분에 다루게 됩니다! 관계형과의 비교도 계속 하게 되고요. 꼭 마지막까지 봐주시길 바랍니다 :)