데이터베이스의 종류

반응형

데이터베이스는 데이터를 저장하고 관리하기 위한 인프라입니다. 일반적으로 데이터베이스라고 하면 가장 먼저 관계형 데이터베이스(RDB)를 떠올리는 경우가 많습니다. 하지만 최근에는 관계형 데이터베이스뿐만 아니라 NoSQL 데이터베이스도 함께 사용하는 경우가 많아졌습니다. 특히 애플리케이션의 요구사항에 따라 서로 다른 데이터베이스를 조합하여 사용하는 사례도 점점 늘어나고 있습니다. 또한 데이터베이스의 종류는 RDB와 NoSQL만 존재하는 것이 아닙니다. 각각의 목적과 특성에 따라 다양한 데이터베이스 유형이 존재합니다.
이번 글에서는 이러한 다양한 데이터베이스 유형에 대해 함께 알아보겠습니다.

 

RDB vs Nosql

크게 DB에는 2가지 종류가 존재합니다. SQL을 사용하는 RDB와 SQL도 사용하는 NoSql(NoSql이 왜 Nosql인지에 대해 sql을 안써서 noSql이다 아니다 Not only sql의 약자라 그렇다라는 말들이 존재합니다. 안 중

b-programmer.tistory.com

이전 글에서는 2가지만 소개했었네요. 그럼 빠르게 RDB랑 NoSQL정리하고 나머지도 학습해봅시다.

가장 잘 알고 있는 관계형 데이터 베이스 RDB부터 알아봅시다.

가장 익숙한 데이터베이스 유형인 관계형 데이터베이스(RDB)부터 살펴보겠습니다.
관계형 데이터베이스에서 가장 중요한 특징 중 하나는 트랜잭션(Transaction)입니다. 트랜잭션은 ACID라는 특성을 기반으로 동작합니다. 이 글에서는 ACID에 대해 자세히 다루지는 않지만, 이러한 특성 덕분에 관계형 데이터베이스는 정확한 데이터 관리가 중요한 서비스에서 널리 사용됩니다. 예를 들어 데이터의 정확성과 일관성이 매우 중요한 영역에서 주로 활용됩니다.

관계형 데이터베이스의 주요 특징으로는 강한 데이터 정합성 보장과 복잡한 쿼리 처리 능력을 들 수 있습니다. 반면, 수평 확장이 상대적으로 어렵고 스키마 변경이 까다롭다는 단점이 있습니다. 이말은 한번 결정하면 수정하기가 굉장히 까다롭다는 뜻이라고 할 수 있습니다.

또한 구조화된 데이터에 최적화되어 있기 때문에 비정형 데이터나 반정형 데이터를 처리하는 데에는 한계가 있을 수 있습니다.

그렇다면 NoSQL은 어떨까? 

관계형 DB의 확장성 문제를 해결하려고 등장하였습니다. 대표적으로 MongoDB, Cassandra, Redis, DynamoDB가 존재합니다.
이들은 관계형 DB와 달리 테이블 구조가 아닌 다양한 형태로 존재합니다.

총 4가지 유형이 존재합니다.

Document DB

NoSQL 데이터베이스의 한 종류로, 데이터를 문서(Document) 형태로 저장하는 데이터베이스입니다. 여기서 말하는 문서는 일반적으로 JSON, BSON, XML 같은 반정형 데이터 구조를 의미합니다.
대표적으로 MongoDB가 존재합니다.

반정형 데이터 구조란?

반정형 데이터는 완전히 고정된 구조는 아니지만, 일정한 형태의 구조를 가지고 있는 데이터를 의미합니다.
즉, 기본적인 구조는 존재하지만 필드가 자유롭게 추가되거나 변경될 수 있어 유연하게 데이터를 표현할 수 있습니다.

이러한 데이터들은 주로 JSON 형태로 표현되고 저장됩니다.

{
  "user": {
    "id": 1,
    "name": "name"
  },
  "status": "active"
}

이러한 JSON 구조 덕분에 Document DB에서는 하나의 문서 안에 다양한 형태의 데이터를 함께 저장할 수 있습니다.

Column DB

NoSQL 데이터베이스의 한 종류로, 데이터를 행(Row)이 아닌 열(Column) 단위로 저장하는 데이터베이스입니다.
관계형 데이터베이스는 데이터를 행 단위로 저장하지만, Column DB는 특정 컬럼을 중심으로 데이터를 저장하기 때문에 대량의 데이터를 조회하거나 분석하는 작업에 유리합니다. 이러한 특징 덕분에 대규모 데이터 처리나 분석 시스템에서 많이 사용됩니다.
대표적인 Column DB로는 Apache Cassandra, HBase 등이 있습니다.

열로 저장을 한다는 것은 무슨 의미일까요?

일반적으로 RDB는 행으로 데이터를 저장합니다.

[1, minzzi, 30]
[2, minsu, 28]

하지만 Colunm DB의 저장 방식은 다릅니다. 

id   → 1, 2
name → minzzi, minsu
age  → 30, 28

여기서 드는 의문은 이게 왜 대량의 데이터를 저장하는데 유리할까요?

Column DB는 각 행마다 컬럼을 따로 두는 것이 아니라 같은 컬럼 데이터를 묶어서 저장하는 방식입니다.
이러한 구조 덕분에 특정 컬럼을 조회할 때 더 효율적으로 데이터를 읽을 수 있습니다.
예를 들어 age가 30 이상인 사람을 조회하는 상황을 생각해 보겠습니다.
관계형 데이터베이스에서는 다음과 같은 쿼리를 사용합니다.

SELECT * FROM users WHERE age >= 30

관계형 데이터베이스는 데이터를 행(Row) 단위로 저장하기 때문에, 실제로는 각 행의 데이터를 읽으면서 그 안에 있는 age 값을 확인하게 됩니다. 즉, name과 같은 다른 컬럼 데이터도 함께 읽게 됩니다.
하지만 Column DB는 다릅니다. Column DB는 컬럼 단위로 데이터를 저장하기 때문에, age 컬럼 데이터만 읽어도 조건을 판단할 수 있습니다. 즉, 필요한 컬럼 데이터만 조회하면 되기 때문에 읽어야 하는 데이터의 양이 줄어들게 됩니다.
이러한 이유로 Column DB는 대규모 데이터 분석이나 로그 처리와 같은 환경에서 높은 성능을 발휘합니다.

Column DB는 데이터 개수가 다른 것이 아니라 저장 방식이 다르며, 특정 컬럼만 읽을 수 있어 분석 쿼리에 유리합니다.

Key-Value DB

Key-Value DB는 NoSQL 데이터베이스의 한 종류로, 데이터를 Key와 Value의 쌍 형태로 저장하는 데이터베이스입니다.
가장 단순한 형태의 데이터 구조를 가지고 있으며, 특정 Key를 통해 Value를 빠르게 조회할 수 있는 특징을 가지고 있습니다.
예를 들어 다음과 같은 형태로 데이터를 저장할 수 있습니다.

user:1 → yonghun
user:2 → minsu

이처럼 Key를 통해 데이터를 바로 조회할 수 있기 때문에 매우 빠른 읽기와 쓰기 성능을 제공합니다.
이러한 특징 덕분에 Key-Value DB는 캐시, 세션 저장, 설정 정보 관리와 같은 용도로 많이 사용됩니다.
대표적인 Key-Value DB로는 Redis, Amazon DynamoDB 등이 있습니다.

graph DB

graph DB는 데이터 간의 관계(Relationship)를 저장하고 조회하는 데 특화된 데이터베이스입니다.
일반적인 데이터베이스가 데이터를 테이블이나 문서 형태로 저장하는 것과 달리, Graph DB는 노드(Node)와 엣지(Edge) 구조를 통해 데이터를 표현합니다.
예를 들어 다음과 같은 관계를 표현할 수 있습니다.

사용자A → 친구 → 사용자B
사용자B → 친구 → 사용자C

여기서 Node : 데이터를 나타내는 객체 Edge : 객체 간의 관계를 의미합니다.
이러한 구조 덕분에 Graph DB는 데이터 간의 복잡한 관계를 빠르게 탐색할 수 있는 특징을 가지고 있습니다.
대표적인 Graph DB로는 Neo4j, Amazon Neptune 등이 있습니다.
이러한 특징 때문에 Graph DB는 다음과 같은 서비스에서 많이 사용됩니다.

  • 소셜 네트워크(SNS)
  • 추천 시스템
  • 사기 탐지 시스템
  • 네트워크 분석

NoSQL 데이터베이스는 크게 Document DB, Column DB, Key-Value DB, Graph DB 네 가지 유형으로 나눌 수 있습니다.
이러한 데이터베이스는 구조가 유연하고 대량의 데이터를 빠르게 처리할 수 있다는 장점을 가지고 있습니다. 하지만 관계형 데이터베이스와 달리 표준화된 쿼리 언어가 존재하지 않는 경우가 많으며, 데이터 일관성이 상대적으로 약할 수 있다는 특징도 가지고 있습니다.
이러한 이유로 NoSQL 데이터베이스는 관계형 데이터베이스를 완전히 대체하기보다는, 특정 용도에 맞게 함께 사용하는 보조적인 데이터 저장소로 활용되는 경우가 많습니다.

새로운 데이터 베이스: New SQL

NewSQL은 관계형 데이터베이스와 NoSQL 데이터베이스의 장점을 결합하려는 목적으로 등장한 데이터베이스 유형입니다. 기존 관계형 데이터베이스는 ACID 트랜잭션을 기반으로 강한 데이터 일관성을 보장하지만, 대규모 분산 환경에서 수평 확장이 어렵다는 단점이 있었습니다. 반면 NoSQL 데이터베이스는 높은 확장성과 성능을 제공하지만, 데이터 일관성이 약해질 수 있다는 특징이 있습니다.

NewSQL은 이러한 문제를 해결하기 위해 등장했습니다.
SQL과 ACID 트랜잭션을 유지하면서도 분산 환경에서 수평 확장이 가능하도록 설계된 데이터베이스라고 볼 수 있습니다.
대표적인 NewSQL 데이터베이스로는 Google Spanner, CockroachDB, TiDB 등이 있습니다.
정리하면, NewSQL은 관계형 데이터베이스의 강한 일관성과 NoSQL의 확장성을 함께 제공하기 위해 등장한 데이터베이스입니다.

하지만 아직까지는 생태계와 인프라가 충분히 성숙하지 않았다는 단점이 있습니다. 이러한 이유로 현재까지는 관계형 데이터베이스와 NoSQL 데이터베이스를 함께 사용하는 방식이 더 널리 사용되고 있습니다.

시계열 데이터베이스는 도대체 뭘까?

시계열 데이터베이스는 시간을 기준으로 생성되는 데이터를 저장하고 분석하기 위해 만들어진 데이터베이스입니다.
여기서 말하는 시계열 데이터란 시간(Time)과 함께 기록되는 데이터를 의미합니다.
예를 들어 다음과 같은 데이터를 생각해볼 수 있습니다.

10:00 CPU 사용률 30%
10:01 CPU 사용률 35%
10:02 CPU 사용률 33%

이처럼 시간의 흐름에 따라 계속 기록되는 데이터를 시계열 데이터라고 합니다.
이러한 데이터는 일반적인 데이터베이스에서도 저장할 수 있지만, 데이터 양이 매우 많고 지속적으로 기록되기 때문에 효율적으로 저장하고 조회하는 데 한계가 있을 수 있습니다.
그래서 등장한 것이 시계열 데이터베이스(Time-Series DB)입니다.

시계열 데이터베이스는 다음과 같은 특징을 가지고 있습니다.

  • 매우 높은 데이터 쓰기 성능
  • 시간 기반 데이터 조회 최적화
  • 데이터 압축 기능
  • 일정 시간이 지나면 데이터를 자동으로 삭제하는 보존 정책(retention policy)

이러한 특징 때문에 시계열 데이터베이스는 다음과 같은 분야에서 많이 사용됩니다.

  • 서버 모니터링
  • IoT 센서 데이터
  • 금융 데이터 분석
  • 로그 및 메트릭 데이터 저장

대표적인 시계열 데이터베이스로는 InfluxDB, TimescaleDB 등이 있습니다.

어째서 시간 데이터를 위한 데이터베이스가 등장했을까요?

관계형 데이터 베이스 데이터는 다음과 같은 특징을 가지고 있습니다.

  • 시간이 지날수록 데이터가 계속 추가됩니다.
  • 대부분 쓰기(Insert) 작업이 많습니다.
  • 기존 데이터를 수정하는 경우는 거의 없습니다.
  • 특정 시간 범위를 기준으로 조회하는 경우가 많습니다.

하지만 일반적인 관계형 데이터베이스는 이러한 데이터 패턴에 최적화되어 있지 않습니다.
데이터가 계속 쌓이게 되면 저장 공간이 빠르게 증가하고, 시간 기반 조회 성능도 점점 떨어질 수 있습니다.
그래서 등장한 것이 시계열 데이터베이스(Time-Series DB)입니다.

결론

이번 글에서는 관계형 데이터베이스, NoSQL, NewSQL, 시계열 데이터베이스와 같은 다양한 데이터베이스 유형에 대해 간단하게 살펴보았습니다. 처음에는 새롭게 알게 된 NewSQL과 시계열 데이터베이스를 중심으로 정리해보려고 했지만, 생각보다 정리할 수 있는 내용이 많지 않았습니다. 반면 NoSQL은 여러 가지 유형(Document, Column, Key-Value, Graph)이 존재하다 보니 자연스럽게 NoSQL에 대한 분량이 더 많아졌습니다. 지금까지 ByteByteGo 글을 읽으면서 주로 아키텍처나 설계와 관련된 내용을 중심으로 학습해 왔지만, 장애 상황에 대한 글들은 아직 많이 읽어보지 못했습니다. 그래서 다음 주부터는 서비스 장애나 시스템 장애와 관련된 글들을 중심으로 학습해볼 계획입니다.

하나의 데이터베이스가 모든 문제를 해결할 수는 없기 때문에, 서비스의 특성과 요구사항에 맞게 적절한 데이터베이스를 선택하는 것이 중요하다고 생각합니다.

출처
https://blog.bytebytego.com/p/understanding-database-types

반응형

댓글

Designed by JB FACTORY