출처 : https://www.danielleskosky.com/sql-nosql-whats-the-difference/
1. SQL
Structured Query Language : SQL (구조화 된 쿼리 언어)
관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어
SQL을 사용하면 RDBMS(관계형 데이터베이스)에서 데이터를 저장, 수정 ,삭제, 검색 할 수 있다.
1-1. SQL의 특징
- RDBMS는 고정된 행(row), 열(column)으로 구성된 테이블에 데이터를 저장.
- 데이터는 정해진 데이터 스키마(Schema)를 따라 데이터 베이스 테이블에 저장됨.
- 스키마란? 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것을 말함
- 데이터가 테이블에 레코드로 저장되며, 각 테이블에는 명확하게 정의된 구조(structure)가 있다.
- 스키마를 준수하지 않는 레코드는 추가 불가
- 데이터는 관계를 통해 여러 테이블에 분산된다.
- 여러개의 테이블에 나누어서, 데이터들의 중복을 피할 수 있다.
- 수직적(Vertical) 확장만 지원
- 수직정 확장이란 데이터베이스 서버의 성능을 향상시키는 것.
- 확장성을 위해 서버의 용량을 확장 해야하며, 데이터 무결성을 위해 단일 서버에서 실행되도록 설계되어 확장하기 어려움.
- 쿼리 언어
- 데이터 쿼리를 위해 개발자가 하나의 언어로만 작업 할 수 있다(국제표준)
1-2. 종류
🗂 대표적인 관계형 데이터 베이스 종류
2. NoSQL
Not only SQL
관계형 DB를 제외한 나머지 여러 유형의 데이터베이스
(한국어(sql) vs 외국어(nosql)과 같은 개념)
2-1. No SQL의 특징
- NoSQl은 유연한 스키마를 가지며 관계를 가지지 않음
- 다른 구조의 데이터를 같은 컬렉션(sql의 테이블)에 저장 가능
- sql의 레코드는 문서(Documents)라고 하며
Json
과 비슷한 형태
- 관련 데이터는 여러 테이블에 나눠서 분산하지 않고 동일한 컬렉션에 넣음.
- JOIN이라는 개념이 없다. (데이터 중복 가능)
- 중복 데이터가 비대칭적으로 업데이트될 위험이 있으나 복잡한 JOIN을 사용하지 않아도 된다는 장점 (자주 변경되지 않는 데이터일수록)
- 대부분 오픈소스
- 수직, 수평적(Horizontal) 확장 지원
- 수평적 확장은 NoSQL에서만 가능.
- 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미.
- 쿼리 언어
- 스키마가 데이터베이스마다 달라서 쿼리 구문도 제각각으로 다르다
- 보편적 기준이 없기 때문에 개발자에게 어렵다.
2-2. 종류
- Document Databases
- 데이터를 문서처럼 저장하는 데이터베이스.
- 대부분 JSON과 같은 형식의 데이터를 문서화.
- 각각의 문서는 하나의 속성에 대한 데이터를 가지며, 컬렉션이라고 하는 그룹으로 묶어서 관리.
Mongo DB
, CouchDB
- Graph Database
- 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스.
- 노드(nodes)에 속성별(entities)로 데이터를 저장, 노드간 관계는 선(edge)로 표현.
Neo4J
, InfiniteGraph
- Key-Value Databases
- 속성을 Key-Value의 한 쌍으로 나타내는 데이터를 배열의 형태로 저장
- Key = 속성 / Value = 속성에 연결된 데이터 값
-Dynamo DB
, Redis
- Wide-Column Stores
- DB 열(column)에 대한 데이터를 집중적으로 관리하는 데이터베이스.
- key-value 형식으로 데이터 저장, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터를 처리.
- 하나의 행에 많은 열을 포함
- 유연성이 높으며 규모가 큰 데이터 분석에 주로 사용.
cassandra DB
, HBase
3. SQL 🆚 NoSQL
SQL
-
📌 장점
- 명확한 스키마, 데이터 무결성 보장
- 데이터의 중복 없음
-
📌 단점
- 스키마가 유연하지 않고 사전에 계획 되야함 (수정하기 번거롭거나 불가능)
- 데이터가 여러 테이블에 분산되어 관계를 맺고 있기 때문에, JOIN문이 많은 매우 복잡한 쿼리가 발생 가능
- 수평적 확장이 어렵다 -> 성장의 한계
-
📌 SQL을 사용하면 좋은 경우
- 관계된 데이터가 자주 변경되는 경우 (하나의 테이블만 변경)
- 복잡한 쿼리나 리포트를 만들어내야 하는 경우
- 변경 되지않는 스키마, 명확한 스키마가 사용자와 데이터에게 중요한 경우(무결성)
- 높은 부하가 예상될 경우 (안정성)
- 데이터가 크게 쌓이게 될 여지가 별로 없는 경우(정말 데이터가 많으면 압도적으로 NoSQL이 빠름)
NoSQL
-
📌 장점
- 유연한 스키마, 데이터 수정, 추가가 쉬움
- 데이터는 애플리케이션이 필요로하는 형식으로 저장 -> 데이터 읽기속도 빠름
- 수평적 확장성
-
📌 단점
- 유연한 스키마 때문에 데이터의 일관성이 약함.
- 데이터 중복 때문에 데이터 변경시 여러 컬렉션과 문서를 전부 업데이트 해야함.
-
📌 NoSQL을 사용하면 좋은 경우
- 지속적으로 새로운 기능들이 추가되고 변경되어 정확한 데이터 구조를 사전에 정의하기 힘든경우
- 읽기 처리는 자주 하지만 업데이트는 자주 하지않는 경우 (모든 중복을 모두 업데이트 해야함)
- 데이터 정합성이나 일관성이 최고 우선순위가 아닌경우
- 막대한 양의 데이터를 다루는 경우 (수평 확장 위함)
- 페이스북이나 트위터와 같은 SNS나 검색엔진은 대부분 NoSQL을 사용한다.
- 매초 막대한 데이터가 생성되는데 부하가 분산되기 때문에 속도가 빠름
참고 자료 (Reference)
https://docs.microsoft.com/ko-kr/dotnet/architecture/cloud-native/relational-vs-nosql-data
http://www.complexsql.com/difference-between-sql-and-nosql/
https://siyoon210.tistory.com/130
https://ichi.pro/ko/sqlgwa-nosql-juyo-chaijeom-56532176321612
https://dingrr.com/blog/post/%EA%B0%9C%EB%B0%9C-sql-vs-nosql-%EC%96%B8%EC%A0%9C-%EB%AC%B4%EC%97%87%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C
https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-sql-vs-nosql/