관계형 DB는 수직확장(Scale Up)에 유리하고 NoSQL은 수평 확장(Scale Out)에 유리하다고 한다.
이를 추상적으로만 알고 있었기에 시각적으로 표현해 확실히 하고자 기록해두려고 한다.
Scale Up과 Scale Out
Scale Up은 간단하게 이야기해 기존의 서버를 이전보다 높은 사양으로 업그레이드하는 것을 말한다. 이는 하드웨어 적으로 보면 용량을 늘리기 위한 목적으로 디스크를 늘리거나 혹은 성능을 높이기 위한 목적으로 CPU 또는 메모리를 업그레이 하는 등의 예시를 들 수 있다.
Scale Out은 서버를 추가하는 방식을 말한다. 기존 서버의 용량 혹은 성능이 한계를 도달했을 때, 성능이 비슷한 혹은 낮은 성능을 가진 서버를 추가로 연결하는 방식이다. 이는 데이터의 저장 용량을 늘릴 수 있을 뿐만 아니라 기존 서버에서 감당하기 힘든 부하를 분담해 줄이는 효과도 볼 수 있다.
관계형 DB (SQL)의 수평 확장
위와 같은 테이블이 있다. 서버를 1개 추가해 2개의 서버로 수평 확장한다고 예를 들자.
이렇게
A서버 : 1, 2
B서버 : 3, 4, 5
로 나눌 수 있고 CRUD 작업에 대해 큰 문제는 없을 것이다.
그럼 다시 아래와 같이 관계를 가진 테이블들이 존재한다고 가정해보자.
그 후 1개의 서버를 더 추가해 수평 확장을 진행한다면 아래와 같이 나누기가 가능하다.
A 서버 : 게시글(1, 2), 댓글(1)
B 서버 : 게시글(3, 4), 댓글(2, 3)
C 서버 : 게시글(5), 댓글(4, 5)
이렇게 된다면 저장된 데이터를 나누는 기준부터 조회 또는 수정 및 삭제 등을 수행할 때 매우 복잡해진다.
예를 들어 게시글 1에 댓글 3, 4가 작성되어 있다면 모든 서버의 DB를 확인해야 된다.
이렇게 간단한 예를 통해 관계를 가진 테이블이 많아질수록 관계형 DB는 수평 확장에 대한 관리 및 이용이 복잡해진다. 그렇다고 중복해서 게시글과 댓글을 엮어 저장하게 된다면 일관성 등과 같은 관계형 DB의 Join을 사용하기 여려울 뿐만 아니라 원칙을 위배할 수 있다.
NoSQL의 수평 확장
NoSQL은 위와 같은 컬렉션이 존재한다고 하자. 만약 수평 확장을 통해 2개의 서버를 추가한다면 아래와 같이 가능하다.
A 서버 : 1
B 서버 : 2
C 서버 3
이렇게 관계와 상관없이 컬렉션마다 적당히 나눠 저장이 가능하다. 이는 각 서버 상황에 맞게 분배된다면 조회 또는 추가, 삭제 등과 같은 작업에도 큰 영향이 없을 것이다.
정말 간단한 예시를 가지고 적어보았다. 실제 사용에 있어 당연히 많은 경우와 예외상황이 있을 것이지만 위의 예시들을 보면 수평 확장이 관계형 DB에서 왜 어려운 것이며 NoSQL에서는 적당한 것인지 확인이 가능하다.
이렇게 보면 각 DB 형태마다의 특성도 확실히 구별할 수 있는데, 관계형 DB는 관계에 초점을 크게 두고 있는 반면 NoSQL은 도큐먼트 혹은 컬렉션으로 정의된 개체에 대해 더욱 집중된다는 것을 느낄 수 있었다.
이러한 NoSQL의 특성은 목적 데이터가 확실하다면 모든 데이터를 빠르게 가져온다는 장점이 있다는 것을 알 수 있을 것 같다.
'Backend > DataBase' 카테고리의 다른 글
[TypeORM] TypeORM 0.3.x (0) | 2022.09.14 |
---|---|
[MongoDB] MongoDB Atlas Trigger (Scheduled Trigger) (0) | 2022.07.10 |