[데이터베이스] SQL vs NoSQL (관계형 vs 비관계형 데이터베이스)

JANG SEONG SU·2023년 8월 31일
0

데이터 베이스

목록 보기
1/3
post-thumbnail

1. Intro

Spring은 주로 MySQL을, Node.js에서는 주로 MongoDB를 사용하지만, DB의 설정은 단순히 프레임워크에 따라 결정하는 것이 아니다.

SQL(관계형 데이터베이스)와 NoSQL(비관계형 데이터베이스)의 차이를 알고, DB를 선택하는 것이 옳은 방법이다.


2. SQL (관계형 DB)

SQL은 '구조화 된 쿼리 언어 (Structured Query Language)'의 약자이다. 구조화된(Structured) 쿼리는 RDBMS에게만 보낼 수 있는 쿼리 언어를 의미하고, 관계형 DB는 SQL사용이 필수이다. 하지만 SQL관계형 데이터베이스라고 부르기도한다.

관계형 DB의 특징

  • 데이터는 정해진(엄격한) Data Schema에 따라 DB 테이블에 저장된다.
  • 데이터는 관계를 통해서 여러개의 테이블에 분산된다.

이 말들이 잘 이해가 안간다면, 다음 내용을 보자.

엄격한 스키마

데이터는 행과 열이 있는 테이블(table)에 저장되며, 그 테이블은 명확하게 정의된 구조라고 볼 수 있다. 이때 구조는 필드(Column)의 이름과 데이터 유형으로 정의된다.

따라서 스키마를 준수하지 않는 레코드는 추가될 수 없다.

예를 들어 다음과 같은 데이터는 Sale_Price라는 필드가 스키마를 준수하지 않으므로, 레코드에 추가될 수 없다는 것이다.

🔍용어 정리

  • Schema : 데이터베이스에서 사용되는 전체 데이터 구조를 정의하는 개체
  • Table : 데이터를 구성하는 가장 기본적인 단위
  • row(행) = record = tuple 같은 의미

관계

관계형 데이터 베이스의 또다른 핵심은 관계이다.

데이터들을 여러 개의 테이블로 나누어서, 하나의 테이블에서는 데이터들의 중복을 피할 수 있다. 여기서 말하는 중복데이터 정규화에 의해 최소화 되는 그 중복을 의미한다.

정규화에 대해서는 따로 포스팅을 할 예정이지만, 간단히 설명하자면,

이렇게 중복되는 것이 다음과 같이 2개의 테이블로 나누면 더이상 중복 되지 않는다.


3. NoSQL(비관계형 DB)

NoSQL은 말그대로 "No" + "SQL"로, SQL을 사용하지 않는 DB를 의미한다. 정확히 말하자면, 구조화된 쿼리 언어인 SQL뿐만 아니라 다른 것 형태를 사용할 수 있는 "Not only SQL"DB이다.

비관계형 DB의 특징

  • 스키마가 없다.
  • 관계가 없다.

NoSQL의 DB구조는 다음 그림과 같다.

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

SQL과 가장 큰 차이는 SQL은 스키마를 준수하지 않으면 데이터를 추가할 수 없었지만, NoSQL은 다른 구조의 데이터를 동일한 컬렉션(=SQL에서의 테이블)에 추가할 수 있다. 예를 들어, Users에 다음과 같은 데이터를 추가해도 된다는 것이다.

{nickName: "ZZang", gender: "Male"} 

NoSQL의 또 다른 특징의 관계가 없다는 것은 아래 그림으로 짐작할 수 있을 것이다.

SQL에서 1번(id=1)인 Orders 객체를 불러오려면 OrderUsers을 Join하고, OrderProducts을 Join해야 했다. 하지만 NoSQL에서는 Join은 일반적인 방법이 아니고, 컬렉션(=SQL에서의 Table)을 통해 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하게 한다.

즉, Join을 할 필요없이 이미 필요한 모든 것을 갖춘 Document가 추출된다. (NoSQL에서 Join이 불가능한 것은 아님)

NoSQL의 이러한 방식은 데이터가 중복되기 때문에 불안정한 측면이 있다. 위 그림을 에를 들어, Users 컬렉션의 id=1인 document가 수정되었지만, Orders 컬렉션에는 그 수정이 반영되지 않을 위험이 있다. 따라서 특정 데이터를 같이 사용하는 모든 컬렉션에서, 똑같은 데이터 업데이트를 수행해야한다.

그러한 이유로 데이터의 수정이 빈번할 경우 NoSQL은 성능적으로 나쁠 수 있다.

사실 위의 예시는 MongoDB인 Document 모델의 NoSQL을 다룬 것이다. 하지만 NoSQL의 DB 모델은 아래의 그림과 같이 다양하다.

각 모델에 대한 설명은 다루지 않겠다.


4. 수직적 & 수평적 확장(Scaling)

SQL vs NoSQL을 비교할 때, 또 다른 중요한 개념은 확장(Scaling)이다.

수직적 확장(Vertical Scaling)

단순한 데이터베이스 서버의 성능을 향상시키는 것이다. 예를 들어, CPU를 업그레이드 하는 방식이 있다.

수평적 확장(Vertical Scaling)

데이터베이스를 여러 대의 서버 노드에 분산하여 저장하고 처리하는 것을 의미한다. 이를 분산 시스템이라고 부르지만 이 포스팅에서는 깊게 다루지 않겠다.

SQL수직적 확장만 가능하지만, NoSQL수직적, 수평적 확장 모두 가능하다.


5. SQL, NoSQL의 상황 별 선택

SQL과 NoSQL은 모두 훌륭한 DB이다. 두 가지 중 하나를 선택해야 한다면 어떤 데이터를 다루고, 어떤 어플리케이션에서 사용되는지 고려해야 한다.

🟣SQL의 장점

  • 명확하게 정의 된 스키마는 데이터 무결성 보장한다.
  • 관계는 각 데이터의 중복을 제거한다.

🟣NoSQL의 장점

  • 스키마가 없기때문에, 필드 확장에 훨씬 유연하다.
  • Join을 하지 않기 때문에, 데이터를 읽어오는 속도가 빠르다.

🔴SQL의 단점

  • 데이터 스키마는 사전에 계획되어야 하므로, 필드 확장에 유연하지 못하다. (스키마는 나중에 수정하기가 번거롭거나 불가능 할 수 도 있다.)
  • 테이블들 간에 관계로 나누어져 있기 때문에, 데이터를 읽을 때 수 많은 Join 연산이 일어난다. 이는 성능 저하를 일으킬 수 있다.
  • 수평적 확장이 복잡하고 어렵다. 즉 어떤 시점에서 (처리 할 수 있는 처리량과 관련하여) 성장 한계에 직면하게 됩니다.

🔴NoSQL의 단점

  • 유연성으로 인해, 데이터 구조 결정을 하지 못하고 미루게 될 수 있다.
  • 여러 컬렉션에 흩어져 있는 중복된 데이터 중 하나가 수정 되면 나머지들 업데이트 해줘야 한다.

🟨SQL은 언제 사용하면 좋을까?

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

🟧NoSQL은 언제 사용하면 좋을까?

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

profile
Software Developer Lv.0

0개의 댓글