SQL은 사전에 정의된 스키마를 모델링하는 관계형 데이터베이스로 행과 테이블과 같은 구조화된 데이터를 관리할 수 있도록 하는 기존 접근 방식의 프로그래밍 언어이다.
반면 ‘Not Only SQL’의 약자인 NoSQL은 보다 유연한 비관계형 접근 방식을 제공하여 구조화되지 않은 데이터 또는 동적 데이터를 처리하는데 이상적이다. 프로젝트에 사용 되는 데이터가 점점 다양해지고 시작할 때 프로젝트에 맞는 데이터베이스를 결정하는 것이 중요함에 따라 SQL과 NoSQL의 핵심적인 차이점을 이해하는 것이 중요하다.
SQL 이란?
관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어다. 사용자가 관계형 데이터베이스에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있다. 또한 SQL을 사용하면 트랜잭션과 저장 함수 또는 뷰와 같은 내장 프로시저를 사용하여 복잡한 로직을 적용할 수 있다.
장점
- 명확하게 정의된 스키마, 데이터 무결성 보장
- 관계는 각 데이터를 중복없이 한번만 저장
단점
- 낮은 유연성, 데이터 스키마를 사전에 계획하고 정의함으로 나중에 수정이 힘듬
- 관계를 맺고 있어 복잡한 쿼리가 만들어질 수 있음
- 대체로 수직적 확장만 가능
NoSQL 이란?
SQL을 제외한 나머지 유형이 전부 NoSQL이다. Key-Value 타입, Document 데이터베이스, Wide-Column Store 데이터베이스와 같은 비관계형 데이터 구조를 사용하여 데이터를 저장하고 검색하는 데이터베이스의 한 유형이다. NoSQL은 기존의 관계형 데이터베이스보다 유연하게 설계되어 사용량이나 부하 변화에 따라 쉽게 확장 또틑 축소할 수 있다.
장점
- 스키마가 없어서 유연함, 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
- 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐
- 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능
단점
- 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
- 데이터 중복을 계속 업데이트 해야 함
- 데이터가 여러 컬렉션에 중복되어 있기 대문에 수정 시 모든 컬렉션에서 수행해야 함
(SQL은 중복 데이터가 없으므로 한번만 수행)
NoSQL 데이터베이스 유형
Key-Value 타입
- 속성을 Key-Value의 쌍으로 나타내는 데이터를 배열 형태로 저장
- Key는 속성 이름을 뜻하고, Value는 속성에 연결된 데이터 값을 의미
- 대표적인 Key-Value 형식에 데이터베이스는 Redis, Amazon DynamoDB 등이 있음
Document 데이터베이스
- 데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스를 의미
- 많은 Document 데이터베이스에서 JSON과 유사한 형식의 데이터를 문서화하여 저장
- 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라는 그룹으로 묶어 관리
- 대표적인 Document 데이터베이스는 MongoDB 등이 있음
Wide-Column Store 데이터베이스
- 데이터베이스의 열(column)에 대한 데이터를 집중적으로 관리하는 데이터베이스
- 각 열에는 Key-Value 형식으로 데이터가 저장되고, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터를 처리할 수 있음
- 하나의 행에 많은 열을 포함할 수 있어서 유연성이 높음
- 데이터 처리에 필요한 열을 유연하게 선택할 수 있다는 점에서 규모가 큰 데이터 분석에 주로 사용되는 데이터베이스 형식
- 대표적인 Wide-Column Store 데이터베이스는 Apache Cassandra, Apache HBase 등이 있음
그래프(Graph) 데이터베이스
- 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스
- 노드(nodes)에 속성별(entities)로 데이터를 저장
- 각 노드간 관계는 선(edge)으로 표현
- 대표적인 그래프 데이터베이스는 Neo4J, InfiniteGraph 등이 있음
데이터베이스 확장
데이터베이스 서버의 확장성은 '수직적'확장과 '수평적'확장으로 나누어진다.
- 수직적 확장: 단순히 데이터베이스 서버의 성능을 향상시키는것 (ex. CPU 업그레이드)
- 수평적 확장: 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미 (하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동)
SQL은 일반적으로 수직적 확장으로 데이터베이스가 구축된 하드웨어의 성능을 많이 이용하기 때문에 비용이 많이 든다. 여러 서버에 걸쳐서 데이터베이스의 관계를 정의할 수 있지만, 매우 복잡하고 시간이 많이 소모된다.
NoSQL은 일반적으로 수평적 확장으로 데이터베이스를 위한 서버를 추가적으로 구축하면, 많은 트래픽을 보다 편리하게 처리할 수 있다. 저렴한 범용 하드웨어나 클라우드 기반의 인스턴스에 NoSQL 데이터베이스를 호스팅할 수 있어서, 수직적 확장보다 상대적으로 비용이 저렴하다.
SQL과 NoSQL 비교
SQL | NoSQL |
Stands for Structured Query의 약자 | Not only SQL의 약자 |
관계형 데이터베이스 관리 시스템(RDBMS) | 비관계형 데이터베이스 관리 시스템 |
미리 정의된 스키마가 있는 구조화된 데이터에 적합 | 비졍형 및 반정형 데이터에 적합 |
데이터는 열과 행이 있는 테이블에 저장 | 데이터는 컬렉션 또는 Document에 저장 |
트랜잭션 관리를 위해 ACID 속성[Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)]을 따름 | 반드시 ACID 속성을 따르진 않음 |
JOIN 및 복잡한 쿼리 지원 | JOIN 및 복잡한 쿼리 미지원 |
정규화된 데이터 구조 사용 | 비정규화된 데이터 구조 사용 |
대량의 데이터를 처리하기 위해 수직 확장 필요 | 수평 확장을 통해 대량의 데이터를 처리 |
Ex) MySQL, PostgreSQL, Oracle, SQL Server, Microsoft SQL Server | Ex) MongoDB, Cassandra, Couchbase, Amazon DynamoDB, Redis |
SQL과 NoSQL을 언제 사용해야 하는가?
이는 구축하려는 프로젝트나 어플리케이션의 유형과 그에 수반되는 데이터 요구 사항에 따라 결정된다. 각 데이터베이스의 고유한 기능을 이해하면 어떤 데이터베이스가 프로젝트에 가장 적합한지 결정하는데 도움이 된다.
SQL을 사용할지 NoSQL을 사용할지 결정할 때 확장성과 성능을 고려하고 필요에 맞는 데이터베이스를 잘 알고있으면 성능을 개선하고 데이터 무결성을 보장해 궁극적으로 성공적인 프로젝트를 만드는 데 도움이 될것이다.