데이터베이스를 선택할 때 가장 중요한 결정은 관계형(SQL) 혹은 비관계형(NoSQL) 데이터 구조를 선택하는 것이다. 두 시스템 모두 고유한 장점을 제공하고 서로 다른 요구 사항을 충족하므로 최적의 데이터 관리를 위해서는 두 시스템의 차이를 파악하는 것이 중요하다.
SQL
정의
- Structed Query Language(구조화 된 쿼리 언어)의 약자
- 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어
- 데이터베이스 자체를 나타내는 것이 아니라, 특정 유형의 데이터베이스와 상호 작용하는데 사용하는 쿼리 언어
💡 관계형 데이터베이스(Relational DataBase) : 데이터를 행과 열의 2차원 표 형태로 저장하는 데이터베이스
특징
- SQL을 사용하면 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 삭제 및 검색할 수 있다.
관계형 데이터베이스의 핵심적인 2가지 특징
- 데이터는 정해진 (엄격한) 데이터 스키마에 따라 테이블에 저장된다.
- 데이터는 관계를 통해 여러 테이블에 분산된다.
1) 엄격한 데이터 구조(스키마)가 존재한다.
- 데이터는 테이블에 레코드 형태로 저장되며, 각 테이블에는 명확하게 정의된 구조가 있다.
- 구조는 필드의 이름과 데이터 유형으로 정의된다.
- 관계형 데이터베이스에서 스키마를 준수하지 않는 레코드는 테이블에 추가할 수 없다.
- 즉, 정해진 구조에 맞는 레코드만 추가 가능한 것이 관계형 데이터베이스의 특징 중 하나이다.
2) 관계를 사용한다.
- 데이터의 중복을 피하기 위해 관계를 사용한다.
- 하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어진다.
NoSQL
정의
- Not Only SQL의 약자
💡 Not Only SQL : 단순히 기존 관계형 DBMS가 갖고 있는 특성뿐만 아니라, 다른 특성들을 부가적으로 지원한다는 의미를 내포한다.
- NoSQL은 기본적으로 SQL(관계형 데이터베이스)와 반대되는 접근 방식을 따르기 때문에 지어진 이름이다.
- 스키마 없음
- 관계 없음
- 초고용량 데이터 처리 등 성능에 특화된 목적을 위해, 비관계형 데이터 저장소에 비구조적인 데이터를 저장하기 위한 분산 저장 시스템
특징
- NoSQL에서는 레코드를 문서(documents)라고 부른다.
- 문서(documents)는 json과 비슷한 형태를 가지고 있다.
관계형 데이터베이스처럼 여러 테이블에 나누어담지 않고, 일반적으로 관련 데이터를 동일한 '컬렉션'에 넣는다. - 따라서, NoSQL에서는 여러 테이블에 조인할 필요 없이 이미 필요한 모든 것을 갖춘 문서를 작성한다.
(NoSQL에서는 조인이라는 개념이 존재하지 않는다.)
- 문서(documents)는 json과 비슷한 형태를 가지고 있다.
- 테이블을 컬렉션(collection)이라고 부른다.
- 문서, 그래프 데이터베이스, 키-값 저장소와 같은 비관계형 데이터 구조를 사용하여 데이터를 저장하고 검색하는 데이터베이스의 한 유형이다.
- 기존의 관계형 데이터베이스보다 유연하게 설계되어 사용량이나 부하 변화에 따라 쉽게 확장 또는 축소할 수 있다.
- 비관계 데이터베이스 (NoSQL)도 관계형 데이터베이스와 방식은 다르지만, 관계 데이터를 저장할 수는 있다.
- 관게형 DB의 주요 특성인 ACID (Atomic, Consistency, Integrity, Durabity)를 제공하지 않는다.
- SQL은 스키마를 따르지 않으면 데이터를 저장하는 것이 불가능하지만, NoSQL은 다른 구조의 데이터를 같은 컬렉션에 추가하는 것이 가능하다.
- 확장성이 좋다. 수직적, 수평적 확장을 모두 지원한다.
- 데이터 저장 방식으로 인해 SQL 데이터베이스는 일반적으로 수직적 확장만 지원한다.
확장성(Scaling) : 대규모적인 재설계 및 재설치 없이 확장이 얼마나 쉽고 가능한지에 대한 용이성
- 수직적 확장
▪︎ 단순히 DB 서버의 성능을 향상시키는 것 (ex. CPU 업그레이드)
- 수평적 확장 :
▪︎ 더 많은 서버가 추가되어 DB가 전체적으로 분산되는 것
▪︎ 하나의 데이터베이스에서 작동하지만, 여러 호스트에서 작동한다.
▪︎ 샤딩 (Sharding)의 개념을 알고 있는 NoSQL 데이터베이스는 수평적 확장을 지원할 수 있다.
샤딩 : 하나의 거대한 데이터베이스나 네트워크 시스템을 여러 개의 작은 조각으로 나누어 분산 저장하여 관리하는 것
- 단순 검색, 데이터 추가 작업에 있어 매우 최적화된 키-값 저장 기법을 사용한다.
유형
1. Key-Value 타입
- 속성을 Key-Value의 쌍으로 나타내는 데이터를 배열 형태로 저장한다.
- Key는 속성 이름을 뜻하고, Value는 속성에 연결된 데이터 값을 의미한다.
- 대표적인 Key-Value 형식의 데이터베이스에는 Redis, Amazon DynamoDB 등이 있다.
2. 문서형(Document) 데이터베이스
- 데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스를 의미한다.
- 많은 문서형 데이터베이스에서 JSON과 유사한 형식의 데이터를 문서화하여 저장한다.
- 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라는 그룹으로 묶어 관리한다.
- 대표적인 문서형 데이터베이스에는 MongoDB 등이 있다.
3. Wide-Column Store 데이터베이스
- 데이터베이스의 열(column)에 대한 데이터를 집중적으로 관리하는 데이터베이스이다.
- 각 열에는 key-value 형식으로 데이터가 저장되고, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터를 처리할 수 있다.
- 하나의 행에 많은 열을 포함할 수 있어서 유연성이 높다.
- 데이터 처리에 필요한 열을 유연하게 선택할 수 있다는 점에서 규모가 큰 데이터 분석에 주로 사용되는 데이터베이스 형식이다.
- 대표적인 Wide-Column 데이터베이스에는 Apache Cassandra, Apache HBase 등이 있다.
4. 그래프(Graph) 데이터베이스
- 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스이다.
- 노드(node)에 속성별(entity)로 데이터를 저장한다.
- 각 노드간의 관계는 선(edge)로 표현한다.
- 대표적인 그래프 데이터베이스에는 Neo4J, InfiniteGraph 등이 있다.
SQL의 장단점
장점
- 스키마가 명확하게 정의되어 데이터 무결성을 보장한다.
- 관계를 맺고 있는 테이블 간의 데이터를 중복 없이 한 번만 저장한다.
- NoSQL은 관계가 있는 컬렉션에 모두 데이터를 중복으로 저장해야 한다.
단점
- 덜 유연하다.
- 데이터 스키마를 사전에 꼼꼼히 계획해야 한다.
- 나중에 스키마를 수정하기 힘들다.
- 관계를 맺고 있어 조인문이 많은 복잡한 쿼리가 만들어질 수 있다.
- 대체로 수직적 확장만 가능하다.
NoSQL의 장단점
장점
- 스키마가 없어 유연하다.
- 언제든 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있다.
- 데이터를 조회하는 속도가 빨라진다.
- 데이터가 애플리케이션이 필요로 하는 형식으로 저장되기 때문
- 수직, 수평으로의 확장이 가능하여 애플리케이션의 모든 읽기/쓰기 요청을 처리할 수 있다.
단점
- NoSQL의 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있다.
- 데이터가 중복되기 때문에 불안정한 측면이 있다.
- 데이터 중복을 계속 업데이트 해야 한다.
- 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정 시 모든 컬렉션에서 수행해야 한다.
SQL 데이터베이스 사용이 더 좋은 경우
- 관계를 맺고 있는 데이터가 자주 변경되는 경우
- NoSQL에서는 관계를 맺고 있는 컬렉션들을 모두 수정해야 하기 때문에 비효율적이다.
- 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에 중요한 경우
- 조인이나 복잡한 쿼리를 실행해야 하는 경우
-> SQL은 명확한 스키마와 데이터의 무결성이 보장돼야 할 때 유리하다. 그리고, 데이터가 자주 변경 및 수정될 때 더 좋은 성능을 보인다.
NoSQL 데이터베이스 사용이 더 좋은 경우
- 정확한 데이터 구조를 확정할 수 없는 경우
- 데이터 구조가 변경, 확장될 가능성이 있는 경우
- 읽기를 자주 하지만 데이터 변경은 자주 없는 경우
- 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)
- ACID 조건이 요구되지 않는 경우
- 유연한 스키마가 필요한 데이터를 다루는 경우
- 데이터베이스에 제약 및 유효성 로직이 구현될 필요가 없는 경우
- 분산된 소스로부터 데이터를 로깅하는 경우
- 장바구니나 세션처럼 임시적인 데이터를 저장할 경우
-> NoSQL은 유연하고 수평적인 확장이 요구될 때 사용하면 좋다. 수정 시 모든 컬렉션에서 작업을 수행하기 때문에 읽기 처리 위주의 작업을 수행할 때 유리하다.
SQL과 NoSQL의 차이
비교 | SQL | NoSQL |
⭐️ 정의 | SQL 데이터베이스는 RDBMS 혹은 관계형 데이터베이스이다. | NoSQL은 비관계형 혹은 분산 데이터베이스이다. |
목적 | 전통적인 RDBMS는 데이터를 분석하고 가져오기 위해 SQL 문법과 질의를 사용하며 온라인 분석 처리를 위해 개발되었다. | 다양한 종류의 데이터베이스 기술을 구성하고 있고, 최신 어플 개발에 대응하기 위해 개발되었다. |
⭐️ 질의 언어 | 구조적 질의 언어 | 정의되지 않은 질의 언어 |
⭐️ 타입 | 테이블에 기초한 데이터베이스 | 문서, 키페어, 그래프의 형태를 가질 수 있음 |
⭐️ 스키마 | 사전 정의된 스키마 혹은 구조적 데이터 | 동적 스키마 혹은 비구조적 데이터 |
데이터 구조 | 정규화된 데이터 구조를 사용한다. | 비정규화된 데이터 구조를 사용한다. |
⭐️ 확장성 | 수직적 확장 가능 | 수평적 확장 가능 |
종류 | Oracle, PostgreSQL, MySQL | MongoDB, Redis, Neo4j, Hbase |
적합성 | 복잡하고 집약적인 쿼리 환경에 적합하다. JOIN 및 복잡한 쿼리를 지원한다. |
복잡한 쿼리에는 적합하지 않다. JOIN 및 복잡한 쿼리를 지원하지 않는다. |
계층 구조 | 계층적 데이터 저장소에는 적합하지 않다. | 키 값 페어 타입을 지원하기 때문에 계층적 데이터 저장에 적합하다. |
변형 | 한가지 타입과 부수적인 변형들을 가진다. | 그래프나 문서 같은 여러 다른 타입을 가질 수 있다. |
개발년도 | 1970년도 평면 파일 저장소에서 개념이 시작됐다. | 2000년도 SQL의 한계와 오류를 보완하기 위해 개발됐다. |
오픈소스 | 상엄적 용도와 프리웨어 등이 있다. | 오픈소스이다. |
일관성 | 강한 일관성을 가진다. | DB에 따라 다르다. |
최적 용도 | ACID 문제를 해결하기에 적합한 선택이다. (트랜잭션 관리를 위해 ACID를 따른다.) |
데이터 유효성 문제에 적합하다. (반드시 ACID 속성을 따르지 않는다.) |
중요도 | 데이터의 신뢰도가 매우 중요할 때 사용된다. | 정확도보다는 빠른 데이터가 중요할 때 사용된다. |
최적 옵션 | 동적 쿼리를 지원할 때 좋다. | 필요에 따라 확장이 필요할 때 좋다. |
하드웨어 | 전문적인 DB 하드웨어 (오라클 Exadata 등) | 일반 하드웨어 |
네트워크 | 고성능 지원 하드웨어 (Infiniband, FabricPath 등) | 일반 네트워크 (Ethernet emd) |
저장 방식 | 고성능 지원 저장소 (SAN, RAID 등) | 일반 저장소 (HDD, JBOD 등) |
장점 | 크로스 플랫폼 지원, 보안성, 무료 | 편리한 사용성, 고성능, 유연한 도구 |
모델 | ACID(원자성, 일관성, 고립성, 지속성) | Base(Basically Available, Soft state, Eventually Consistent) |
5가지 중요한 차이
- SQL 데이터베이스는 관계형 데이터베이스이고, NoSQL 데이터베이스는 비관계형 데이터베이스이다.
- SQL 데이터베이스는 구조화 쿼리 언어(SQL)를 사용하며 미리 정의된 스키마가 있다.
NoSQL 데이터베이스는 구조화되지 않은 데이터를 위한 동적 스키마가 있다. - SQL 데이터베이스는 수직적 확장이 가능한 반면, NoSQL 데이터베이스는 수평적 확장이 가능하다.
- SQL 데이터베이스는 테이블 기반인 반면, NoSQL 데이터베이스는 문서, 키-값, 그래프 또는 와이드 컬럼 스토어이다.
- SQL 데이터베이스는 다중 행 트랜잭션에 더 적합한 반면, NoSQL은 문서나 JSON과 같은 비정형 데이터에 더 적합하다.
SQL과 NoSQL 중 어떤 것을 사용해야 할까 ?
어떤 유형의 데이터베이스를 사용할지 결정할 때는 프로젝트의 특정 요구 사항과 필요에 따라 SQL 또는 NoSQL을 선택해야 한다.
예를 들어, 웹 애플리케이션을 위해 빠르고 확장 가능하며 안정적인 데이터베이스가 필요한 경우 NoSQL 시스템이 더 적합할 수 있다.
반면에 애플리케이션에 복잡한 데이터 쿼리와 트랜잭션 지원이 필요한 경우에는 SQL 시스템이 더 나은 선택일 수 있다.
궁극적으로 모든 경우에 적합한 솔루션은 없으며, 데이터베이스에 필요한 것이 무엇이고 어떤 유형의 시스템이 가장 효율적인 방식으로 이를 제공할 수 있는지에 따라 결정된다.
참고문헌
https://thisiswoo.github.io/development/sql-vs-nosql.html#google_vignette
https://appmaster.io/ko/blog/sql-dae-nosql-deiteobeiseu
https://www.integrate.io/ko/blog/the-sql-vs-nosql-difference-ko/
https://ittrue.tistory.com/195#google_vignette
https://siyoon210.tistory.com/130
https://velog.io/@octo__/SQL-vs-NoSQL