꾸물꾸물 졔의 개발공부

[DB] SQL vs NoSQL 본문

CS

[DB] SQL vs NoSQL

체제 2023. 3. 10. 20:24

SQL (관계형 데이터베이스)

SQL (Structured Query Language) = 구조화된 쿼리 언어

관계형 데이터베이스 관리시스템 (RDBMS)에 접근하여 데이터를 저장, 수정, 삭제 및 검색할 수 있는 언어이다.

SQL 자체가 데이터베이스를 나타내는 것이 아니라, 쿼리 언어를 뜻하는 것이지만 '관계형 데이터베이스' 라는 의미로 사용되기도 한다.

 

이러한 관계형 데이터베이스에는 두 가지 특징이 있다.

  • 정해진 스키마에 따라 데이터가 테이블에 저장된다.
  • 관계를 통해서 연결된 여러개의 테이블에 분산되어 저장한다.

 

1. 정해진 스키마

테이블에 데이터가 저장될 때에는 레코드(record)로 저장이 되며, 각 테이블마다 정의된 구조가 있다. 여기서 구조란, 특정 테이블에 어떤 데이터가 들어가고 말지를 정의하는 필드(field) 집합을 말하는 것이다.

구조는 각 테이블에 저장될 필드의 이름과 데이터 유형으로 정의된다. 

id name gender phone
1 "John" M "010-1234-5678"
2 "Emily" W "010-1234-5678"

관계형 데이터베이스는 정해진 스키마를 가지기 때문에 , 스키마를 준수하지 않는 레코드는 추가할 수 없다. 예를 들어 위 테이블에 '나이' 필드를 넣고 싶다면, 스키마를 다시 정의하여 테이블을 만들지 않는한 추가 할 수 없다. 

 

2. 관계

데이터들을 여러개의 테이블에 나누어서 저장을 함으로써 중복되는 데이터의 저장을 피할 수 있다. 서로 중복되지 않은 데이터를 저장하고, 데이터를 조회할 때는 JOIN을 사용하면 된다. 여러개의 테이블을 만들어야 하지만 각각의 테이블들은 다른 테이블에 저장되지 않은 데이터 만을 가지고 있다.  

 

명확하게 정의된 테이블마다 중복없이 데이터를 관리하기 때문에, 다른 테이블에서 (외래키를 이용해서 참조) 부정확한 데이터를 다룰 위험이 없다. 

또한, 관계형 데이터베이스는 스키마가 뚜렷하기 때문에 테이블 간의 관계를 직관적으로 파악하기 쉽다. 

 

3. 관계형 데이터베이스 관리 시스템(RDBMS) 의 종류

  • MySQL
  • Oracle
  • SQLite
  • MariaDB

NoSQL (비관계형 데이터베이스)

No + SQL 로 SQL(관계형 데이터베이스) 와 반대되는 특성을 가지고 있다.

  • 정해진 스키마 없음 
  • 관계 없음 

 

SQL과의 가장 큰 차이점은 SQL은 정해진 스키마를 따르지 않는다면 데이터를 추가할 수 없지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가할 수 있다.  (NoSQL에서의 컬렉션 = SQL에서의 테이블)

 

또한, 관계형 데이터베이스에서는 중복을 피하기 위해 여러 테이블에 나누어 저장하여 관계를 생성했다면, 비관계형 데이터베이스에서는 일반적으로 관련 데이터를 모두 하나의 컬렉션에 넣는다. 즉, JOIN 라는 개념이 존재하지 않는다. 

(ex) name 데이터가 B / C 테이블에 모두 동일하게 필요하더라도 테이블을 따로 만들지 않고, B / C 에 중복하여 넣는다.) 

 

이러한 방식의 단점은 데이터가 중복되기 때문에 불안정하다. 예를 들어 동일한 데이터를  컬렉션 B / C에 모두 넣었는데, 컬렉션 B만 업데이터를 하게 될 위험이 있다. 그렇기 때문에 특정 데이터를 수정할 때에는 해당 데이터를 같이 사용하는 모든 컬렉션에서 똑같이 업데이터를 수행하도록 한다. 

 

반대로 가장 큰 장점은, 관계형 데이터베이스에서의 JOIN 을 사용할 필요가 없다는 것이다. 필요한 데이터가 이미 하나의 컬렉션에 모두 들어있기 때문에 JOIN이 필요하지 않다.  

 

 

1. 확장 ( 수직적(Vertical) vs 수평적(Horizontal) ) 

관계형 데이터베이스와 비교되는 하나의 중요한 개념은 확장(Scaling) 이다.

데이터베이스 서버를 수평적 / 수직적으로 확장할 수 있다.

  • 수직적(Vertical) 확장이란 단순히 데이터베이스 성능을 향상시키는 것이다. 높은 메모리, CPU를 사용하는 확장이라고도 한다. 
  • 수평적(Horizontal) 확장은 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산된다. 보다 값싼 서버 증설, 또는 클라우드 서비스를 이용하는 확장이라고도 한다. 

 

SQL은 구조화된 테이블에 저장을 하기 때문에 수직적 확장만을 지원한다. 수평적 확장은 NoSQL에서만 가능하다. NoSQL 데이터베이스를 위한 서버를 추가적으로 구축하면, 많은 트래픽을 보다 편리하게 처리할 수 있다. 

 

2. NoSQL 데이터베이스 유형 

(1) Key-Value 타입 

