관리 메뉴

제뉴어리의 모든것

1강 정리 - 다양한 데이터베이스의 특징 본문

2월 프리온보딩 백엔드 챌린지

1강 정리 - 다양한 데이터베이스의 특징

제뉴어리맨 2023. 2. 16. 17:04

데이터베이스란

여러 사람들과 공유를 목적으로 관련된 데이터들을 모아놓은 데이터의 집합.

 

데이터베이스의 특징

  • 실시간 접근성
    사용자의 질의(쿼리)에 대해 실시간으로 응답을 하여야 한다.
  • 지속적인 변화
    데이터의 생성, 수정, 삭제로 인해 지속적으로 최신 데이터를 유지해야한다.
  • 동시 공유
    사용자들이 원하는 데이터를 동시에 공유하며 사용이 가능하여야 한다.
  • 내용에 대한 참조
    사용자가 데이터를 참조(읽으려할때) 하려고 할때, 데이터가 메로리상 존재하는 실제 주소값으로 찾아내는 것이 아니라 데이터(내용)으로 찾아낼 수 있어야 한다.
    EX) where절에 원하는 데이터의 주소값이 아닌 데이터(내용)을 기입하려 찾듯이..
  • 데이터 논리적 독립성
    데이터는 데이터가 사용되는 응용프로그램과 별개로 독립적으로 존재하여야 한다.

 

SQL

  • DDL
    데이터 정의 언어
  • DML
    데이터 조작 언어
  • DCL
    데이터 제어 언어

 

데이터 베이스의 종류

  • 관계형 데이터베이스
    • 데이터의 구조가 row, column으로 이루어진 table 형태의 데이터베이스
    • SQL을 사용하여 데이터의 생성, 수정, 삭제를 진행
    • MySQL, Oracle, Postre 등이 해당
  • key-value 데이터베이스 (NoSQL)
    • 데이터가 key-value 를 한쌍으로 이루어진 형태의 데이터베이스
    • key는 unique한 값이여야 하며, 동일한 key로 데이터를 저장할시 value가 덮어쓰기 됨
    • Redis, AWS DynamoDB, Riak, Oracle Berkely 등이 해당
    • 사용되는 곳
      • cache
      • message broker -> pub/sub
        Redis에서 사용 가능.
        Redis가 메세지큐 같은 역할을 함. 일종의 채팅 서버역할을 한다고 보면 됨.
        Redis 클라이언트가 특정한 채널을 구독하면, 해당 채널로 들어오는 메세지들을 받을 수 있는 것이다.
        채널은 그냥 구독을 하는 순간 생성됨. 그리고 특정 Redis 클라이언트로 특정 채널에 메세지 전달을 하면, 해당 채널을 구독하는 클라이언트들에게 모두 메세지가 전달 됨.
        다만 메세지 전송 수신에 대한 보장이 이루어지지 않음. 그러므로 굉장히 가벼운 프로토콜 체계를 가지고 있다고 보면 된다. 그러므로 현재 접속 중인 클라이언트에게 짧고 간단한 메시지를 빠르게 보내고 싶을 때, 그리고 전송된 메시지를 따로 저장하거나 수신확인이 필요 없을 때, 마지막으로 100% 전송 보장은 하지 않아도 되는 데이터를 보낼때 이용하면 괜찮다.
  • graph
    • 데이터를 graph의 형태로 저장
    • 각 데이터 항목이 node, 데이터(node)간의 관계는 edge를 사용하여 나타냄
    • 엣지는 시작 노드, 종료 노드가 있다. 즉, 방향을 가지고 있다
    • 데이터간의 관계를 만들어야 하고, 데이터를 추출할때 관계된 데이터들을 쿼리로써 뽑아내야 할 때, 자주 사용됨.
      EX : SNS, 추천엔진 등등
    • Neo4j, OrientDB등이 해당

  • document
    • 스키마가 정해져 있지 않은 자유로운 구조
    • key-value로 저장하지만 key-value 데이터베이스와 달리 value에는 어떠한 타입이 와도 상관 없음
      특정 key에 대응되는 value로 document 자체가 될 수도 있음
    • JSON, XML 형태의 데이터도 값으로 저장 가능
    • 데이터베이스 별로 조작할 수 있는 언어가 따로 있음
    • 한 토픽의 게시물이 존재하고, 해당 토픽 안에는 여러 타입의 데이터가 들어갈 수 있고(동영상, 그림, 텍스트), 안들어 갈 수 도 있을때 
    • MongoDB, CassandraDB, Couchbase 등이 해당

 

 

