> For the complete documentation index, see [llms.txt](https://jmxx219.gitbook.io/cs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jmxx219.gitbook.io/cs/database/rdb-nosql.md).

# RDB와 NoSQL

## DB와 DBMS

* `Database`
  * 체계화된 데이터의 집합
  * 여러 응용 시스템들의 통합된 정보를 저장하여 운영할 수 있는 공용 데이터의 묶음
  * 검색/갱신 등의 데이터 관리를 효율화함
* `DBMS(Database Management System)`
  * 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해주고 데이터베이스를 관리해주는 소프르웨어
* `SQL(Structured Query Language)`
  * 관계형 데이터베이스 관리 시스템의 데이터를 관라하기 위해 사용되는 표준 프로그래밍 언어
  * 데이터베이스와 관련된 모든 작업을 위해 사용됨
    * 데이터베이스 스키마 생성 및 수정, 테이블 관리, 데이터 추가, 수정, 삭제, 조회 등
* `Schema`
  * 데이터베이스를 구성하는 `개체(Entity)`, `속성(Attribute)`, `관계(Relationship)` 및 `제약조건` 등에 관해 전반적인 명세를 기술한 메타데이터의 집합
  * [참고](/cs/database/schema.md)

<br>

**데이터 요청**

CPU가 RAM에 데이터를 요청할 때

* RAM에 적재되어 있는 데이터를 가져올 경우, I/O가 발생 X
* 하드디스크에서 데이터를 가져올 경우, I/O 발생
  * 페이지 교체 발생 -> 속도 떨어짐
  * Blocking I/O: I/O 작업이 진행되는 동안 프로세스는 자신의 작업을 중단한채 대기하는 방식

<br>

[**DB 서버의 확장성(Scaling)**](/cs/database/undefined-3.md)

* 수직적 확장(Scale-up)
  * 컴퓨터의 성능을 업그레이드 하는 방법
    * 단순히 데이터베이스의 성능을 향상 시키는 것
  * 데이터라 분산되지 않기 때문에 동기화가 필요없어 데이터 일관성이 유지됨
  * RAM의 공간에 한계가 있어 결국에 하드웨어에서 데이터를 가져옴
    * 이 과정에서 I/O가 일어나 데이터 읽기에서 성능이 떨어짐
* 수평적 확장(Scale-out)
  * 컴퓨터를 여러 대 사용하여 분산시키는 방법
    * 더 많은 서버가 추가되고 DB가 전체적으로 분산됨
    * 하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동
  * 데이터 복제

<br>

**DB 분류**

\
![DB 분류](https://github.com/reddevilmidzy/CS-Study/assets/78539407/caf26e62-d473-4860-add4-1ea6741a82df)<br>

* 키-값 DB: 키와 값으로 구성된 배열구조의 DB로 NoSQL DB 중 가장 단순한 구조
* 도큐먼트 DB: 필드와 값의 형태로 구성된 데이터를 JSON 포맷으로 관리하는 DB로 NoSQL DB 중 가장 많이 사용되는 구조
* 컬럼 패밀리 DB: 컬럼과 로우로 구성된 DB로 컬럼은 이름과 값으로 구성되고 로우는 각기 다른 컬럼으로 구성이 가능함
* 그래프 DB: 노드와 관계로 구성된 DB로 근접한 객체를 모델링할 목적으로 설계됨

<br>

## RDB(Relational Database)

* 개념
  * 관계형 데이터 모델을 기초로 두고, 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스
    * 테이블 간에는 외래키(FK)를 사용하여 서로 다른 테이블과 관계를 맺고 있음
  * 정형화된 정보를 저장하고 접근하는데 가장 효율적이고 유연한 데이터베이스 모델
  * `RDBMS(Relational DBMS)`
    * 관계형 데이터베이스(RDB) 관리 시스템
    * 데이터베이스를 이루는 객체들의 릴레이션을 통해 데이터를 저장
    * SQL을 이용하여 데이터의 저장, 수정, 삭제, 검색 가능
  * ACID와 [Transaction](/cs/database/undefined-4.md)을 지원하여 데이터의 중복을 제거하고 데이터의 일관성을 보장
* 장점
  * 정해진 스키마에 따라 저장하기 때문에 명확한 데이터 구조가 보장됨
  * 오래 사용된 만큼 신뢰성이 높고, 어떤 상황에서도 데이터의 무결성을 보장함
  * `관계`를 이용하여 각 데이터를 중복 없이 한 번만 저장 가능
  * 유지보수 편리
* 단점
  * 작성된 스키마를 수정하기 어려움
    * 데이터가 유연하지 못하고, 스카마가 변경되는 경우 데이터 구조의 변경이 어려움
  * 테이블 간의 관계가 복잡해 시스템이 커질 경우 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있음
  * 성능 향상을 위해서는 `수직적 확장(Scale-up)`만을 지원해 비용이 기하급수적으로 늘어날 수 있음
  * 다른 DB에 비해 많은 자원이 활용되어 시스템 부하가 높음
* 사용
  * 데이터 구조가 변경될 여지가 없고, 명확한 스키마가 경우
  * 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
* 용어
  * `Relation(릴레이션)`: `Entity`, `Table`
    * `Tuple(튜플)`: 관계된 데이터의 묶음으로, 테이블의 행을 의미
    * `Attribute(속성)`: 데이터의 항목/필드를 의미

<br>

## NoSQL(Not Only SQL)

* 개념
  * 비관계형 데이터베이스로 RDB에 비해 자유로운 형태로 데이터를 저장
  * 데이터 간의 관계를 정의하지 않고, 스키마 없이 사용하거나 느슨한 스키마를 제공
  * 대량의 분산된 데이터를 저장하고 조회하는데 특화
* 장점
  * 유연하고 자유로운 데이터 구조
    * 저장된 데이터를 조정하고 새로운 필드를 추가하는데에 자유로움
    * 데이터는 애플리케이션이 필요로 하는 형식으로 저장
  * 성능 향상 방법으로 `수직적 확장(Scale-up)` 가능, `수평적 확장(Scale-out)`에 용이
  * 대용량 데이터 처리에 효과적이고, 분산처리와 병렬 처리 가능
* 단점
  * 데이터 중복 발생 가능
    * 여러 컬렉션에 중복 데이터가 많아 데이터 변경 시, 모든 컬렉션에서 수정 필요
  * 명확한 데이터 구조를 보장하지 않음
* 종류
  * Key-Value Model
    * Key-Value 방식으로 저장
    * 고속 읽기와 쓰기에 최적화
    * ex) Redis, DynamoDB 등
  * Document Model
    * Key-Document 방식으로 저장
    * Document는 계층적 데이터 타입(JSON, XML)으로 저장
    * ex) MongoDB 등
  * Column Model, Graph Model
