관계형 데이터베이스와 NoSQL 데이터베이스의 종류에 대해 알아봅니다.
데이터베이스
: 전자적으로 저장되고 체계적인 데이터 모음데이터베이스 관리 시스템(DBMS)
: 데이터베이스를 운영하고 관리하는 소프트웨어SQL
: Structured Query Language'의 약자로, 데이터베이스에서 데이터를 추출하고 조작하는 데에 사용하는 데이터 처리 언어
데이터베이스는 구조화된 정보 또는 데이터의 조직화된 모음으로써 컴퓨터 시스템에 전자적으로 저장되며, 일반적으로 DBMS에 의해 제어된다.
데이터베이스는 크게 관계형 데이터베이스(RDBMS)와 NoSQL 두 가지 주요 유형으로 분류된다.
*출처: https://db-engines.com/en/ranking
- 해당 순위 지표
- 웹 사이트 언급 횟수
- 검색 빈도
- 기술 토론 빈도
- DBMS별 구인
- 전문가 인맥
항목 | NoSQL DB | 관계형 DB |
---|---|---|
적합업무 | - 오프라인에서 정형 및 비정형 데이터 분석 업무- 초당 동시 처리가 중요한 업무 - 로그 및 이력 등의 단순 기록형 업무 |
- 데이터 무결성 및 일관성이 중요한 트랜잭션 업무 - 온라인에서 다양한 집계 및 통계를 분석하는 업무 - 복잡한 계산 및 실시간 데이터 정합성이 필요한 업무 |
데이터 모델 | - 서비스에 맞는 DB 선택이 중요함 - 반정 규화에 의한 설계를 기본으로 함 - 비정형화 스키마 구조로 미리 스키마를 선언하지 않음 |
- 엔티티 및 각 엔티티 간 관계를 정의함 - 엔티티 정의 시 정규화에 의한 설계가 중요함 - 테이블, 칼럼 등 DB요소에 대한 스키마를 엄격히 관리함 |
성능 | - 클러스터 크기, 네트워크 및 애플리케이션에 의해 성능이 결정됨 | - 성능 향상을 위해서는 성능 최적화 작업이 필요함 |
인터페이스 | - 쿼리 외 다양한 API를 통한 데이터 저장 및 검색이 가능함 | - SQL을 통해서만 데이터 저장 및 검색이 가능함 |
장점 | - 쿼리 프로세싱이 단순화되어 대용량 데이터 처리 성능이 향상됨 | - 데이터 중복 배제로 데이터 이상 발생 및 용량 증가를 최소화함 |
단점 | - 데이터 중복에 의해 데이터 일관성이 저하되고 용량이 증가함 | - 조인이 복잡한 경우 쿼리 프로세싱도 복잡해져 성능이 저하됨 |
- 의미: 데이터를 행과 열을 가지는 테이블 형태로 구조화하여 관리하는 데이터베이스
- 종류: MySQL, PostgreSQL, 오라클, SQL Server, MSSQL
- 언어: 표준 SQL 언어를 사용하지만, 각각의 제품에 특화시킨 SQL을 사용한다.
- 예시: 오라클(PL/SQL), SQL server(T-SQL), MySQL(SQL)
-
개요
- 대부분의 운영체제와 호환되며, 현재 가장 많이 사용하는 오픈소스 데이터베이스이다.
- C, C++로 만들어졌으며, 대용량 데이터베이스를 위해 설계되었다.
- 클라이언트-서버 모델을 통해 동작한다.
- 소유주: 오라클
-
특징
- 데이터 저장 형식: 고정된 행과 열 기반의 테이블
- 쿼리: SQL
- 스키마: 정적 스키마(미리 저장된 데이터 구조에 따라 데이터 저장)
- e.g. key는 int타입으로 지정했다면 float 타입인 3.5가 저장될 수 없다.
- 외래키 지원: 외래키를 기반으로 테이블 간 관계를 맺을 수 있다.
- 트랜잭션 격리수준(기본): REPEATABLE*READ(중간 정도의 격리 수준) *격리 수준 관련 문서: 3. 트랜잭션과 무결성
- 기본키 설정: 기본키가 자동 설정되지 않는다.
- 기본 스토리지 엔진: innoDB 엔진 (사용자가 바꿀 수 있음)
-
이외 기술적 특징
- MyISAM 인덱스 압축 기술
- B-트리 기반의 인덱스
- 스레드 기반의 메모리 할당 시스템
- 매우 빠른 조인
- 최대 64개의 인덱스
- 롤백, 커밋, 이중 암호 지원 보안 등의 기능
- 쿼리 캐시 지원: 쿼리 문에 대한 전체 결과 집합을 저장하기에 사용자가 작성한 쿼리가 캐시에 있는 것과 동일하다면 서버는 캐시의 출력을 바로 표시한다.
- 수평적 확장이 어렵다. (숙련도에 따라 다를 수 있음)
-
MySQL 스토리지 엔진 아키텍처
-
스토리지 엔진
- 실제 데이터를 디스크 스토리지에 저장하거나, 디스크 스토리지로부터 데이터를 읽어오는 부분을 전담한다.
- 모듈식 아키텍처로 쉽게 스토리지 엔진을 바꿀 수 있다.
- MySQL 서버에서 스토리지 엔진은 여러 개를 동시에 사용할 수 있다.
- 데이터 웨어하우징, 트랜잭션 처리, 고가용성 처리에 강점을 두고 있다.
- 스토리지 엔진 위에는 커넥터 API 및 서비스 계층을 통해 쉽게 상호작용이 가능하다.
데이터 웨어하우스: 사용자의 의사 결정에 도움을 주기 위하여 기간시스템의 데이터베이스에 축적된 데이터를 공통의 형식으로 변환해서 관리하는 데이터베이스
고가용성: 서버, 네트워크, 프로그램 등의 정보 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질
-
-
MySQL의 장점
- 오픈 소스: MySQL은 오픈 소스이므로 무료로 사용할 수 있다.
- 커뮤니티 지원: MySQL은 가장 널리 사용되는 RDBMS 중 하나로 개발자, 사용자 및 기여자로 구성된 방대하고 활발한 커뮤니티를 가지고 있다.
- 다양한 플랫폼 지원: MySQL은 다양한 운영 체제와 플랫폼에서 사용할 수 있습니다.
- 확장성: MySQL은 공유, 복제 및 클러스터링과 같은 기능을 통해 수직 및 수평(여러 서버에 걸쳐 데이터 분산)으로 효율적으로 확장할 수 있다.
- 성능: MySQL은 특히 읽기가 많은 애플리케이션에서 높은 성능으로 유명하다. 대규모 데이터 세트에서도 빠른 응답 시간을 제공하기 위해 인덱싱, 캐싱 및 쿼리 최적화와 같은 다양한 최적화 기술을 사용한다.
- 신뢰성: MySQL은 신뢰성과 안정성으로 유명하다. ACID(Atomicity, Consistency, Isolation, Durability) 준수, 트랜잭션 지원, 충돌 복구 메커니즘 등의 기능을 통해 데이터 무결성을 보장하므로 미션 크리티컬 애플리케이션에 적합하다.
-
MySQL의 단점
- 제한된 기능: MySQL은 기능이 풍부하지만 다른 엔터프라이즈 수준 데이터베이스에 비해 일부 고급 기능이 부족할 수 있다. 예를 들어, 추가 플러그인이나 확장 없이 복잡한 데이터 유형, 전체 텍스트 검색 또는 고급 분석 기능을 내장 지원하지 않을 수 있다.
- 확장성 문제: MySQL은 확장성 옵션을 제공하지만 대규모 MySQL 배포를 관리하고 확장하려면 복잡할 수 있으며 데이터베이스 관리 및 성능 튜닝에 대한 전문 지식이 필요할 수 있다. 특히 수평적 확장은 데이터 일관성 및 동기화와 관련된 복잡성을 유발할 수 있다.
- 스토리지 엔진 제한: MySQL의 아키텍처는 데이터 저장 및 검색을 위해 스토리지 엔진에 의존한다. 기본 InnoDB 엔진은 대부분의 사용 사례에 적합하지만 MyISAM 또는 MEMORY와 같은 다른 엔진은 기능, 성능 또는 내구성 측면에서 제한이 있어 특정 애플리케이션에 영향을 줄 수 있다.
- 라이센스 및 지원: MySQL 자체는 오픈 소스이지만 일부 고급 기능, 관리 도구 및 엔터프라이즈 지원 서비스는 오라클과 같은 MySQL 공급업체의 유료 구독 또는 라이센스를 요구할 수 있다. 이는 특정 요구 사항이 있는 조직의 총 소유 비용을 증가시킬 수 있다.
- 객체 관계형 DBMS로, 관계형 데이터베이스 시스템과 객체 지향 데이터베이스 시스템의 특징을 결합했다.
- MySQL 다음으로 개발자들이 선호하는 데이터베이스이다.
- 특징
Vaccum
수행을 통해 디스크 조각이 차지하는 영역을 회수할 수 있다. *참고 자료: PostgreSQL 공식 문서- 최대 테이블 크기는 32TB이다.
- SQL뿐만 아니라 JSON을 이용해서 데이터에 접근할 수 있다.
- 지정 시간에 복구하는 기능, 로깅, 접근 제어, 중첩된 트랜잭션, 백업 등을 할 수 있다.
객체 지향 데이터베이스: 1990년대에 객체 지향 프로그래밍의 등장에 대응하여 발전한 데이터베이스 모델로, 데이터를 객체로 취급하여 처리한다.
VACUUM: PostgreSQL에만 존재하는 개념으로, 진공청소기 역할을 하는 동작이다.
-
유연한 확장성의 부족
- RDB는 스키마를 정의하고 스키마에 맞춰 데이터를 저장해야 하기 때문에 새로운 컬럼을 추가해야 할 때 유연한 확장성이 부족하다.
- 데이터가 많은 테이블에 컬럼을 추가하는 작업은 위험부담이 크다.
- RDB는 스키마를 정의하고 스키마에 맞춰 데이터를 저장해야 하기 때문에 새로운 컬럼을 추가해야 할 때 유연한 확장성이 부족하다.
-
복잡한 join으로 인한 성능 저하
- 데이터 정규화를 통해 데이터 중복을 줄이는 등 이점이 있지만, 테이블이 여러 개로 나뉠수록 원래의 전체 데이터를 읽어오고자 할 때 JOIN이 많이 발생한다.
- 여러 테이블 조인하려면 CPU 많이 써야하며 응답시간이 늘어난다.
- 즉, 복잡한 join은 read 성능 저하를 야기한다.
- 데이터 정규화를 통해 데이터 중복을 줄이는 등 이점이 있지만, 테이블이 여러 개로 나뉠수록 원래의 전체 데이터를 읽어오고자 할 때 JOIN이 많이 발생한다.
-
트래픽 과부하
- 관계형 데이터베이스는 기본적으로 한 대의 컴퓨터에 저장된다.
- read/write 요청이 지나치게 많이 들어오면 트래픽 과부하가 발생한다.
- 관계형 데이터베이스는 이럴 때 scale-up을 통해 DB 성능을 향상시키거나, 혹은 레플리케이션을 구성해서 read-only용으로 사용할 수 있다.
- 그러나 일반적으로 RDB는 scale-out에 유연한 디비가 아니다.
-
전체 처리량의 감소
- 트랜잭션 ACID이라는 장점이 있지만, ACID를 보장하려다 보니 전체 처리량이 줄어드는 등 DB 서버 퍼포먼스에 어느 정도 영향을 미친다.
- 트랜잭션 ACID이라는 장점이 있지만, ACID를 보장하려다 보니 전체 처리량이 줄어드는 등 DB 서버 퍼포먼스에 어느 정도 영향을 미친다.
→ 이러한 상황 때문에 NoSQL이 많이 사용되기 시작했다.
Scale-up: 기존 서버의 사양을 업그레이드해 시스템을 확장하는 것
Scale-out: 서버를 여러 대 추가하여 시스템을 확장하는 것
레플리케이션(Replication): 데이터 저장과 백업하는 방법과 관련이 있는 데이터를 호스트 컴퓨터에서 다른 컴퓨터로 복사하는 것
- 의미: SQL만을 사용하지 않는 비관계형 데이터베이스를 말하며, 관계형 데이터베이스의 전통적인 구조 밖에서 데이터 저장 및 쿼리를 가능하게 한다.
- Not Only SQL이라는 슬로건에서 생겨났다.
- 초기엔 주로 표준화된 구조적 질의 언어가 없는 데이터베이스(No SQL) 또는 관계를 갖지 않는 데이터베이스(Nonrelational Operational Database SQL)로 정의하였다.
- 하지만 현재는 앞의 두 가지 의미 외에도 SQL뿐만 아니라, 여러 가지 기능을 제공(Not Only SQL)한다는 의미로 일반화되었습니다.
- 대표적으로 MongoDB와 redis 등이 있다.
- 키-값 데이터베이스: 키와 값으로 구성된 배열구조의 데이터베이스로 NoSQL 데이터베이스 중 가장 단순한 구조이다.
- 도큐먼트 데이터베이스: 필드와 값의 형태로 구성된 데이터를 JSON 포맷으로 관리하는 데이터베이스로 NoSQL 데이터베이스 중 가장 인기가 높다.
- 칼럼 패밀리 데이터베이스: 칼럼과 로우로 구성된 데이터베이스로 칼럼은 이름과 값으로 구성되고 로우는 각기 다른 칼럼으로 구성이 가능하다.
- 그래프 데이터베이스: 노드와 관계로 구성된 데이터베이스로 근접한 객체를 모델링할 목적으로 설계되었다.
- 유연성: 스키마 선언 없이 필드의 추가 및 삭제가 자유로운 Schema-less 구조입니다.
- 확장성: 스케일 아웃에 의한 서버 확장이 용이합니다.
- 고성능: 대용량 데이터를 처리하는 성능이 뛰어납니다.
- 가용성: 여러 대의 백업 서버 구성이 가능하여 장애 발생 시에도 무중단 서비스가 가능합니다.
- 실시간 데이터 관리
- NoSQL 데이터베이스는 빠른 쓰기 및 읽기 성능을 제공하여 대량의 실시간 데이터를 처리할 수 있어, 대규모 이벤트 기반 시스템에서 중요한 역할을 한다.
- 클라우드 보안
- NoSQL 데이터베이스는 다양한 보안 기능을 제공하여, 데이터베이스 자체의 보안을 강화하고, 클라우드 환경에서의 데이터 보호를 지원한다.
- 고가용성 애플리케이션
- NoSQL 데이터베이스는 자동 복제, 샤딩, 분산 쿼리 처리 등의 기능을 통해 고가용성을 지원하며, 이를 통해 애플리케이션의 가용성을 높이고, 장애 시에도 서비스를 지속적으로 제공할 수 있게 한다.
-
개요
- 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스이다.
- 거대한 데이터베이스라는 의미의 Humongous(거대한) Database를 줄인 mongoDB로 명명되었다.
- 소유주: MongoDB
-
특징
- 데이터 저장 형식: BSON(Binary JSON)
- JSON 스타일의 도큐먼트 형식으로, nested된 타입을 저장할 때 강점을 보인다.
- 쿼리:MQL (JSON 형식)
- JSON을 통해 접근할 수 있다.
- 스키마: 동적 스키마
- 스키마를 정해 놓지 않고 데이터를 삽입할 수 있다.
- 다양한 도메인의 데이터베이스를 aggregate할 때 편리하다.
- 그렇기 때문에 다양한 도메인의 데이터베이스를 기반으로 분석하거나 로깅 등을 구현할 때 강점을 보인다.
- 다양한 데이터 타입 및 구조를 갖는 데이터를 저장할 수 있다.
- 스키마를 정해 놓지 않고 데이터를 삽입할 수 있다.
- 외래키 지원: 외래키를 지원하지 않는다.
- ObjectID를 통해 우회적으로 지원한다.
- Read Concern(기본): Local
- RDBMS의 격리 수준과 다르게 처리된다.
- MongoDB는 Local, Majority, Snapshot 이라는 고유의 격리 수준을 가진다.
- Local - READ_UNCOMMITED와 유사
- Snapshot - SERIALIZABLE와 유사
- 기본키 설정: 기본키가 자동 설정된다.
- 도규먼트를 생성할 때마다 12byte의 유니크한 값인 ObjectID가 기본키로 설정된다.
- 유닉스 시간 기반의 타임스탬프, 랜덥 값, 카운터로 이루어져 있다.
- 도규먼트를 생성할 때마다 12byte의 유니크한 값인 ObjectID가 기본키로 설정된다.
- 기본 스토리지 엔진: wired Tiger 엔진
- 데이터 저장 형식: BSON(Binary JSON)
-
이외 기술적 특징
- 확장성이 뛰어나며 빅데이터를 저장할 때 성능이 좋다.
- 고가용성과 샤딩, 레플리카셋을 지원한다.
- scale-out에 최적화 되어있다. (수평적 확장이 쉬움)
- 서버 여러 대로 하나의 클러스터를 구성하여 사용
- 데이터를 서버에 나누어 저장
- 중복을 허용하기 때문에 조인을 할 필요가 없음
- scale-out에 최적화 되어있다. (수평적 확장이 쉬움)
- ACID의 일부를 포기하고 high-throughput(높은 전체 처리량), low-latency(빠른 응답) 를 추구한다.
- 금융, 결제, 예약 시스템처럼 consistency가 중요한 환경에는 적절하지 않을 수 있다.
Read Concern(읽기 고려): 레플리케이션 에서 몇개의 MongoDB 인스턴스가 해당 데이터를 가지고 있어야, 이 데이터가 존재한다고 인정하고 읽을 수 있는지에 대한 옵션
샤딩(Sharding): 데이터를 여러 서버에 분산해서 저장하고 처리할 수 있도록 하는 기술이다.
레플리카셋(Replica Set): 여러 개의 동일한 데이터베이스를 만들어서 데이터를 백업해두는 방식으로, 여러 서버에서 데이터베이스 서버를 분산하고 관리하는 구조이다. 클라이언트로 하여금 메인 서버 대신 복제된 서버에 Read 요청을 하도록 하여 메인 서버의 부하를 낮출 수 있다.
- 인메모리 데이터베이스이자 키-값 데이터 모델 기반의 데이터베이스
- 기본적인 데이터 타입은 문자열이이며 이외에도 여러가지 데이터 타입을 지원한다. (최대 512MB까지 저장 가능)
- set, hash를 지원한다.
- 해시 기반으로 샤딩된 클러스터를 구성할 수 있다.
- 고가용성 지원 → 레플리케이션 및 automatic failover 가능
- 다양한 곳에서 다양한 형태로 사용된다.
- 데이터베이스 앞단에 두어 캐싱 계층으로 사용 (메모리를 사용하기 때문에)
- pub/sub 기능을 통해 채팅 시스템
- 단순한 키-값이 필요한 세션 정보 관리
- 정렬된 셋 자료 구조를 이요한 실시간 순위표 서비스
Automatic Failover: 주 복제본이 손실되는 경우 자동으로 발생하는 장애 조치
- 본문 출처
- https://youtu.be/bluQwqMgTsw?si=UDyZnkq1fLFIx8rn
- https://medium.com/@minji.sql/postgresql-mysql-비교-4b32bedb187e
- https://youtu.be/bluQwqMgTsw?si=xBdv3sKC35r9aVFP
- https://www.w3schools.blog/mysql-advantages-disadvantages
- https://www.linkedin.com/pulse/importance-mysql-database-advantages-disadvantages-influence-bk-xhfce/
- https://meetup.nhncloud.com/posts/274
- https://www.ibm.com/kr-ko/topics/relational-databases
- https://aws.amazon.com/ko/nosql/
- 이미지 출처
- 관계형 데이터베이스 & DBMS 로고 - https://velog.io/@hbtopkr/데이터베이스-종류-정리-SQL-와-NoSQL
- MySQL 스토리지 엔진 아키텍처 - https://velog.io/@minyuk/MySQL-아키텍처
- NoSQL - https://meetup.nhncloud.com/posts/274