[데이터베이스] SQL vs NoSQL

hyyyynjn·2021년 10월 7일
0

면접대비

목록 보기
19/31
post-thumbnail
post-custom-banner

  • Database란
    컴퓨터 시스템에 전자 방식으로 저장된 구조화된 데이터 집합이다.
  • DBMS란
    DataBase Management System으로 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성하고 데이터베이스를 관리해주는 소프트웨어이다.
  • SQL이란
    Structured Query Language로 RDBMS의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다. RDBMS의 데이터를 검색, 관리하거나 스키마 생성, 수정할 때 사용된다.

✅SQL Database

SQL을 사용하여 RDBMS에 데이터를 저장,수정,삭제 및 검색할 수 있다.
이러한 RDB는 두가지 주요 특징이 있다.

  • 데이터는 정해진(엄격한) 데이터 스키마(structure)를 따라 데이터베이스 테이블에 저장된다.
  • 데이터는 관계를 통해 여러 테이블에 분산된다.

엄격한 스키마 Strict Schema

SQL 데이터베이스에서 데이터는 테이블에 레코드로 저장되고, 각 테이블에는 명확하게 정의된 structure(구조)가 있다.

  • 여기서 말하는 structure는 어떤 데이터가 테이블에 들어가고 들어가지 못할지를 정의하는 field 집합을 가리킨다.

RDB 에서 스키마를 준수하지 않은 레코드를 추가할 수 없다.
⇨ 명확한 데이터 구조를 보장한다.

관계 Relations

SQL 데이터베이스에서 또 다른 중요한 특징은 관계이다.
관계를 맺는 데이터를 여러 개의 테이블로 나누어서 데이터 중복을 피할 수 있다.

  • RDB는 테이블 간의 관계를 나타내기 위해 외래 키(foreign key)를 사용한다.
  • 외래 키를 이용하여 테이블 간 JOIN 연산이 가능하다.

Users, Products, Orders와 같은 여러 테이블을 만들어 관계를 표현하면 중복된 데이터를 줄일 수 있다.
⇨ 중복없이 하나의 데이터만 관리하기 때문에 다른 테이블에서 정확하지 않은 데이터를 다루는 위험이 줄어든다.

수직적 확장 Vertical Scaling

수직적 확장이란 단순히 데이터베이스 서버의 성능을 향상시키는 것을 말한다.

  • 예를 들어 CPU, Memory 등을 업그레이드하는 것을 말한다.

데이터베이스 서버를 확장할 때, SQL 데이터베이스는 데이터가 저장되는 방식 때문에 일반적으로 수직적 확장만 지원한다.


✅NoSQL Database

NoSQL 데이터베이스는 SQL과 반대되는 접근방식을 따르는 모든 데이터베이스를 칭한다.

  • 관계형 데이터 모델을 지양한다.
    • 관계라는 개념이 없다.
    • 스키마 없이 사용 가능하거나 느슨한 스키마를 제공한다.
  • 대량의 분산된 데이터를 저장하고 조회하는 데 특화되어있다.
  • NoSQL에서 SQL의 레코드를 documents(문서)라고 칭한다.
  • SQL에서는 정해진 스키마를 따르는 데이터만 추가할 수 있지만
    NoSQL은 다른 구조의 데이터를 같은 collection(SQL에서의 테이블 개념)에 추가할 수 있다.

NoSQL 데이터베이스는 왜 생겼을까?

빅데이터의 등장으로 인해 데이터와 트래픽이 기하급수적으로 증가하게 되었다.

그에 따라 RDBMS의 성능을 향상시키기 위해 데이터베이스 서버를 업그레이드 해야했다.

하지만 RDBMS 서버를 업그레이드하는 비용(수직적 확장; Scale-Up)이 더 크기 때문에 데이터 일관성을 포기(가용성을 위한 데이터 복제)하고 여러 대의 서버에 데이터를 분산하여 저장하는 수평적 확장(Scale-Out)이 가능한 NoSQL이 등장하게 되었다.

