# SQL vs NoSQL

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

SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있습니다.

  • 데이터는 정해진 데이터 스키마에 따라 테이블에 저장됩니다.
  • 데이터는 관계를 통해 여러 테이블에 분산됩니다.

image

  • 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없으며, 스키마를 수정하지 않는 이상은 정해진 구조에 맞는 레코드만 추가가 가능한 것이 관계형 데이터베이스의 특징 중 하나입니다.
  • 데이터의 중복을 피하기 위해 '관계'를 이용합니다.
  • 하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에 다른 테이블에서 부정확한 데이터를 다룰 위험이 줄어듭니다.

# NoSQL

NoSQL은 기본적으로 SQL(관계형 데이터베이스)와 반대되는 접근방식을 따르기 때문에 지어진 이름입니다.

  • 스키마 없음
  • 관계 없음

image

  • NoSQL에서는 레코드를 문서(documents)라고 부릅니다.
  • SQL은 정해진 스키마를 따르지 않으면 데이터 추가가 불가능했지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가할 수 있습니다.
  • 문서(documents)는 Json과 비슷한 형태이며, 관계형 데이터베이스처럼 여러 테이블에 나누어담지 않고, 관련 데이터를 동일한 '컬렉션'에 넣습니다.
    • 따라서 여러 테이블 / 콜렉션에 조인(join) 할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하게 됩니다. (만약 조인을 하고 싶다면 직접 해당 외래키를 검색하여 사용할 수 있겠지만 일반적인 방법은 아닙니다.) 데이터가 중복되어 서로 영향을 줄 위험이 있기에 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터일 때 NoSQL을 쓰면 상당히 효율적입니다.

# 수직적(Vertical) & 수평적(Horizontal) 확장(Scaling)

확장은 수직적(vertical) 확장과 수평적(horizontal) 확장으로 구별 할 수 있습니다.

  • 수직적 확장이란 단순히 데이터베이스 서버의 성능을 향상시키는 것입니다.
  • 반면에 수평적 확장은 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미합니다. 따라서 하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동합니다.

image

  • 데이터가 저장되는 방식 때문에 SQL 데이터베이스는 일반적으로 수직적 확장만을 지원합니다. 수평적 확장은 NoSQL 데이터베이스에서만 가능합니다.

# SQL의 장점

  • 명확하게 정의된 스키마, 데이터 무결성 보장
  • 관계는 각 데이터를 중복없이 한 번만 저장됩니다.

# NoSQL의 장점

  • 스키마가 없기때문에, 훨씬 더 유연합니다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 "필드"를 추가 할 수 있습니다.
  • 데이터는 애플리케이션이 필요로 하는 형식으로 저장됩니다. 이렇게 하면 데이터를 읽어오는 속도가 빨라집니다.
  • 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기 / 쓰기 요청을 처리 할 수 있습니다.

# SQL의 단점

  • 상대적으로 덜 유연합니다. 데이터 스키마는 사전에 계획되고 알려져야 합니다.
  • 관계를 맺고 있기 때문에, JOIN문이 많은 매우 복잡한 쿼리가 만들어 질 수 있습니다.
  • 수평적 확장이 어렵고, 대체로 수직적 확장만 가능합니다. 즉 어떤 시점에서 (처리 할 수 있는 처리량과 관련하여) 성장 한계에 직면하게 됩니다.

# NoSQL의 단점

  • 유연성 때문에, 데이터 구조 결정을 하지 못하고 미루게 될 수 있습니다.
  • 데이터 중복은 여러 컬렉션과 문서들이 데이터가 변경된 경우 업데이트 되어야 합니다.
  • 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정(update)를 해야 하는 경우 모든 컬렉션에서 수행해야 함을 의미합니다.

# SQL은 언제 사용?

  • 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우
  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

# NoSQL은 언제 사용?

  • 정확한 데이터 구조를 알 수 없거나 변경 / 확장 될 수 있는 경우
  • 읽기(read)처리를 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 (한 번의 변경으로 수십 개의 문서를 업데이트 할 필요가 없는 경우)
  • 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)

# 참고자료