🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
Back
데이터베이스 종류

데이터베이스 종류

1. Key-value Database

데이터를 Key : Value 형태로 저장하는 데이터베이스입니다. 너무 간단해서 실용성이 없어보인다고요? 맞습니다. 그래서 서브용 DB로 많이사용됩니다. 근데 좀 특수한 기능을 가진 redis란 DB가 있습니다.


1.1 종류 : redis

데이터를 하드디스크에 저장하지 않고, 일차적으로 RAM에다가 저장을 해줍니다. 왜냐하면 RAM이 하드보다 몇 백배 빠르니까요. 그래서 redis를 어떤 식으로 활용하냐면, 메인 DB를 하나 두고, 거기서 사람들이 자주 쓰는 데이터들은 redis에 추가로 저장해둡니다.

그 다음 여기 데이터가 필요하면 redis에서 꺼내서 보여줍니다. 그러면 되게 빠른 서비스를 만들 수 있겠죠? 이런 식으로 캐시용의 서브 DB로 활용합니다. 요즘은 redis 하나로 다 할 수 있는 redis 어플도 나와있긴 합니다.


1.2 용도

  • 자주쓰는 데이터 캐싱
  • 채팅을 위한 pub/sub
  • 영상 스트리밍
  • 로그인 기록 저장…

2. Relational Database

데이터를 표 형태로 저장하고 싶으면, 역사와 전통의 관계형 DB(RDBMS)를 쓰면 됩니다.

table(표)를 하나 만들고, 열(column)에 이름을 써두고, 하나의 행(row)마다 데이터를 보관합니다. 엑셀도 관계형 DB라 볼 수 있습니다.


2.1 종류

  • Oracle
  • MySQL
  • PostgreSQL
  • SQL Server
  • MariaDB
  • SQLite
  • Google Cloud Spanner…

관계형 DB는 다양한 곳에서 일반적으로 사용할 수 있다보니, 데이터베이스의 점유율을 보면 상위권은 거의 다 RDBMS입니다.

https://survey.stackoverflow.co/2022/#section-most-popular-technologies-databases


2.2 SQL

RDBMS에 데이터를 넣고 싶으면 SQL(Structured Query Language)이라는 문법을 써야 합니다. 문법 자체는 쉽지만, 관계형 DB가 광적으로 집착하는 것이 있는데, 바로 정규화라는 거에요.

정규화란 데이터 중복이 되면, 이를 다른 테이블의 데이터로 쪼개는 행위를 말합니다. 이것때문에 데이터 출력문법이 길고 복잡해집니다.


2.3 ACID Transaction 기능

기본적으로 Transaction 기능이 들어있어서, 돈 거래 같은 중요하고, 안전하게 구현할 수 있습니다. 실패 시 Rollback(되돌리기)도 가능합니다. 그래서 입출력 속도보다 정확도가 매우 중요한 서비스라면 RDBMS를 사용합니다.


2.4 Relational

Relational DB의 Relational은 수학의 행렬 배울 떄 쓰는 Relation에서 기인했습니다.

  • 관계를 중점으로 다루기엔 어려운 점이 많음
  • 그래서 관계를 중점으로 다루고 싶으면 Graph Database!

3. Graph Database

관계를 주로 DB에 저장하고 싶으면, Graph Database를 사용합니다.


3.1 종류

  • Neo4j
  • OrientDB
  • ArangoDB…

여기서 가장 유명한 DB가 Neo4j입니다.


3.2 Neo4j

Node란 걸 만들고 Node 안에 데이터를 저장할 수 있는데, Node끼리 어떤 관계인지 기록할 수 있습니다. 데이터를 입출력할 떄는 Graph Query Language를 사용합니다. 그래서 자료 간의 관계를 중점적으로 저장하고 싶을 떄 사용합니다.


3.3 용도

  • 비행기 노선
  • SNS 친구관계
  • 코로나 감염경로
  • 추천 서비스…

