SQL 과 NoSQL 의 차이
SQL
SQL은 Structured Query Language의 약자로 데이터베이스에서 사용하는 쿼리 언어 입니다. SQL을 사용하여 RDBMS에서 데이터를 검색, 저장, 수정, 삭제 등이 가능합니다. RDBMS는 Relational Database Management System으로 말 그대로 관계형 데이터베이스 관리 시스템입니다. RDBMS는 정해져있는 데이터 스키마에 따라 데이터베이스 테이블에 저장되며, 관계를 통한 테이블간 연결을 통해 사용됩니다. 이 때문에 RDBMS는 데이터 관리를 효율적으로 하기위해 구조화가 굉장히 중요합니다.
SQL 의 특징
- 데이터는 정해진 데이터 스키마 따라 테이블에 저장된다.
- 데이터는 관계를 통해 여러 테이블에 분산된다.
- 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다.
- 데이터의 중복을 피하기 위해 ‘관계’를 이용한다.
NoSQL
NOSQL은 Not Only SQL, Non relational Database라고 부른다고 합니다. NOSQL은 관계형 데이터베이스와 반대되는 방식을 사용하여 스키마와 관계라는 개념이 없습니다. RDBMS에서는 스키마에 맞추어 데이터를 관리하여야 하지만 NOSQL은 스키마가 없어 좀 더 자유롭게 데이터를 관리할 수 있습니다. NOSQL에서 테이블과 같은 개념으로 컬렉션이라는 형태로 데이터를 관리합니다.
NoSQL의 특징
스키마도 없고, 관계도 없다.
문서(SQL에서 레코드 NoSQL에서는 문서라 부름)는 Json과 비슷한 형태로 가지고 있다.
관계형 데이터베이스처럼 여러 테이블에 나누어 담지 않고, 관련 데이터를 동일한 ‘컬렉션’에 넣는다. 따라서 조인이라는 개념이 존재하지 않음
컬렉션이란 그저 용도가 같거나 유사한 문서들을 그룹으로 묶은 것을 말한다. 컬렉션은 기존 SQL 데이터베이스의 테이블처럼 동작한다.
따라서 조인을 하고 싶을때 컬렉션을 통해 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하도록 한다. 그런데 이때 데이터가 중복되어 서로 영향을 줄 위험이 있어, 조인을 잘 사용하지 않고 자주 변경 되지 않는 데이터일 때 NoSQL을 쓰면 효율적이다.
확장 개념
두 데이터베이스를 비교할 때 중요한 Scaling 개념도 존재한다.
데이터베이스 서버의 확장성은 ‘수직적’ 확장과 ‘수평적’ 확장으로 나누어진다.
- 수직적 확장 : 단순히 데이터베이스 서버의 성능을 향상시키는 것 (ex. CPU 업그레이드)
- 수평적 확장 : 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미 (하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동)
데이터 저장 방식으로 인해 SQL 데이터베이스는 일반적으로 수직적 확장만 지원함
수평적 확장은 NoSQL 데이터베이스에서만 가능
SQL과 NoSQL 장단점
SQL 장점
- 명확하게 정의된 스키마, 데이터 무결성 보장
- 관계는 각 데이터를 중복없이 한번만 저장
SQL 단점
- 덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정하기 힘듬)
- 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음
- 대체로 수직적 확장만 가능함
NoSQL 장점
- 스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
- 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐
- 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능
NoSQL 단점
- 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
- 데이터 중복을 계속 업데이트 해야 함
- 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한번만 수행이 가능)
SQL 데이터베이스 사용이 더 좋을 때
관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
NoSQL에서는 여러 컬렉션을 모두 수정해야 하기 때문에 비효율적
변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
NoSQL 데이터베이스 사용이 더 좋을 때
- 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
- 읽기를 자주 하지만, 데이터 변경은 자주 없는 경우
- 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)
하나의 제시 방법이지 완전한 정답이 정해져 있는 것은 아니다.
SQL을 선택해서 복잡한 JOIN문을 만들지 않도록 설계하여 단점을 없앨 수도 있고
NoSQL을 선택해서 중복 데이터를 줄이는 방법으로 설계해서 단점을 없앨 수도 있다.
출처: https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/SQL%EA%B3%BC%20NOSQL%EC%9D%98%20%EC%B0%A8%EC%9D%B4.md