NoSQL, RDBMS
NoSQL 과 RDBMS 에 대해 알아보자.
공부하기에 앞서 RDBMS 가 일관성을 보장하며 데이터를 저장하기 위해 오랬동안 채택되어 왔던 방식이고, NoSQL 은 이런 배경에서 저장, 처리해야 할 데이터가 많아짐에 따라 일관성을 약간 희생하는 대신 대용량의 데이터를 분산 처리하기 위해 등장한 저장 방식이라는 맥락을 생각해 보고 들어가면 좋을 것 같다.
RDBMS, NoSQL
NoSQL 은 무엇이고 RDBMS 는 무엇일까?
DBMS 는 DataBase Management System 의 약자로, 사용자가 데이터베이스에 접근하고 다룰 수 있게 도와주며 데이터베이스를 관리해 주는 소프트웨어를 말한다.
RDBMS 는 R(Relational) 이 붙은 것으로, 관계형 데이터베이스(RDB) 를 관리해주는 DBMS 이다.
RDBMS 는 명확한 스키마를 가진 데이터 모델을 테이블 형태의 구조로 저장하는 데이터베이스로, 표준화된 질의 언어(SQL) 로 데이터베이스를 관리한다. 스키마가 명확하고 중복을 허용하지 않으며 제약 조건, 정규화 등으로 데이터 무결성을 보장한다. 또한 외래 키를 통해 테이블 간 관계를 나타낼 수 있는데, 이러한 테이블 사이의 관계에서 외래 키를 사용해 Join 을 할 수 있다는 것이 RDMBS 의 가장 큰 특징이다.
NoSQL 은 Not Only SQL 의 약자로, 데이터를 저장하기 위해 미리 정의된 스키마가 필요하지 않으며 테이블이 아닌 다른 형태로 데이터를 저장하는 저장 기술이다. 따라서 유연한 데이터 모델링이 가능하며, 데이터를 저장하는 방식에는 key-value(Redis), key-document(MongoDB) 방식을 포함해 다양한 방법이 있다.
간단하게 두 데이터베이스의 차이는 RDBMS 는 테이블 형태로 데이터를 저장하는 방식, NoSQL 은 정의된 스키마가 필요 없고 테이블 형태가 아닌 key 와 value(document 외 다양한 방식) 로 데이터를 저장하는 방식이라고 볼 수 있다. 이 차이로부터 각 DBMS 가 어떤 특징과 장단점을 가지고 있는지 더 알아보자.
RDBMS vs NoSQL
먼저 RDBMS 는 다음과 같은 특징을 가지고 있다고 정리할 수 있다.
- 표준화된 데이터와 쿼리
- 정규화된 데이터와 제약조건으로부터 데이터 무결성을 보장하며, 표준화 되어있고 정교한 SQL 쿼리를 사용한다. 데이터 중복을 허용하지 않는다. - 트랜잭션
- ACID 속성을 가진 안정적인 트랜잭션을 통해 작업의 완전성을 보장한다. - 그렇다면 NoSQL은? 트랜잭션이 아닌 다른 형태의 작업인가?
→ NoSQL 은 트랜잭션을 사용하지 않는다. NoSQL은 ACID 를 일정 부분 포기하는 대신 성능 이점(수평 확장성)을 얻기 위해 등장한 데이터베이스 모델이다. 이는 CAP 이론(요약: 분산 시스템에서는 데이터 일관성 희생이 불가피하다)과 연관이 있다. - 수직적 확장성
- RDBMS 는 데이터베이스 부하 분산을 위해 수평적 확장(Scale-out) 이 불가능 하고 수직정 확장(Scale-up) 만 가능하다고 한다. - 그러나 정말인지는 모르겠다. RDBMS 는 널리 쓰이는데 분산 부하를 위해 Scale-up 만 가능하다?
→ RDBMS 에서 수평 확장을 위해 Sharding 이라는 것을 사용한다. 그러나 관계가 복잡하고 데이터가 많아질수록 수평 확장에 대한 관리가 어려워지기 때문에 대규모 데이터를 다루는 시스템에서는 수평 확장에 용이한 NoSQL 을 채택한다고 한다.
NoSQL 은 다음과 같은 특징을 가지고 있다.
- 유연한 데이터
- 자유로운 데이터 구조로부터 다양한 형태의 데이터를 저장할 수 있고, 변경도 자유롭다. 그러나 스키마가 없기 때문에 명확한 데이터 구조를 보장하지 않으며, 데이터 중복에 대한 제약이 없기 때문에 중복된 데이터가 발생할 여지가 있고 데이터가 중복될 경우 모든 컬렉션에서 수정을 해야 한다.
또한 표준화된 질의 언어가 없기 때문에 경우에 따라 쿼리 및 인덱싱이 복잡해질 수 있다. - 성능
성능이 좋다는 정리를 많이 봤지만 이것이 scale-out 을 통해 대규모 데이터 처리가 용이한 것에 대한 성능인지, key-??? 형태의 자료구조로부터 오는 성능 이점인지 더 공부해 볼 필요가 있다.
→ 두가지 모두 정답이다. MySQL과 MongoDB 를 가지고 실험해 본 결과에서 읽기 성능은 MongoDB 가 3배 정도 빠르게, 쓰기 성능은 비슷하게 나왔다. key-value 형태의 NoSQL 데이터베이스인 BerkeleyDB 는 읽기, 쓰기 성능 모두 MySQL 보다 월등하게 나왔다. 이로부터 key 를 통해 value 또는 document 에 엑세스하는 패턴이 전반적으로 빠른 처리속도를 지원한다고 생각해 볼 수 있다.
(출처 :https://velog.io/@park2348190/%EB%85%BC%EB%AC%B8%EB%B2%88%EC%97%AD-SQL-vs-NoSQL-A-Performance-Comparison)
그러나 특정 시나리오에서는 RDBMS 가 NoSQL 보다 처리가 빠른 경우가 있다고 하기에 NoSQL 이 RDBMS 보다 처리성능이 좋다고만 단언할 수는 없다. 또한 대표격인 MySQL 은 MultiThread 를 지원하고, MongoDB는 SingleThread 를 지원하기 때문에 이 차이를 감안하여 사용하지 않으면 성능에서 손해를 볼 수도 있다는 것을 고려해야 한다.
- MongoDB가 single thread 이자 non-blocking 방식으로 동작하기 때문에 blocking 방식인 MySQL 보다 빠르다는 견해도 있다. 이 차이는 다시 공부해 보자.
https://blog.naver.com/joebak/220337489706
https://blog.tinned-software.net/is-mongodb-always-faster-then-mysql/
※ NoSQL 자체가 대규모 데이터의 분산 처리를 목적으로 등장하였기 때문에 NoSQL 의 성능 이점을 말할 때는 일반적으로 '데이터베이스 분산으로 인한 처리 성능 향상'에 무게가 실린다.
- 수평적 확장성
- 수직적 확장에 더해 수평적 확장(Scale-out) 에 용이하기 때문에 데이터베이스 확장에 대한 비용을 크게 절감할 수 있다.
- 어떤 이유로 샤딩에 비해 수평 확장에 용이한 구조인가? 에 대한 답은 NoSQL 에 대해 깊이있는 이해가 필요한 부분인 것 같아 여기서는 다루지 않는다.
결론
RDMBS 는 ~~~ 에, NoSQL 은 ~~~ 상황에 적용하는 것이 좋다.
NoSQL 을 사용해 본 적이 없기 때문에 RDBMS 에서 데이터간의 관계를 맺는 것을 NoSQL 에서 어떻게 적용하는지, RDBMS 를 사용하여 설계된 데이터 관계가 복잡한 서비스의 경우 NoSQL로 바꾸면 어떤 것을을 어떻게 바꿔야 할 지 같은 것들을 깊게 알아보지 못해 아쉬움이 남는다. 그러나 이 부분은 나중에 NoSQL을 사용하게 될 때 공부할 내용이라 생각해 넘어가기로 했다.