SQL vs NoSQL

Minsu Kang·2020년 12월 23일
0

데이터베이스

목록 보기
1/4

SQL

SQL은 관계형 데이터베이스(RDBMS)를 관리하기 위해 설계된 프로그래밍 언어이다. 이 글은 SQL과 NOSQL을 비교하는 글로, 이 글에서 이야기 하는 SQL은 RDBMS라고 생각하면 된다.

NoSQL

단어 뜻 그 자체를 따지자면 "Not only SQL"로, SQL만을 사용하지 않는 데이터베이스 관리 시스템(DBMS)을 지칭하는 단어이다. 관계형 데이터베이스보다 덜 제한적인 모델을 이용해 데이터의 저장 및 검색 메커니즘을 제공한다.

관계

SQL에서는 데이터 간의 관계를 foreign key 등으로 정의하고 이를 이용해 join 등의 관계형 연산을 한다.

NoSQL은 관계형 데이터베이스와 반대되는 방식을 사용하여 데이터간의 관계를 정의하지 않는다. 관계를 정의 하지 않기 때문에 join이 존재 하지 않는다. join을 하고 싶다면 수동으로 직접 외래키를 검색하여 사용할 수 있겠지만, 일반적이지 않고 성능도 좋지 않다.

스키마 유연성

스키마란, 데이터가 DB에 어떤 구조로, 어떤 제약조건으로 저장 되어야 하는지 정의한 것이다.

강한 스키마

SQL에서는 엄격한 스키마를 원칙으로 하기 때문에 스키마에 맞지 않는 형식의 데이터는 저장할 수 없다.

예를 들어, 위의 테이블에서 한 명의 고객만 email을 추가하는 등의 스키마를 따르지 않는 행위를 할 수 없다. (스키마를 뜯어 고치지 않는 한)

자유로운 스키마

반면, NoSQL에서는 스키마 구조를 유연하게 변경할 수 있다. ID 필드는 공통이지만, 데이터를 저장하는 컬럼은 각기 다른 이름과 다른 데이터 타입을 가질 수 있다.

철학

ACID

데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질. 관계형 데이터베이스는 이 철학을 따른다.

  • Atomicity(원자성): 트랜잭션은 모두 적용되거나 모두 적용되지 않아야 한다.

  • Consistency(일관성): 트랜잭션이 완료되었을 때 데이터베이스는 구조적으로 문제가 없이 일관적인 상태를 유지해야 한다.

  • Isolation(고립성): 트랜잭션이 다른 트랜잭션과 충돌해서는 안된다.

  • Durability(지속성): 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.

BASE

ACID와 대조적으로 가용성와 성능을 중시하는 특성을 가진 분산 시스템의 특성. NOSQL은 이 철학을 따른다.

  • Basic Availability(기본적인 가용성): 데이터베이스는 대부분의 시간동안 동작하는 것처럼 보인다. 즉, 분산 DB에서 몇 개의 다른 DB는 문제가 있다고 하더라도, 살아있는 것이 있으므로 사용자에게는 계속 가용한 것으로 보인다는 것

  • Soft-state: 저장소(store)는 작성 일관성(write-consistent)일 필요 없으며, 또한, 서로 다른 복제본들(replica) 또한 상호간에 항상 일관적일 필요가 없다. 즉, 각 노드의 값들이 어느 정도 비일관적으로 유지될 수 있다. 현재 노드가 반드시 최신으로 유지되지 않을 수도있고, 썻다고 바로 모든 노드에 적용되는 것은 아니다. 이는 다시 eventual consistency와 동일한 개념으로 받아들여질 수 있다.

  • Eventual consistency: 일시적으로 비일관적인 상태가 되어도 최종적으로는 일관성이 있는 상태가 된다. 분산 DB가 기본적으로 가지는, 통신에 따른 지연 시간으로 발생하는 비일관적인 상태를 가질 수 있지만, 결과적으로는 일관적이어야 한다는 이야기.

정리하면 ‘최종적으로는 정확하고, 일관적이지만, 분산된 노드별로 좀 일관적이지 않은 애들도 있고 서로 다른 애들도 있다. 어쨌거나, 결론적으로는, 약간의 부정확성을 통해서 빠르게 대응할 수 있도록 하는 것을 위한 DB’라고 생각하면 된다.

BASE라는 약어가 다소 억지같아 보일 수도 있는데, BASE라는 단어는 의미의 전달 보다는 산(Acid)과 염기(Base)와 같아 보이려는 노력에 의해서 탄생했다고 한다(?)

참고: https://frhyme.github.io/others/DB_ACID_vs_BASE/

확장성 (Scalability)

수직적 확장성

수직 확장은 하드웨어 용량 (예 : CPU, RAM)을 늘려 서버의 처리 능력을 향상시키는 프로세스이다. 이것은 그럴듯한 옵션 일 수 있지만 하드웨어 개선에 대한 임계 값이 있고 비용이 비싸다.

수평적 확장성

수평적 확장은 서버 수를 늘려 확장 성을 달성한다. 이론적으로는 원하는만큼 서버를 병렬로 확장 할 수 있다. 서버가 분산됨에 따라 더 많은 데이터를 저장할 수 있다는 이점이 있다.

SQL 데이터베이스는 확장성을 염두에 두고 설계되지 않았다. 따라서 SQL 데이터베이스의 단일 인스턴스는 ACID 속성을 지키며 일관성을 유지하지만
SQL 데이터베이스를 사용하여 분산 시스템을 구현한다면 이러한 일관성을 유지하기가 매우 어렵다.

반면, NoSQL은 분산형 컴퓨팅을 염두에 두고 설계되었다. 따라서 데이터의 일관성을 다소 포기하더라도 수평적 확장이 매우 용이하다는 장점을 가진다.

언제 사용해야할까

위에서 언급한 내용들을 생각해 봤을 때, SQL은 데이터의 신뢰성과 일관성이 중요하고 정형화된 데이터를 다루는 금융, 쇼핑몰 등과 같은 서비스에 잘 어울린다.

NoSQL은 확장 가능성이 높은 서비스 또는 덜 중요하고 비정형화된 데이터를 다룰 때 사용하면 유용할 것이다.

profile
백엔드 개발자

0개의 댓글