NoSQL vs SQL

NoSQL vs SQL

데이터베이스(Database, DB)

SQL과 NoSQL에 대해 알기 전, 데이터베이스에 대한 이해가 필요하다.

데이터베이스란?

데이터베이스란 데이터의 집합으로, 데이터를 쉽게 접근, 업데이트 등을 할 수 있도록 한다.

데이터베이스 관리 시스템(Database Management System, RDBMS)

데이터베이스를 관리하기 위해 데이터베이스 관리 시스템을 사용한다. 데이터베이스란 원론적으로는 데이터베이스의 모음을 말하지만, 데이터를 조직하는 유형별로 혹은 DBMS 솔루션까지 데이터베이스라고 칭한다.


데이터베이스의 유형에는 관계형 데이터베이스(Relational DataBase Management System, RDBMS)와 NoSQL 데이터베이스가 있다. 관계형 데이터베이스는 SQL을 사용하고 NoSQL 데이터베이스에서는 NoSQL을 사용한다.

지금부터 NoSQL과 SQL의 차이점에 대해 알아보자

SQL

image

관계형 데이터베이스란, 고정된 열과 행을 구성된 테이블에 데이터를 저장하는 방식을 말한다. 관계형 데이터베이스를 사용할 때는 테이블의 구조와 데이터 타입을 명시하여 사용해야 한다.

관계형 데이터베이스를 관리하는 시스템을 RDBS라고 한다.

관계형 데이터베이스

  • MySQL
  • Oracle
  • SQlite
  • MariaDB
  • PostgreSQL

각 시스템의 특징은 다음에 이어서 공부해보고자 한다. :)

SQL은 RDBMS의 데이터를 관리하기 위해 설계된 특수 프로그래밍 언어다. 즉, RDBMS의 전용 프로그래밍 언어라고 할 수 있다!

image 관계형 데이터베이스에서는 테이블마다 명확한 스키마가 있고, 데이터 중복을 방지하기 위해 각 테이블은 관계를 가진다. 따라서 RDBMS는 데이터의 무결성을 보장한다.

데이터의 무결성

데이터의 정확성, 일관성, 유효성이 유지되는 것

NoSQL

image

비관계형 데이터베이스란, 관계형 데이터베이스를 제외한 나머지를 말한다. 따라서 비관계형 데이터베이스를 NoSQL이라고 한다. 관계헝 데이터베이스에서는 데이터를 입력할 때 스키마에 맞춰 입력해야 하지만, 비관계형 데이터베이스에서는 데이터를 읽어올 때만 스키마에 따라 데이터를 읽어온다. 이러한 방식을 schema or read라고 한다.

일반적으로 NoSQL에서는 스키마도 없고, 관계형도 없기 때문에 관계형 데이터베이스처럼 Products, Sales를 나눠서 저장하지 않고 하나의 컬렉션 안에 모든 데이터를 넣어 저장한다.

비관계형 데이터베이스

  • Redis
  • Mongo DB
  • Apache Casandra
  • Neo4J

각 시스템의 특징은 다음에 이어서 공부해보고자 한다 :)

image 그러면 조인하고 싶을 때, NoSQL에서는 어떻게 할 수 있을까? 위 그림처럼, 한 컬렉션에서 조인하고자 하는 데이터의 일부분을 복제해서 넣어주어야 한다. 그러면, 컬렉션의 일부분에 속하는 데이터를 산출할 수 있다.

하지만 해당 방법은 데이터가 중복되기 때문에 불안정한 측면이 있다. 예를 들면, Products 컬렉션의 데이터는 수정했는데, Sales의 product를 수정하지 않았을 경우에는 제대로 된 조인이 불가능하기 때문이다.

NoSQL의 가장 큰 장점은 복잡한 조인을 사용할 필요가 없다는 것이다. 모든 데이터가 이미 하나의 컬렉션 안에 저장되기 때문이다. 자주 변경되지 않는 데이터일 경우에는 NoSQL을 사용하는 것이 유리하다.

그렇다면, SQL와 NoSQL은 언제 사용하는 것이 가장 적합할까?

SQL vs NoSQL

SQL 장점

  • 명확하제 정의된 스키마를 사용하기 때문에 데이터 무결성을 보장한다.
  • 각 테이블 간 관계를 설정할 수 있기 때문에 데이터를 중복 없이 저장할 수 있다.
  • ACID(Atomicity, Consistency, Isolation, Durability) 속성을 완벽히 지원하여, 안전한 데이터 처리를 보장한다.

ACID(Atomicity, Consistency, Isolation, Durability)

ACID(원자성, 일관성, 고립성, 지속성)란, 데이터베이스의 transaction이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다.

Transaction

트랜잭션이란, 여러 개의 작업을 하나로 묶은 실행 유닛을 말한다. 즉, 여러 개의 작업이 실행될 때 모두 완료되어야 정상적으로 종료되며, 하나라도 제대로 처리되지 않으면 모든 작업을 실패 처리한다.

SQL 단점

  • 데이터 스키마를 사전에 정의해야하고, 이후에는 수정이 어렵다.
  • 테이블 간의 관계가 많아질수록 복잡한 쿼리가 만들어질 수 있다.
  • 수평적 설계를 진행할 수 없기 때문에 대규모 분산 시스템에는 적절하지 않을 수 있다.

NoSQL 장점

  • 스키마를 사용하지 않기 때문에 유연하게 확장이 가능하다.
  • 언제든 데이터를 조정하고 새로운 필드를 추가할 수 있다.
  • 수평적 확장을 하기 때문에 대규모 데이터를 처리할 때 적합하다.

NoSQL 단점

  • 데이터 중복을 계속 업데이트 해야 한다.
  • 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수정해야 한다.
  • 복잡한 쿼리를 거의 지원하지 않아 복잡한 쿼리 수행이 어려울 수 있다.

SQL을 사용하면 효율적인 경우

  • 정확한 데이터 구조가 필요할 경우
  • 관계를 맺고 있는 데이터들이 자주 변경되는 경우
    • NoSQL을 사용하면 데이터가 변경될 때마다 관련 데이터를 수정해야하기 때문에 비효율적이다.
  • 데이터의 일관성이 요구되는 경우
    • SQL은 트랜잭션을 지원하기 때문에, 데이터의 일관성을 요구한다면 SQL을 사용하는 것이 효율적이다.

NoSQL을 사용하면 효율적인 경우

  • 정확한 데이터 구조를 알기 어렵거나, 변경/확장될 가능성이 있는 경우
  • 많은 양의 데이터를 다뤄야 하는 경우
  • 단순 조회나 키-값 접근이 많은 경우

어떤 데이터베이스를 선택할지 결정할 때는 어플리케이션의 특정 요구사항에 따라 결정해야 한다. 데이터의 복잡성, 쿼리의 종류, 데이터 일관성의 중요성, 확장성 요구사항의 측면을 고려해야한다.