RDB
Relation Database의 약자이다. 테이블 마다 스키마(DB내에 어떤 구조로 데이터가 저장되는가를 나타내는 데이터베이스 구조)를 정의해야 한다. 데이터 타입과 제약(Constraint)를 통해서 데이터의 정확성을 보장한다. 하나의 테이블에서 중복없이 하나의 데이터만을 관리하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없다. SQL 질의문을 통해 요청을 처리한다.
NoSQL
key-value방식으로 데이터를 관리하고, SQL 질의문을 사용하지 않는다. 스키마와 관계도 없다. 자주 변경되지 않는 데이터 일때 더 큰 장점을 발휘한다. 필요한 모든 데이터가 이미 하나의 컬렉션안에 저장되어 있기 때문에 조인을 사용할 필요가 없다. 하지만, 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정(update)를 해야 하는 경우 모든 컬렉션에서 수행해야 한다.
RDB보다 NoSQL이 속도가 빠른 이유
RDB는 배열을 통해 데이터를 저장하고 NoSQL은 HashMap 구조를 통해 데이터를 저장한다. 배열은 데이터 형식을 미리 지정해야하고 자료를 찾기 위해서는 모든 데이터를 가져와서 그 안에서 검색해야한다. 반면, HashMap은 key-value 구조로 되어 있는데 자료의 크기를 지정해 놓지 않아도 자유로운 추가가 가능하고 모든 데이터를 가져오지 않아도 key값만 알면 빠른 검색이 가능하다.
수직적 수평적 확장성 관점에서의 비교
- 수직적 확장: 단순히 데이터베이스 서버의 성능을 향상시키는 것 (ex) cpu 업그레이드)
- 수평적 확장: 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산되는 것
RDB는 데이터가 저장되는 방식 때문에 수평적 확장이 어렵고, 수직적 확장만 가능하다.
동일한 DB를 쿼리하는 클라이언트는 항상 최신의 데이터를 봐야하는데 수평적 확장을 하게 되면 클라이언트는 A노드가 아닌 B노드에 데이터를 쓸 수 있고 B노드와 다른 노드들이 연결되는 시간이 존재해 변경 사항이 반영되는 시간이 지연될 수 있어 일관성을 보장하기 어렵다. NoSQL은 수직 및 수평 확장이 가능해서 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기 / 쓰기 요청을 처리 할 수 있다.
언제 사용하는 것이 좋을까?
- RDB는 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우 (NoSQL은 여러 컬렉션 모두 수정해야하기 때문에, 수정 시 RDB는 쿼리문 한 번에 끝)와 스키마 구조가 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우에 사용하는 것이 좋다.
- NoSQL은 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우, 읽기(read)처리를 자주하지만, 데이터를 자주 변경(update)하지 않는 경우, 데이터베이스를 수평으로 확장해야 하는 경우에 사용하는 것이 좋다.
*참고 자료 - https://siyoon210.tistory.com/130