* 사용
  * 정확한 데이터 구조가 정해지지 않거나, 변경 및 확장이 될 수 있는 경우
  * 데이터 양이 매우 많은 경우(막대한 양의 데이터를 다뤄야하는 경우)
  * 데이터 읽기를 자주 하지만, 변경은 자주 이루어지지 않는 경우
* 용어
  * `Documents(문서)`
    * 레코드라고 부름
    * `Json`과 비슷한 형태로, 관련 데이터를 동일한 `컬렉션`에 넣음
    * 여러 테이블을 조인할 필요 없이 이미 필요한 모든 것을 갖춘 문서

<br>

### RDB(SQL) VS NoSQL

#### 적합성

* RDB 사용이 더 적합한 경우
  * 관계를 맺고 있는 데이터가 자주 변경되는 경우
  * 스키마의 변경이 없는 경우

<br>

* NoSQL 사용이 더 적합한 경우
  * 정확한 데이터 구조가 정해지지 않거나, 변경 및 확장이 될 수 있는 경우
  * 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야하는 경우)
  * 데이터 읽기(read)를 자주 하지만, 변경(update)은 자주 이루어지지 않는 경우

<br>

|           |                                                RDB(SQL)                                               |                                        NoSQL                                       |
| --------- | :---------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: |
| 데이터 저장 모델 |                                                 Table                                                 |                           Json document, key-value, 그래프 등                          |
| 개발 목적     |                                               데이터 중복 감소                                               |                                  애자일, 확장가능성, 수정가능성                                 |
| 스키마       |                                               엄격한 데이터 구조                                              |                                     유연한 데이터 구조                                     |
| 확장        |                                                Scale-up                                               |                                      Scale-out                                     |
| 종류        |                                            Oracle, MySQL 등                                            |                                  MongoDB, Redis 등                                  |
| 적합 업무     | <p>- 데이터 무결성 및 일관성이 중요한 트랜잭션 업무<br>- 온라인에서 다양한 집계 및 통계를 분석하는 업무<br>- 복잡한 계산 및 실시간 데이터 정합성이 필요한 업무</p> | <p>- 오프라인에서 정형 및 비정형 데이터 분석 업무<br>- 초당 동시 처리가 중요한 업무<br>- 로그 및 이력 등의 단순 기록형 업무</p> |
| 성능        |                                       성능 향상을 위해서는 성능 최적화 작업이 필요                                       |                         클러스터 크기, 네트워크 및 애플리케이션에 의해 성능이 결정됨                         |

<br>

***

#### ref

* [mongoDB Story 1: mongoDB 정의와 NoSQL](https://meetup.nhncloud.com/posts/274)