NoSQL 데이터베이스 종류

  1. Key-Value database
  • 데이터가 key와 value의 쌍으로 저장되는 데이터베이스이다.
  • key는 value에 접근하기 위한 용도로 사용되고 value는 어떠한 형태(이미지, 비디오)의 데이터라도 담을 수 있다.
  • 복잡한 조회 연산을 지원하지 않으며 질의 속도가 굉장히 빠르다.
    • 사용자의 프로필 정보, 웹 서버 클러스터를 위한 세션 정보, 장바구니 정보, URL 단축 정보 저장 등에 사용한다
  • 하나의 서비스 요청에 다수의 데이터 조회 및 수정 연산이 발생하면 트랜잭션 처리가 불가능하여 데이터 정합성을 보장할 수 없다
  • 대표적인 NoSQL key-value model로 Redis, Riak, Amazon Dynamo DB가 있다.
  1. Document Database
  • 데이터가 key와 document 형태로 저장되는 데이터베이스이다.
    • key는 문서에 대한 ID 로 표현된다.
  • key-value 모델과 달리 value는 계층적인 형태의 document로 저장된다. 이를 통해 하나의 객체를 여러 개의 테이블에 나눠 저장할 필요가 없어지게 된다.
  • 객체를 document의 형태로 바로 저장할 수 있기 때문에 객체-관계 매핑을 할 필요가 없다.
  • key-value 모델과 동일하게 검색에 최적화되어 있다.
    • 문서 ID 에 대한 인덱스를 사용하여 O(1) 시간 안에 문서를 조회할 수 있다.
  • 대부분의 문서 모델 NoSQL 은 B 트리 인덱스를 사용하여 2 차 인덱스를 생성한다.
    • B 트리는 크기가 커지면 커질수록 새로운 데이터를 입력하거나 삭제할 때 성능이 떨어지게 된다.
    • 읽기와 쓰기의 비율이 7:3 정도일 때 가장 좋은 성능을 보인다
  • 중앙 집중식 로그 저장, 타임라인 저장, 통계 정보 저장 등에 사용된다.
  • Document 데이터베이스의 질의 결과가 JSON, xml 형태로 출력된다.
  • 대표적인 NoSQL Document Model로는 MongoDB, CouthDB 등이 있다.
  1. Wide Column Database
  • Column-family Model 기반의 데이터베이스이다.
  • Key-Value 값을 이용해 필드를 결정하지 않고 key에서 필드를 결정한다.
  • key는 Row(key 값), Column-family, Column-name을 가진다.
    • 연관된 데이터들은 동일한 Column-family에 속하며
      각자의 Column-name을 가진다.
      (RDB의 attribute가 계층적인 구조를 가진 셈이다)
  • 대부분의 컬럼 모델 NoSQL 은 쓰기와 읽기 중에 쓰기에 더 특화되어 있다.
    • 데이터를 먼저 커밋로그와 메모리에 저장한 후 응답하기 때문에 빠른 응답속도를 제공한다.
    • 채팅 내용 저장, 실시간 분석을 위한 데이터 저장소 등의 서비스 구현에 적합하다.
  • 저장된 데이터는 하나의 테이블로 표현할 수 있다.
  • 질의는 Row(key 값), Column-family, Column-name을 통해 수행된다.
  • 대표적인 NoSQL Column-family Model로는 HBase, Hypertable 등이 있다.
  1. Graph Database
  • 데이터를 Node와 Edge, Property와 함께 그래프 구조를 사용하여 데이터를 표현하고 저장하는 데이터베이스이다.
  • 개체와 관계를 그래프 형태로 표현한 것이므로 관계형 모델이라고 할 수 있다.
  • 페이스북이나 트위터 같은 소셜 네트워크, 연관된 데이터를 추천해주는 추천 엔진이나 패턴 인식 등의 데이터베이스로 적합하다.
  • 대표적인 NoSQL Graph Model로는 Neo4J가 있다.

Schema-free

