RDB
- 사전에 정의된 스키마
- RDB는 사전에 스키마를 정의하고 정의된 스키마에 맞춰서 데이터를 저장하기 때문에 명확한 데이터 구조를 보장한다.
- 그러나 이러한 특성으로 인해 확장성이 부족하다. 만약 스키마에 새로운 컬럼을 추가하려고 하는데 이미 테이블에 수많은 데이터가 존재한다면, 칼럼을 추가하는 작업은 부담스러울 수 있다.
- 데이터 중복
- RDB의 기본 철학은 데이터의 중복을 허용하지 않는다. 따라서 데이터 중복을 제거하기 위해 정규화를 진행한다.
- 그러나 이로 인해 통합된 데이터를 읽어오기 위해 여러 테이블을 조인하는 작업이 일어나고 이로 인해 조회 성능이 하락한다.
- 스케일 아웃
- RDB는 스케일 아웃에 유연한 DB가 아니다. 따라서 성능 향상을 위해 스케일 업을 진행하며 이로 인해 비용이 늘어날 수 있다.
- ACID
- RDB는 트랜잭션 ACID를 보장하려고 하다보니 DB 서버의 성능에 어느정도 영향을 미친다. (ex, 처리량이 줄어드는 문제)
NoSQL
2000년대 초중반이 되면서 데이터와 트래픽이 증가함에 따라 높은 수준의 처리량과 빠른 응답 시간 등이 요구되었고, 예상할 수 없는 다양한 형태의 비정형 데이터가 증가했다. 따라서 미리 정의해둔 스키마에 맞춰 데이터를 저장하는데에 한계가 생겼고 RDB의 단점을 극복하기 위해 등장했다.
- 유연한 스키마
- 기존 RDB와 달리 정해진 스키마가 없기 때문에 유연한 구조로 데이터를 저장할 수 있다. 따라서 새로운 필드를 추가하는 등 확장성이 좋다.
- 그러나 기존의 RDB는 스키마 관리를 RDBMS에서 대신 해줬는데, NoSQL은 어플리케이션 레벨에서 개발자들이 어떤 데이터가 들어가는지 스키마 관리를 해주어야 한다.
- 데이터 중복
- RDB에서는 데이터의 중복을 허용하지 않는 것이 RDB의 철학이기 때문에 정규화를 통해 테이블을 쪼개서 중복을 제거했다. 그러나 NoSQL에서는 중복을 허용한다. 따라서 조인을 하지 않아도 되는 장점을 갖는다.
- 대신 단점은 중복된 데이터가 존재할 수 있기 때문에 중복된 데이터 간 데이터 일관성 유지를 위해 어플리케이션 레벨에서 관리해주어야 한다.
- 스케일 아웃
- NoSQL은 RDB에 비해 스케일 아웃에 최적화되어 있다.
- ACID
- ACID의 일부를 포기하고 높은 처리량과 빠른 응답을 추구한다. 따라서 금융 시스템처럼 데이터의 일관성(consistency)가 중요한 환경에서는 NoSQL의 사용이 조심스럽다. (NoSQL별로 그 특징이 다르기 때문에 ACID를 보장하는 NoSQL도 존재한다.)
[RDB가 스케일 아웃이 어려운 이유는? 스케일 아웃에 NoSQL이 적합한 이유는?]
스케일 아웃은 수평 확장으로 여러 디바이스에 데이터를 분산하는 것이다. RDB에서는 수평 확장을 위해 한 개의 디바이스에 저장되어 있던 데이터를 두 개의 디바이스로 나누고 데이터도 나뉘어 저장한다.
그런데 RDB는 관계형 데이터베이스이며 중복 저장을 권장하지 않기 때문에 정규화를 통해 데이터의 중복 저장을 최소화하고 조인을 통해 통합된 데이터를 조회해온다. 따라서 RDB에 스케일 아웃을 적용하면, 분산된 데이터 간에 조인을 해야 하고 분산된 데이터 간 조인을 위해 매번 네트워크를 타야 한다. 따라서 RDB는 스케일 아웃에 유연하지 않다. (그렇지만 RDB가 스케일 아웃이 불가능한 것은 아니다. 많은 서비스들이 RDB를 사용하고 있고, 이 서비스들은 다양한 방법으로 스케일 아웃을 구현하고 있다.)
반면 NoSQL은 중복을 허용한다. 따라서 분산된 데이터 간에 조인을 할 필요가 없기 때문에 스케일 아웃에 더 유연하다.
언제 RDB / NoSQL을 사용해야 할까?
- RDB
- 데이터 구조가 명확하여 변경 가능성이 적을 때 (스키마를 사용하여 명확한 데이터 구조를 갖기 때문)
- NoSQL
- 정확한 데이터 구조를 갖지 않고 데이터 구조가 변경되고 확장될 가능성이 있을 때 (데이터 구조와 상관없이 저장이 가능하기 때문)
- 데이터 수정이 적을 때 (NoSQL은 데이터 중복을 허용하므로, 데이터 수정시 중복된 데이터를 가진 다른 컬렉션들의 데이터도 모두 수정해주어야 하기 때문)
- 데이터베이스를스케일 아웃해야 하는 경우
'CS > Database' 카테고리의 다른 글
SQL 알아보기 (0) | 2024.03.14 |
---|---|
데이터베이스 기본 개념 (0) | 2024.03.06 |
[Real MySQL] 5. 트랜잭션과 락 (2) | 2024.02.27 |
[Real MySQL] 4.아키텍처 - InnoDB 스토리지 엔진 아키텍처 (0) | 2024.02.26 |
[Real MySQL] 4. 아키텍처 - MySQL 엔진 아키텍처 (0) | 2024.02.26 |