SQL vs NoSQL
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 |
인덱스 | 인덱스 |
보기 | 보기 |
중첩된 테이블 또는 객체 | 포함 문서 |
배열 | 배열 |