4. Document Database

그래프 같이 특수한 경우말고,

  • 일반적인 상황에서 쓰는 경우 Relational Database
  • RDBMS보다 자유로운 경우 Document Database

4.1 종류

  • Mongo DB - 가장 유명함
  • Couch DB
  • Cloud Firestore

4.2 Document

Document DB 안에는

  • collection이라는 폴더 같은 거 만들어 두고,
  • 그 안에 document라고 부르는 파일들을 만들어 두고,
  • JSON 형태로 데이터를 저장합니다.
    • JSON 형태 = Key: Value 형태

관계형 DB와 다르게 어떤 데이터를 저장할지 미리 정할 필요도 없습니다. e.g. 갑자기 연락처라는 넣어도 상관없습니다. 즉, 구조가 바뀌어도 신경안씁니다.

그리고 가장 큰 특징은 중복 데이터를 제거를 안합니다. 전문 용어로 정규화를 안한다는 소리입니다.


4.3 용도

그리고 대부분 분산을 염두에 두고 만들어진 DB들이기에 DB를 분산시켜 놓는게 쉽습니다. 그래서 데이터 입출력이 되게 많은 서비스들에 유용합니다.

  • SNS
  • 실시간 채팅
  • 게시판
  • 온라인 게임

근데 DB를 분산해 놓으면 단점 역시 있습니다. DB 간의 정확도, 일관성이 떨어질 수 있습니다.


5. Column-family Database

나는 관계형 DB같이 표 형태로 데이터를 저장하고 싶은데, 조금 유용하게 쓰고 싶다면 Column-family Database를 쓰면 됩니다.


5.1 종류

  • Cassandra : 가장 유명
  • Apache HBASE
  • Google Cloud Bigtable

5.2 Column-family

똑같이 table 만들고, row(행)마다 자유롭게 column(열)을 만들어서 데이터를 넣을 수 있습니다. 데이터를 입출력하려면 SQL이 아니라 각 DB에서 만든 언어를 써야 합니다. Cassandra의 경우, CQL(Cassandra Query Language)를 씁니다. (SQL과 큰 차이없음)

Column-family도 역시 정규화(중복 제거)를 안합니다. 그래서 훨씬 입출력 문법이 쉽습니다. 그리고 분산처리를 잘해줘서 많은 입출력을 감당해야 한다면, 이런 DB를 쓰는 경우도 있습니다. 물론 분산처리해놓으면 데이터 일관성이 떨어지겠죠?

그리고 데이터를 저장할 떄, 시간 기록 기능이 있어서, 시계열 데이터를 저장하고, 분석할 떄, 이 DB를 쓰는 경우가 있습니다. (Netflix에서 이걸로 님들 시청기록 분석함)


6. Search Engine

검색용 인덱스를 보관하기 위한 데이터베이스들도 있습니다.


6.1 종류

  • Elastic Search
  • Amazon CloudSearch
  • Google Cloud Search…

6.2 용도

애네들은 일반적인 데이터베이스로도 사용이 가능은 한데, 주로 index 보관용으로 주로 사용합니다. index가 뭐냐면, 검색을 빠르게 할 수 있게 도와주기 위한 색인, 목차 같은 것들입니다. 기존 DB에다가 데이터를 뽑아서 여기다 입력을 하면, 애가 index를 생성, 보관해주고 그런 역할을 합니다.

검색 요청이 들어오면, 인덱스를 이용해서 자료를 되게 쉽게 검색해주고, 부가적으로 실시간 검색어 추천, 검색어 오타교정같은 것들도 지원합니다. 그래서 검색이 중요한 사이트를 만들 떄, 이런 것들을 가져다 쓰는 경우가 많습니다.


7. 전체 요약

일반적인 용도 (확장 방법에 따라 아닐 수도 있음)

  • Relational Database : 정확도와 일관성이 중요하면
  • Document Database : 정확도 필요없고, 입출력이 매우 잦으면