NoSQL에서의 documents는 JSON 데이터와 비슷한 형태를 갖는다.
또한 관련된 데이터를 하나의 동일한 collections에 넣기 때문에 SQL과 같이 복합된 데이터를 얻기 위한 JOIN연산이 필요없게 된다.

  • 실제로 NoSQL 데이터베이스는 JOIN이라는 개념이 존재하지 않는다.
  • 그 대신 collection이 정확한 데이터를 담을 수 있도록 collections간에 데이터를 복제한다.

collections간에 데이터를 복제하는 방식은 데이터 중복과 불일치를 야기한다.

  • collection B에서 데이터를 수정하지 않았지만, collection A에서 데이터를 수정할 경우 부정확한 데이터를 다룰 위험이 생긴다.
    이를 막기 위해 특정 데이터를 같이 사용하는 collection에서 동일 데이터에 대한 업데이트를 같이 수행하도록 해야 한다.
  • 이런 이유 때문에 NoSQL 데이터베이스는 자주 변경되지 않는 데이터를 다룰 때 장점이 커진다.
  • 하지만 필요한 복합 데이터가 하나의 collection에 저장되어 있기 때문에 복잡하고 느린 JOIN 연산을 사용할 필요가 없다는 장점이 있다.

수평적 확장 Horizontal Scaling

수평적 확장이란 데이터베이스 서버가 추가되고 분산되는 것을 의미한다.

  • 하나의 데이터베이스와 여러 개의 데이터베이스 서버를 다루게 된다.

NoSQL 데이터베이스는 기본적으로(natively) 수평적 확장을 지원하기 때문에 여러 데이터베이스 서버에서 데이터베이스를 쉽게 분리할 수 있다.

  • NoSQL 데이터베이스는 수직적 확장도 할 수 있다.

✅SQL? NoSQL?

둘은 대체될 수 있는 것이 아니고, 각각 필요한 시점에 적절히 선택해서 사용해야 한다. 둘 다 같이쓰는 상호보완적인 존재가 될 수도 있다.

SQL

장점

  • 명확하게 정의된 스키마를 통해 데이터 무결성을 보장한다.
  • 테이블 간 관계는 데이터를 중복 없이 한번만 저장할 수 있도록 해준다.

단점

  • 데이터베이스 스키마는 데이터가 저장되기 전에 미리 설계되어야 한다. (NoSQL보다 유연하지 않다)
  • 관계를 맺는 테이블이 많을 경우, JOIN하기 위해 복잡한 쿼리가 나갈 수 있다 (성능 이슈 발생)
  • 수평적 확장이 어렵고 수직적 확장만 가능하다. (데이터 처리량에 관련된 성장의 한계가 존재한다.)

언제 사용해야 할까?

  • 관계를 맺는 데이터가 자주 수정되는 경우
  • 변경될 여지가 없는 명확한 스키마를 갖는게 중요한 경우

NoSQL

장점

  • 스키마가 없기 때문에 SQL보다 유연하게 데이터를 저장할 수 있다. (저장된 데이터를 조정하고 새로운 field를 추가할 수 있다.)
  • 애플리케이션이 필요로하는 형태의 데이터를 저장할 수 있다. (데이터를 읽어오는 속도가 빨라진다)
  • 수직적 확장과 수평적 확장이 가능하다. (애플리케이션에서 발생하는 모든 읽기/쓰기 요청을 처리할 수 있다)

단점

  • 데이터가 여러 collection에서 중복되어 있기 때문에 데이터 수정 시 모든 collections에서 업데이트를 수행해야 한다. (SQL은 중복된 데이터가 없기 때문에 하나의 테이블에서만 업데이트를 하면 된다)

언제 사용해야 할까?

  • 정확한 데이터 구조를 알 수 없거나 구조가 변경/확장될 가능성이 있는 경우
  • read 처리를 자주하지만 update를 자주하지 않는 경우
  • 막대한 양의 데이터로 인해 데이터베이스를 수평적으로 확장해야하는 경우
post-custom-banner

0개의 댓글