[데이터베이스] SQL과 NOSQL 차이점

[데이터베이스] SQL과 NOSQL 차이점

애플리케이션 개발 시, 데이터베이스를 선택할 때 MySQL과 같은 SQL을 사용할지, MongoDB와 같은 NoSQL을 사용할지 고민할 수 있다.

이러한 고민사항은 단순히 Spring이나 Express.js같은 프레임워크에 따라 결정되는 것이 아니다. 프로젝트에 목적에 맞게 적합한 데이터베이스를 선택할 필요가 있다.

SQL

우리가 흔히 사용하는 RDBMS(관계형 데이터 베이스 관리 시스템)에는 MySQL, Oracle, PostgreSQL 등이 있으며 이들은 SQL(Structured Query Language)을 사용하여 데이터베이스에 데이터를 저장, 수정, 삭제 및 검색을 한다.

관계형 데이터 베이스에는 두 가지 핵심적인 특징이 있다.

데이터는 정해진 데이터 스키마 에 따라 테이블에 저장된다.

에 따라 테이블에 저장된다. 데이터는 관계를 통해 여러 테이블에 분산된다. (정규화)

데이터는 테이블에 튜플로써 저장되는데 하나의 튜플의 각 속성들은 명확하게 정의된 구조가 있다. (속성의 이름과 도메인 등)

따라서, 이러한 스키마를 준수하지 않는 데이터는 테이블에 추가할 수 없다.

즉, 스키마를 수정하지 않는 이상은 정해진 구조에 맞는 데이터만 추가할 수 있는 것이 관계형 데이터베이스의 특징 중 하나이다.

또한, 관계형 데이터베이스는 데이터의 중복과 함수 종속으로 인한 이상현상을 방지하기 위해(무결성을 보장하기 위해) 테이블을 적절하게 분리하며(정규화), 분리된 테이블로 부터 필요한 데이터를 얻어오기 위해서 '관계(JOIN)'을 이용한다.

하나의 테이블에서 중복없이 데이터들을 관리하기 때문에 데이터 조작시 이상현상이 발생하지 않고 정확한 데이터를 취할 수 있는 장점이 있다.

NoSQL

NoSQL은 Not Only SQL의 약자로 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미하며, 관계형 데이터 베이스의 한계를 극복하기 위한 데이터 저장소의 새로운 형태로, 스키마와 관계라는 것이 존재하지 않는다.

NoSQL에서는 각 데이터들을 문서라고 부른다. 또한 SQL의 테이블과 비슷하게 NoSQL에서는 컬렉션이라는 개념이 존재한다.

SQL과의 핵심적인 차이는, SQL은 정해진 스키마를 따르지 않으면 데이터 추가가 불가능했지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다. (스키마가 존재하지 않기 때문이다)

'문서'는 JSON과 비슷한 형태이며, 관계형 데이터베이스처럼 여러 테이블에 데이터를 나누에 저장하지 않고, 관련 데이터를 동일한 '컬렉션'에 저장한다.

따라서, 여러 테이블을 통해 조인할 필요없이 이미 특정 컬렉션 내에 필요한 모든 정보가 문서의 형태로 저장되어 있다. 이것은 키-값 쌍의 형태로 저장된다. (NoSQL에는 조인이라는 개념이 존재하지 않는다)

그렇다면 조인을 통해 데이터를 가져와야 하는 경우에는 ?

각 컬렉션에서 데이터를 각각 가져온다음 적절한 처리를 해야한다. (여러번의 IO가 발생할 수 있다)

아니면, 역정규화를 통해 필요한 데이터를 모아 하나의 컬렉션으로 만들고 처리해도 된다. (한번의 IO) 이 경우, 설계를 잘 못하면 데이터의 불필요한 중복에 의해 데이터 이상현상이 발생할 수 있다.

따라서, 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터일 경우 NoSQL을 사용하면 효율적이다.

NoSQL 설명의 첫 문장에서, 관계형 데이터 베이스의 한계를 극복하기 위한 데이터 저장소의 새로운 형태라고 했는데, 이에 대한 설명은 해당 블로그를 참고하였다.

확장 개념

두 데이터베이스를 비교할 때 중요한 '확장 개념'이 존재한다.

데이터베이스 서버의 확장은 '수직적 확장'과 '수평적 확장'으로 나누어진다. (스케일업, 스케일 아웃)

수직적 확장 데이터베이스 서버의 성능을 하드웨어 적으로 향상시키는 것 (예를 들어 CPU 업그레이드)

수평적 확장 더 많은 서버가 추가되며, 데이터베이스 서버가 분산됨을 의미

데이터 저장 방식으로 인해 관계형 데이터베이스는 일반적으로 수직적 확장만 지원한다.

선택

어떤 데이터를 다루냐에 따라서 SQL 또는 NoSQL을 선택해야 한다.

SQL의 경우 명확하게 스키마가 정의되어 있고, 데이터는 불필요한 중복없이 저장되므로 무결성을 보장한다.

하지만, 여러 테이블에 데이터가 분산되어 있으므로, 조인문이 많은 복잡한 쿼리가 만들어 질 수 있고 데이터 스키마를 사전에 계획하고 알려야 한다. (추후 수정이 어려움)

수직적 확장만 가능하다. (데이터 저장 방식으로 인한 수평적 확장의 어려움)

NoSQL의 경우 스키마가 존재하지 않아 유연하다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있다.

데이터는 애플리케이션이 필요로 하는 단순한 형식으로 저장되어 데이터 조회속도가 빠르다.

수직적, 수평적 확장이 가능하다.

하지만, 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정을 해야하는 경우 모든 컬렉션에서 수행해야 한다.

정리하자면,

관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우와 명확한 스키마가 사용자와 데이터에게 중요할 경우에는 SQL의 사용이 적합하며,

정확한 데이터 구조를 알 수 없어, 변경이나 확장될 수 있는 경우와 읽기는 자주 일어나지만 수정,삭제는 자주 없는 경우, 데이터베이스를 수평적으로 확장해야 하는 경우(막대한 양의 데이터를 다뤄야 하는 경우)에는 NoSQL의 사용이 적합하다.

from http://junseokdev.tistory.com/59 by ccl(A) rewrite - 2021-12-06 17:01:47