CS/데이터베이스

SQL vs NoSQL

바디스 2022. 7. 21. 09:00
MySQL과 같은 SQL을 사용할까? 아니면 MongoDB와 같은 NoSQL을 사용할까?

 

SQL (관계형 데이터베이스)

 

SQL은 '구조화된 쿼리 언어(Structured Query Language)'의 약자로 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 삭제 및 검색할 수 있습니다. 이러한 관계형 데이터베이스는 두가지 주요 특징이 있습니다.

 

  • 데이터는 정해진(엄격한) 데이터 스키마를 따라 데이터베이스 테이블에 저장됩니다.
  • 관계를 통해 연결된 여러 개의 테이블에 데이터가 분산됩니다.

 

엄격한 스키마

 

데이터는 테이블(table)에 Records(Rows)로 저장되며, 각 테이블에는 명확하게 정의된 구조(structure)가 있습니다. 그리고 구조(structure)는 컬럼의 이름과 데이터 유형으로 정의됩니다. 관계형 데이터베이스에서 스키마를 준수하지 않는 Records(Rows)는 추가할 수 없습니다.

 

 

관계

 

SQL 기반의 데이터베이스의 또 다른 중요한 부분은 관계입니다. 데이터들을 여러 개의 테이블에 나눠서 데이터들의 중복을 피할 수 있습니다. 테이블을 나눠서 데이터를 저장하면, 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없다는 특징이 있습니다. 

 

 

RDBMS의 한계

  • 대용량의 데이터가 계속 들어온다면, 스키마에 맞춰 변경해서 넣기 위해 긴 시간의 down time이 발생

 

NoSQL 비 관계형 데이터베이스

기존 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 DB로 고정된 스카마관계가 없습니다.

 

  • 거대한 Map으로서 key-value 형식을 지원
  • RDBMS는 Foreign Key, Join 등으로 관계를 정의하지만, NoSQL은 관계를 정의하지않음
  • 대용량 데이터를 저장할 수 있음
  • 읽기/쓰기의 성능이 RDBMS보다 빠름

 

 

NoSQL 데이터베이스의 종류는 키-값 데이터베이스, 도큐먼트 데이터베이스, 그래프 데이터베이스 등으로 나뉩니다. 키-값 데이터 베이스는 키와 값으로 구성된 배열구조의 데이터베이스로 NoSQL 데이터베이스 중 가장 단순한 구조입니다. 도큐먼트 데이터베이스는 필드와 값의 형태로 구성된 데이터를 JSON 포맷으로 관리하는 데이터베이스로 NoSQL 데이터베이스 중 가장 인기가 높습니다. 그래프 데이터베이스는 노드와 관계로 구성된 데이터베이스로 근접한 객체를 모델링할 목적으로 설계되었습니다. 

더보기

NoSQL 데이터 모델분류

 

1) Key/Value Database : Redis, Oracle Coherence

  • 단순한 저장구조를 가지며, 복잡한 조회 연산을 지원하지 않음
  • 고속 읽기와 쓰기에 최적화된 경우가 많음
  • 메모리를 저장소로 쓰는 경우, 아주 빠른 get과 put을 지원
  • Value는 문자열이나 정수와 같은 원시 타입이 들어갈 수 있고, 또 다른 key/value가 들어갈 수도 있음. ( Column Family )

2) Big Table Database (Ordered Key/Value) : Hbase, Cassandra

  • key/value store와 데이터 저장 방식은 동일
  • 보통의 NoSQL은 order by같은 정렬기능을 제공하지 않지만, 이 모델은 내부적으로 key를 정렬
  • 날짜나 선착순으로 정렬해서 보여줄 때 유용

3) Document Database : MongoDB, CouchDB, Riak

  • key/value store의 확장된 형태로, value에 Document라는 타입을 저장 (Document : XML, JSON, YAML 등)
  • 복잡한 데이터 구조 표현 가능
  • Document id 또는 속성값 기준으로 인덱스를 생성
  • key값의 range에 대한 효율적인 연산이 가능해지므로 이에 대한 쿼리를 제공
  • Sorting, Join, Grouping등이 가능
  • 쿼리 처리에 있어서 데이터를 파싱해서 연산해야 하므로 overhead가 key-value 모델보다 큼
  • B트리 인덱스를 사용하여 2차 인덱스를 생성 > B트리는 크기가 커질 수록 insert, delete의 성능이 떨어짐 (읽기/쓰기 비율이 7:3일 때 더 좋은 성능을 보임)
  • B트리 특성 때문에 자주 변하지 않는 정보를 저장하고 조회하는데 적합 (로그, 타임라인, 채팅로그 등)

4) Graph Database : Sones, AllegroGraph, neo4j

  • node들과 relationship들로 구성된 개념
  • key/value store방식이며 모든 노드는 끊기지 않고 연결되어 있어야함
  • relationship은 direction, type, start node, end node에 대한 속성등을 가짐

 

NoSQL 특징

 

  • 유연성 : 스키머 선언 없이 필드의 추가 및 삭제가 자유로운 Schema-less 구조입니다.
  • 확장성 : 스케일 아웃에 의한 서버 확장이 용이합니다.
  • 고성능 : 대용량 데이터를 처리하는 성능이 뛰어납니다.
  • 가용성 : 여러 대의 백업 서버 구성이 가능하여 장애 발생 시에도 무중단 서비스가 가능합니다.

 

SQL NoSQL 비교

  SQL NoSQL
스키마 명확하게 정의된 스키마, 데이터 무결성 보장 스키마 없음, 언제든 데이터를 조정하고 필드 변경 가능
유연성 데이터 스키마가 샂너에 계획되야함 데이터 구조 나중에 미루게 될 수 있음
중복 관계에 따라 데이터 중복없이 한번만 저장 관계가 없어 데이터가 중복으로 저장되고 수정을 해야 하는 경우 모든 컬렉션에서 수행해야함
확장 수평적 확장이 어렵고 수직적 확장만 가능 수직 및 수평 확장이 가능

 

SQL을 사용하기 좋은 경우

  • 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우 (NoSQL에서라면 여러 컬렉션을 모두 수정해줘야만 합니다.)
  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
  • 전자 상거래, 금융서비스에 주로 사용

 

NoSQL을 사용하기 좋은 경우

  • 정확한 데이터 구조를 알 수 없거나 변경 / 확장 될 수 있는 경우
  • 읽기(read)처리를 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 (즉, 한번의 변경으로 수십 개의 문서를 업데이트 할 필요가 없는 경우)
  • 데이터베이스를 수평으로 확장해야 하는 경우 ( 즉, 막대한 양의 데이터를 다뤄야 하는 경우)
  • 페이스북이나 트위터 같은 소셜 네트워크 서비스에서 게시글을 저장하는데 사용

 

SQL과 NoSQL 용어 비교

SQL MongoDB
테이블 컬렉션
문서
컬럼 필드
기본키 ObjectId
인덱스 인덱스
보기 보기
중첩된 테이블 또는 객체 포함 문서
배열 배열