[Back-end] SQL과 NoSQL

Geun·2022년 3월 16일
0

Back-end

목록 보기
26/74
post-custom-banner

MySQL과 같은 SQL을 사용할지, MongoDB와 같은 NoSQL을 사용할지 어떻게 정할까?
프로젝트에 적합한 데이터베이스를 선택해야 할 것이다.
그러기 위해서 SQL과 NoSQL에 대해서 알아보자.

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

SQL(Structed Query Language)는 데이터베이스 자체를 나타내는 것이 아니라 특정 유형의 데이터베이스와 상호작용하는데 사용하는 쿼리 언어이다.
SQL을 사용하면 관계형 데이터베이스 관리시스템(RDBMS)에서 데이터를 저장, 수정, 삭제, 검색 할 수 있다.

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

  • 데이터는 정해진 데이터스키마(Structure)를 따라 데이터베이스 테이블에 저장된다.
  • 데이터는 관계를 통해서 연결된 여러 개의 테이블에 분산된다.

엄격한 스키마

데이터는 테이블에 레코드로 저장되는데 각 테이블마다 명확하게 정의된 구조가 있다.
해당 구조는 필드의 이름과 데이터 유형으로 정의된다.
그렇기 때문에 스키마를 준수하지 않은 레코드는 테이블에 추가할 수가 없다.
스키마를 수정하지 않는 이상 정해진 구조에 맞는 레코드만 추가 가능한 것이 데이터베이스의 특징들 중 하나다.

관계

데이터의 중복을 피하기 위해 관계를 이용한다.

하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어진다는 장점이 있다.


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

NoSQL은 기본적으로 SQL과 반대되는 접근방식을 따른다.
스키마도 없고 관계도 없다.

NoSQL에서는 레코드를 문서(documents)라고 부른다.

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

문서는 JSON과 비슷한 형태를 가지고 있다.
관계형 데이터베이스처럼 여러 테이블에 나누어 담지않고 관련 데이터를 동일한 컬렉션에 넣는다.

따라서 SQL에서 Orders, Users, Products 테이블로 나눈 것을 NoSQL에서는 Orders에 한곳에 포함하여 저장하게 된다.

여러 테이블에 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 NoSQL이다.
(NoSQL에는 조인이라는 개념이 없다.)

NoSQL에서 조인하고 싶으면 어떻게 할까?
컬렉션을 통해 데이터를 복제하여 각 컬렉션의 일부분에 속하는 데이터를 정확하게 산출하도록 한다.

하지만 이렇게 하면 데이터가 중복되어 서로 영향을 줄 수 있다.
따라서 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터일 때 NoSQL을 쓰면 효율적이다.

확장

두 데이터베이스를 비교할 때 중요한 확장(Scaling) 개념이 있다.
데이터베이스 서버의 학장성은 수직적 확장수평적 확장으로 나누어진다.

  • 수직적 확장: 데이터베이스 서버의 성능을 향상시키는 것(CPU 업그레이드 같은 것)
  • 수평적 확장: 더 많은 서버가 추가, 데이터베이스가 전체적으로 분산됨을 의미한다.(하나의 데이터베이스에서 작동하나 여러 호스트에서 작동한다.)

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

SQL과 NoSQL

어떤 데이터베이스를 골라야할까?
SQL과 NoSQL 모두 좋은 솔루션이지만 하나만 골라야한다면,
어떤 데이터를 다루는지 어떤 애플리케이션에서 사용되는지를 고려해야한다.

SQL의 장점

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

NoSQL의 장점

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

SQL의 단점

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

NoSQL의 단점

  • 유연성 때문에 데이터 구조 결정을 하지 못하고 미루게 될 수 있다.
  • 데이터 중복은 여러 컬렉션과 문서가 여러개의 레코드가 변경된 경우 업데이트를 해야한다.
  • 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정(Update)를 해야하는 경우 모든 컬렉션에서 수행해야 함을 의미한다. (SQL에서는 중복 데이터가 없기 때문에 한번만 수행해도 된다.)

SQL 데이터베이스 사용이 더 좋을 때

  • 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우

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

NoSQL 데이터베이스 사용이 더 좋을 때

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

  • 읽기를 자주 하지만 데이터 변경은 자주 없는 경우

  • 데이터 베이스를 수평으로 확장해야 하는 경우


제시 방법들 중 하나일 뿐이지 정답이 정해져 있는 것은 아니다.

SQL을 선택해서 복잡한 JOIN문을 만들지 않도록 설계하여 단점을 없앨 수 있고
NoSQL을 선택해서 중복 데이터를 줄이는 방법으로 설계해서 단점을 없앨 수 있다.


참고자료

https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html
https://siyoon210.tistory.com/130

post-custom-banner

0개의 댓글