Row-oriented DB vs Column-oriented DB

데이터 저장 방식이 행 중심의 저장 방식인지, 열 중심의 저장 방식인지에 따라 DB의 특성과 장,단점이 달라진다.

 

아래의 기본 테이블을 기준으로 보도록

기본 테이블

  • Row-oriented DB
    데이터가 행을 기준으로 순차적으로 쌓이는 방식의 DB를 말한다.
    즉, 기본 테이블에서 각 행을 기준으로 메모리에 순차적으로 쌓이게 된다.
    그러므로, 기본 테이블에 새로운 행이 추가되면 실제 메모리상에서는 행만큼이 기존 데이터에 끝에 붙게 되는 것이다.
    대표적인 Row-oriented DB로는 MySQL, Postgres가 있다.
    • 장점
      데이터 추가시 실제 메모리상에 끝에만 새 데이터를 추가해주면 되므로 저장 속도가 빠르다
      OLTP (Online transactional Processing) 스타일 애플리케이션에 최적화 되어 있다.
    • 단점
      행 단위로 데이터를 읽어오는 것은 빠르지만, 특정 데이터간의 집합을 만들어 연산하는 경우에는 속도 저하가 발생된다. 왜냐하면 일반적으로 그냥 데이터를 읽을 경우 순차적으로 그냥 쭉쭉 읽으면 되지만, 만약 나이 컬럼의 평균을 내고 싶다면, 나이 컬럼만 읽으면 되지만 데이터가 행 단위로 순차적으로 저장되어 있기 때문에 각 레코드의 나이 컬럼을 찾기 위해선 불필요하게 순차적으로 모든 컬럼들을 조회하여 도달하여야 하기 때문이다.

 

 

 

 

 

  • Column Oriented DB
    데이터가 열 기준으로 순차적으로 쌓이는 방식의 DB를 말한다.
    즉, 메모리상에 한 컬럼의 데이터가 쭉 순차적으로 쌓이고, 이어서 다음 컬럼의 데이터가 순차적으로 쭉 쌓이는 방식인 것이다. 대표적인 Column-oriented DB로는 Redshift, BigQuery, Snowflake 가 있다.
    • 장점
      통계 쿼리 같은것을 사용할때 이점이 있다.
      한 필드의 모든 데이터가 순차적으로 저장되어 있기 때문에, 불필요하게 다른 컬럼들을 읽을 필요가 없다.
      OLAP (Online Analytical Processing) 스타일 용도에 최적화 되어 있다.
    • 단점
      모든 데이터(한 테이블의내의 모든 데이터) 가 같은 메모리 공간에 저장될 경우, 데이터 삽입시(레코드 삽입) 결국 각 열 데이터의 마지막 위치값을 조회하여 각 위치 다음에 레코드의 각 열 데이터를 추가해 주어야 하기 때문에 모든 데이터를 스캔하여야 한다. 하지만 이러한 점은 각 열마다 저장되는 메모리 공간을 분리함으로써 해결 가능하다.


 

 

 

 


 

참조

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

http://www.tcpschool.com/mysql/DB

https://jaemunbro.medium.com/nosql-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B9%EC%84%B1-%EB%B9%84%EA%B5%90-c9abe1b2838c

Redis Pub/Sub

http://redisgate.kr/redis/command/pubsub_intro.php

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC

graph

https://aws.amazon.com/ko/nosql/graph/