NoTimeForDawdling

SQL vs NoSQL 본문

DB

SQL vs NoSQL

Room_Energy 2021. 3. 14. 16:40

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

SQL은 구조화된 쿼리 언어(Structured Query Language)의 약자로 데이터베이스 자체를 나타내는 것이 아니라, 특정 유형의 데이터베이스와 상호 작용하는데 사용하는 쿼리 언어를 말합니다.

 

즉, SQL은 관계형 DB가 아닌 관계형 DB를 설계하는데 사용되는 언어입니다.

SQL의 두 가지 주요 특징

  • 데이터는 엄격한 데이터 스키마(structure)를 따라 데이터베이스 테이블에 저장됩니다.

  • 데이터는 관계를 통해서 연결된 여러 개의 테이블에 분산됩니다.

1. 엄격한 스키마

데이터는 테이블(table)에 레코드(record)로 저장되며, 각 테이블에는 명확하게 정의된 구조(structure)가 있습니다.

구조는 필드의 이름과 데이터 유형으로 정의됩니다. (관계형 데이터베이스에서) 스키마를 준수하지 않는 레코드는 추가할 수 없습니다.

 

만약, 더 많은 필드를 얻고 싶다면 다른 테이블을 선택해야 합니다.

2. 관계를 통한 분산

데이터들을 여러개의 테이블에 나누어서, 데이터들의 중복을 피할 수 있습니다.

 

만약 사용자가 구입한 상품들을 나타내기 위해서 여러 테이블(User, Prodect, Order)을 만들어야 하지만, 각각의 테이블들은 다른 테이블에 저장되지 않은 데이터 만을 가지고 있습니다. (중복된 데이터가 없다!)

 

하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없습니다.

 

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

NoSQL은 확장 가능한 성능 및 스키마가 없는 데이터 모델에 최적화된 비관계형 데이터베이스입니다.

주요 특징으로는 스키마 없으며, 관계(relation) 또한 없습니다.

 

스키마가 없기 때문에, NoSQL에서는 다른 구조의 데이터를 같은 테이블에 추가할 수 있습니다. 그래서 어떤 형식으로 데이터를 저장해야 할지 확신이 서지 않는 상황에서 NoSQL을 많이 사용합니다.

 

또한, NoSQL은 기존 RDBMS보다 더 큰 규모와 더 빠른 응답성이 필요한 많은 양의 빅데이터, 모바일 및 웹 애플리케이션에 매우 적합합니다.

 

참고로 NoSQL 데이터베이스는 조인이라는 개념이 존재하지 않습니다.

만약 다른 컬렉션의 값이 필요하다면 컬렉션의 데이터를 일부 복제합니다. 그렇기 때문에 컬렉션별로 중복된 데이터가 존재합니다.

 

SQL(수직적)과 NoSQL(수평적)의 확장성

데이터의 확장은 수직적(Vertival), 수평적(Horizontal) 확장으로 나눌 수 있습니다.

SQL(수직적 확장)

  • SQL은 수직적으로 확장합니다.

  • 수직적 확장은 단순히 데이터베이스 서버의 성능을 향상시키는 것입니다. (CPU, RAM과 같은 성능 업그레이드)

NoSQL(수평적 확장)

  • NoSQL은 수평적으로 확장합니다.

  • 수평적 확장은 서버 대수를 확장시켜, 데이터베이스가 전체적으로 분산되는 것을 의미합니다.

 

SQL과 NoSQL 장단점

SQL의 장점

  • 명확하게 정의 된 스키마 및 데이터 무결성을 보장합니다.

  • 관계는 각 데이터를 중복없이 한번만 저장됩니다.

NoSQL의 장점

  • 스키마가 없기때문에, 훨씬 더 유연합니다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가 할 수 있습니다.

  • 데이터는 애플리케이션이 필요로 하는 형식으로 저장됩니다. 이렇게 하면 데이터를 읽어오는 속도가 빨라집니다.

SQL의 단점

  • 유연하지 않습니다. 데이터 스키마는 사전에 계획되고 알려져야 합니다.(나중에 수정하기 힘듬)

  • JOIN문이 많은 매우 복잡한 쿼리가 만들어 질 수 있습니다.

  • 수평적 확장이 어렵고, 대체로 수직적 확장만 가능합니다. 즉, 어떤 시점에서 성장 한계에 직면하게 될 수 있습니다.

NoSQL의 단점

  • 유연성 때문에, 데이터 구조 결정을 하지 못하고 미룰 수 있습니다.

  • 데이터 중복은 여러 컬렉션과 문서가(SQL처럼 하나의 테이블에 하나의 레코드가 아니라)여러 개의 레코드가 변경된 경우 업데이트를 해야 합니다.

  • 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정(update)를 해야 하는 경우 모든 컬렉션에서 수행하야 함을 의미합니다.(SQL은 중복된 데이터가 없기 때문에 한번만 수정하면 됨)

SQL을 사용하면 좋을 때

  • 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우

  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

NoSQL을 사용하면 좋을 때

  • 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우

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

  • DB를 수평적으로 확장해야 하는 경우(즉, 막대한 양의 데이터를 다뤄야 하는 경우)

참고

'DB' 카테고리의 다른 글

[DB] Connection Pool  (0) 2021.06.23
SQL Injection이란?  (0) 2021.03.24
DB 데이터 캐싱(Caching)  (0) 2021.03.11
ORM(Object Relation Mapping)이란?  (0) 2021.03.10
DB 인덱스(Index)  (0) 2021.03.04