# NoSQL에 대해서 설명해 주세요.

* **NoSQL(Not Only SQL)** 은 비관계형 데이터베이스로, 관계형 데이터베이스를 제외한 나머지 유형을 말한다.
  * `NoSQL`은 대용량 데이터와 다양한 데이터 형식을 효율적으로 처리할 수 있는 특징이 있다.
  * `NoSQL`을 사용하면 높은 확장성, 높은 가용성, 높은 성능 등을 구현할 수 있다.
  * `NoSQL` 데이터베이스는 테이블 형식이 아니며, 관계형 테이블과는 다른 방식으로 데이터를 저장한다.
* 데이터 유형에 따라 다양한 유형이 있으며, 주요 유형으로는 `문서`, `키 값`, `와이드 컬럼`, `그래프` 등이 있다.
* `NoSQL`이라고 해서 꼭 **스키마가 없는 것은 아니다.**
  * 유연한 스키마를 제공하며, 대량의 데이터와 높은 사용자 부하에서도 손쉽게 확장할 수 있다는 점이 큰 장점이다.
  * 또한 데이터를 읽어올 때 스키마에 따라 데이터를 읽어 온다.

**NoSQL 장점**

1. 스키마가 없기 때문에 유연하고 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있다.
2. 데이터는 애플리케이션이 필요로 하는 형식으로 저장되기 때문에 데이터를 읽어오는 속도가 빨라진다.
3. 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기와 쓰기 요청 처리가 가능하다.

**NoSQL 단점**

1. 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있다.
2. 데이터 중복을 계속 업데이트해야 한다.
3. 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정이 필요한 경우 모든 컬렉션에서 수행해야 한다.

## RDBMS 와 NoSQL 차이점

### 데이터 저장

* `RDBMS`의 경우 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 **SQL 언어를 통해** 테이블에 저장한다.
* **NoSQL**의 경우 `key-value`, `document`, `wide-column`, `graph` 등의 방식으로 데이터를 저장한다.

### 스키마

* `RDBMS`를 사용하려면 고정된 스키마가 필요하다.
* 처리하려는 데이터 속성별로 컬럼에 대한 정보를 미리 정해야만 데이터 처리가 가능한 것이다.
* 스키마는 나중에 변경할 수 있지만, 데이터베이스 전체를 수정하거나 오프라인으로 전환해야할 수도 있기 때문에 처음에 신중하게 스키마를 정의해야 한다.
* **NoSQL**에서는 관계형 데이터베이스에 비해 유연하게 스키마의 형태를 관리할 수 있다.
* 행을 추가할 때 즉시 새로운 열을 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력하지 않아도 된다.

### 쿼리

* SQL 기반의 관계형 데이터베이스는 테이블의 형식과 테이블 간의 관계에 맞춰 데이터를 요청해야 한다.
* 요청하는 방식이 정해져 있기 때문에 SQL 언어와 같이 구조화된 쿼리 언어를 사용하는 것이다.
* **NoSQL**의 쿼리는 데이터 그룹 자체를 조회하는 것에 초점을 두고 있기 때문에 구조화되지 않은 쿼리 언어로도 데이터를 요청할 수 있다.
* 이를 `UnQL`이라고도 부른다.

### 확장성

* SQL 기반의 관계형 데이터베이스는 수직적으로 확장하며, 높은 메모리와 CPU를 사용한다.
* 데이터베이스가 구축된 하드웨어의 성능을 많이 이용하므로 비용이 비싼 편이다.
* 여러 개의 서버에 걸쳐서 데이터베이스의 관계를 정의할 수 있지만 매우 복잡하고 시간이 오래 걸린다.
* **NoSQL**로 구성된 데이터베이스는 반대로 수평적으로 확장한다.
* NoSQL 데이터베이스를 위한 서버를 추가로 구축하게 되면 많은 트래픽을 편리하게 처리할 수 있다는 장점이 있다.

## NoSQL이 더 빠른 이유는 무엇인가요?

* `NoSQL`은 데이터베이스의 구조적 규제와 특정 스키마가 없는 비구조화된 데이터베이스 시스템이다.
* 이는 데이터의 추가, 수정, 삭제에 대한 빠른 처리 속도를 제공하고, 대용량 데이터를 처리하는 데 높은 확장성을 가지고 있기 때문에 더 빠르다.
* `NoSQL`은 대용량의 데이터를 효율적으로 저장하고 검색하기 위해 만들어졌다.
* RDB와 달리 `NoSQL`은 세부적인 제약 사항이 없어 개발자의 유연성이 높아진다.

## 관계형 데이터베이스를 사용해야 할 때

* 데이터베이스의 `ACID` 성질을 준수해야 하는 소프트웨어를 개발하는 경우
* 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
* 변경될 여지가 없고 명확한 스키마가 사용자와 데이터에게 중요한 경우

## NoSQL 데이터베이스를 사용해야 할 때

* 정확한 데이터의 구조를 알 수 없거나 변경, 확장될 가능성이 있는 경우
* 읽기는 자주 해도 데이터 변경은 자주 없는 경우
* 막대한 양의 데이터를 다뤄야 해서 데이터베이스를 수평으로 확장해야 하는 경우

\\

### 참고

* [참고 사이트](https://www.whatap.io/ko/blog/173/?gad_source=1\&gclid=Cj0KCQjwqpSwBhClARIsADlZ_TnuBUrLHyGMTRR33JBM9FKIirCDBz-rYCEMh1ACN0gyQC9IqYN-mywaAk7WEALw_wcB)