- 속성을 Key-Value의 쌍으로 나타내는 데이터를 배열의 형태로 저장한다.

- Key는 속성 이름을 뜻하고, Value는 속성에 연결된 데이터 값을 의미한다.

- 대표적인 예로는 Redis, Dynamo 등이 있다.

 

(2) 문서형(Document) 데이터베이스

- 데이터를 문서처럼 저장하는 데이터베이스를 의미한다.

- JSON과 비슷한 형식을 가진 데이터를 문서화하여 저장한다.

- 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리한다,

- 대표적인 예로는 MongoDB가 있다. 

 

(3) 그래프(Graph) 데이터베이스

- 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스이다.

- 노드에 속성별로 데이터를 저장한다.

- 각 노드간의 관계는 선(edge)로 표현한다. 

 

 


SQL vs NoSQL 

1. 데이터 저장 (Storage) 

- NoSQL은 key-value, document, wide-column, graph 등의 방식으로 데이터를 저장한다.

- 관계형 데이터베이스는 SQL을 이용해서 데이터를 테이블에 저장한다.

- 미리 구조화된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장한다.

 

2. 스키마 (Schema)

- RDBMS는 고정된 형식의 스키마가 정의되어 있다.

- 저장하려는 데이터 속성별로 열(column)에 대한 정보를 미리 정해두어야 한다.

- 스키마는 추후에 변경이 가능하지만, 데이터베이스를 전체 수정해야 한다.

- NoSQL은 동적으로 스키마의 형태를 관리할 수 있어 유연한 데이터 형식의 저장이 가능하다.

 

3. 확장성 (Scalability)

- SQL 기반의 관계형 데이터베이스는 수직적으로만 확장이 가능하다.

- 높은 메모리, CPU를 사용하는 확장이라고도 하다.

- 데이터베이스가 구축된 하드웨어의 성능을 많이 사용하기 때문에 비용이 상대적으로 많이 든다.

- NoSQL로 구성된 데이터베이스는 수평적으로도 확장이 가능하다.

- 수직적 확장보다 상대적으로 비용이 저렴하다. 

 

4. 쿼리 (Querying)

- 쿼리란, 데이터베이스에 대해서 데이터를 요청하는 질의문이다.

- 관계형 데이터베이스는 테이블의 형식과 관계에 맞추어 데이터를 요청해야 한다 

- 구조화된 쿼리 언어 (SQL문) 를 사용해서 요청한다.

- 비관계형 데이터베이스는 정해진 형식이나 구조화 된것이 아닌, 데이터 그룹 자체를 조회하는 것에 초점을 둔다.

- 구조화 되지 않은 쿼리 언어로도 조회가 가능하다.

 


SQL , NoSQL 의 장단점 

SQL의 장점

  • 명확하게 정의 된 스키마, 데이터 무결성 보장 
  • 관계를 통해 데이터를 중복없이 저장 

NoSQL의 장점

  • 스키마가 구조화 되지 않았기 때문에 유연하다. 언제든지 저장된 데이터를 조정하고 새로운 필드를 '추가' 할 수 있다.
  • 애플리케이션이 필요로 하는 형식 그대로 저장된다. 데이터를 읽어오는 속도가 빠르다.
  • 수직 및 수평적 확장이 가능하므로 발생하는 모든 읽기 / 쓰기 요청을 무리없이 처리할 수 있다. 

SQL의 단점 

  • 상대적으로 덜 유연하다. 데이터는 사전에 정의되기 때문에 나중에 수정하는게 번거롭다.
  • 관계를 맺고 있기 때문에 JOIN이 많아질 경우 매우 복잡한 쿼리가 만들어진다.
  • 수평적 확장이 어렵고, 대체로 수직적 확장만 가능하다. 계속해서 데이터가 추가 될 경우 처리량과 관련해서 어느순간 한계점에 다다르게 된다.

NoSQL의 단점

  • 데이터 중복으로 여러개의 컬렉션에 동일한 중복된 데이터가 있다. 그렇기 때문에 수정(update)을 해야 하는 경우 모든 컬렉션에서 수행해야 한다. (SQL에서는 중복된 데이터가 없기 때문에 한번만 수행하면 된다.)
  • 유연성 때문에 데이터의 구조 결정을 미루게 될 수도 있다.

 

SQL 기반의 관계형 데이터베이스를 사용하는 경우 

- 관계를 맺고 있는 데이터가 자주 변경(update) 되는 경우 (NoSQL에서라면 여러 컬렉션을 모두 수정해줘야 한다.) 

- 프로젝트의 규모가 많은 서버를 필요로 하지 않고 일관된 데이터를 사용하는 경우 

- SQL을 사용하면 데이터베이스와 상호작용하는 방식을 정확하게 규정할 수 있기 때문에, 데이터베이스에서 데이터를 처리할 때 발생할 수 있는 예외적인 상황을 줄이고, 데이터 무결성을 보호할 수 있다.

 

NoSQL 기반의 비관계형 데이터베이스를 사용하는 경우 

- 정확한 데이터 구조를 알 수 없거나 구조가 변경 / 확장될 가능성이 큰 경우 

- 읽기(read)를 자주하지만, 데이터를 자주 변경(update) 하지 않는 경우

- 막대한 양의 대용량 데이터를 다뤄야 하는 경우, 즉 수평적으로 확장이 필요한 경우  

- 스키마를 미리 준비할 필요가 없기 때문에 빠르게 개발하는 과정에 매우 유리하다.