안녕하세요. 개발자 Jindory입니다.
오늘은 관계형 데이터베이스와 비관계형 데이터베이스의 차이에 대해서 알아보는 글을 작성해보고자 합니다.
# 글 작성이유
웹 프로젝트 개발 혹은 데이터를 저장할 DB를 선택할때, MySQL, Oracle과 같은 관계형 데이터베이스를 사용할 것인가? MongoDB,CouchDB와 같은 비관계형 데이터베이스를 사용할 것인가?에 대한 고민이 생겼을때 둘의 차이를 비교해보면서 어떤 상황에 어떤 DB를 선택하는것이 좋을지에 대해서 생각해보고자 비교글을 작성하게 되었습니다.
관계형 데이터베이스(SQL)
SQL은 '구조화된 쿼리 언어(Standard Query Language)'를 말합니다. 특정 유형의 데이터베이스와 상호 작용하는데 사용하는 쿼리입니다.
SQL을 사용하면 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장,수정,삭제 및 검색을 할 수 있습니다.
이러한 관계형 데이터베이스는 아래의 2가지 특징이 있습니다.
- 데이터는 엄격한 데이터 스키마(=structure)를 따라 데이터베이스 테이블에 저장된다.
- 데이터는 관계를 통해서 여러 테이블에 분산된다.
1. 엄격한 스키마
데이터 테이블에 레코드로 저장되며, 각 테이블에는 명확하게 정의된 구조(structure) 테이블이 들어갈 수 있는 데이터와 그렇지 않은 데이터를 정의하는 필드 집합이 있습니다.
구조는 필드의 이름과 데이터 유형으로 정의됩니다.
위 테이블에서 존재하지 않는 새로운 필드(칼럼)를 넣고자 한다면, 스키마를 수정하지 않고서는 추가 할 수 없습니다.
2. 관계
데이터의 중복을 피하기 위해 데이터들을 여러 테이블로 나눠 저장합니다.
예를들어 User(사용자), Product(상품), Orders(주문한 상품)의 여러 테이블이 존재할 때, 각각의 테이블들은 서로 다른 테이블에 저장되지 않는 데이터 만으로 구성되어 있습니다.
이런 구조를 통해 데이터가 항상 하나의 테이블에서만 관리되기 때문에 잘못된 데이터가 테이블 전체에 복제되어 발생하는 문제가 없습니다.
특징
- 트랜잭션(All or Nothing) : 전첵 트랜잭션이 하나의 단위로 기록, 실패시 전체 롤백
- 정규화 : DB 설계시 중복을 최소화해서 구조화하는 프로세스
장점
- 데이터의 성능이 일반적으로 좋아서 정렬,탐색,분류가 빠르다.
- 명확하게 정의 된 스키마, 데이터의 무결성을 보장한다.
- 관계를 통해 각 데이터를 중복없이 한번만 저장하여 비용을 최소화 한다.
단점
- 기존에 작성된 스키마를 수정하기 어렵다.
- JOIN문이 많은 매유 복잡한 쿼리가 만들어 질 수 있다.
- 수평 확장이 어렵고, 보통 수직 확장만 가능하다.
비관계형 데이터베이스(NoSQL)
NoSQL은 기본적으로 SQL데이터베이스와 반대되는 접근 방식을 따르고 있습니다.
- 스키마가 없다.
- 관계가 없다.
1. 스키마가 없다.
NoSQL에서는 테이블을 컬렉션으로, 레코드를 다큐먼트라고 부릅니다.
그러나 단순히 이름만 다른것이 아니라, 핵심적인 차이가 있습니다. SQL 세계에서는 정해진 스키마를 따르지 않는다면 데이터를 추가할 수 없지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션(=SQL에서의 table)에 추가할 수 있습니다.
다큐먼트는는 약간 JSON 데이터와 비슷한 형태를 key와 value로 구성되어 있습니다.
2. 관계가 없다.
일반적으로 관련 데이터를 동일한 컬렉션에 넣습니다. 관계형 데이터베이스에서 사용했던 Users나 Products 정보 또한 Orders에 포함해서 한꺼번에 저장했던 것과 달리 주문 한 상품이 있는 경우, 관련있는 데이터를 Orders 컬렉션에 저장합니다.
따라서 여러 컬렉션(테이블)을 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 만들게 됩니다.
컬렉션 마다 데이터를 복제하여 각 켤렉션 일부분에 속하는 데이터를 생성합니다.
특징
- 거대한 Map으로서 key-value 형식을 지원함.
- 관계형 DB와 달리 PK,FK JOIN등 관계를 정의하지 않음
- 스키마에 대한 정의가 없다.
장점
- 대용량 데이터 처리를 하는데 효율적임.
- 읽기 작업보다 쓰기 작업에 더 빠르고 관계형 데이터베이스에 비해 쓰기와 읽기 성능이 빠름.
- 스키마가 없기 때문에 저장된 데이터에 언제든지 새로운 필드를 추가 할 수 있어 데이터 모델링이 유연함.
- 데이터는 필요한 정보를 Collection안에 저장함으로써, 뛰어난 확장성으로 검색이 유리함.
- 최적화된 키 값 저장 기법을 사용하여 응답속도나 처리효율 등에서 성능이 뛰어남.
- 복잡한 데이터 구조를 표현할 수 있음.
단점
- 퀴리 처리시 데이터를 파싱 후 연산을 해야하므로 큰 크기의 document를 다룰 때는 성능이 저하 된다.
- 복사된 데이터가 변경되면 여러 콜렉션과 문서를 수정해야한다.
수직 및 수평 스케일링
두 데이터베이스를 비교할 때 살펴 봐야할 또 하나의 중요한 개념은 스케일링(Scaling:확장)입니다.
확장은 수평(Horizontal) 확장(Scale out)과 수직(Vertical) 확장(Scale Up)으로 구별 할 수 있습니다.
1. 스케일 아웃(Scale Out)
- '스케일 아웃'이란 서버의 대수를 늘려 전체 처리 능력을 향상시키는 방법이다. 수평 스케일(Horizontal Scale)이라고 부르기도 한다다.
- 서버의 가상화 기능을 사용하고 하나의 케이스 내에서 가상으로 복수 서버를 구축해 스케일 아웃과 동등한 효과를 제공할 수도 있다.
- 이러한 방식은 스케일 위드인 또는 가상 스케일 아웃이라고 부르기도 한다.
특징
- 스케일 아웃의 경우 서버 한 대가 장애로 다운 되더라도 다른 서버로 서비스를 제공이 가능하다는 장점이 있다.
- 각 서버에 걸리는 부하를 균등하게 분배해주는 '로드밸런싱'이 플수적으로 동반되어야 한다.
- 개개의 처리가 단순하지만 다수의 처리를 동시 병렬적으로 처리가 필요로 하는 경우에 적합하다.
- 데이터 정합성 유지에 대한 요건이 어렵지 않은 경우에 적합하다.
- 주로 웹 서버나 데이터가 읽기 전용인 검색엔진 데이터 분석처리, VOD(주문형비디오) 서비스, 일부의 과학기술 계산, 메일 서버나 게시판 등의 어플리케이션등의 운영에 사용된다.
2. 스케일 업(Scale Up)
- '스케일 업'은 서버 자체를 증강하여 처리 능력을 향상시키는 방법이다. 수직 스케일(Vertical Scale)이라고 부르기도 한다.
- 주로 CPU나 RAM 등을 추가하거나 그 외의 부품을 고성능으로 교환하는 방법을 의미한다.
특징
- 스케일 업의 경우 한 대의 서버에 모든 부하가 집중되므로 장애 시 해당 서비스에 큰 영향을 줄 수 있는 위험성이 있다.
- 어플리케이션 서버에서는 스케일 아웃이 가능하지만 빈번히 갱신이 발생하는 OLTP(On-Line Trasaction Processing) 데이터베이스에는 정합성(데이터의 모순없이 일관되기 일치함) 유지를 위해 스케일 업이 적합하다.
데이터가 저장되는 방식 때문에 SQL 데이터베이스는 일반적으로 수직 확장만 지원하고, 수평 확장은 NoSQL 데이터베이스에서만 가능하다.
SQL 데이터베이스는 '샤딩(Sharding)'의 개념을 알고 있지만 특정 제한이 있으며 일반적으로 구현하기 어렵습니다. NoSQL 데이터베이스는 이를 기본적으로 지원하므로 여러 서버에서 데이터베이스를 보다 쉽게 분할 할 수 있다.
SQL과 NoSQL은 각각 어떤 상황에서 사용하는것이 좋을까?
SQL
- 관련 데이터가 비교적 자주 변경되는 경우
- 명확한 스키마가 중요하며, 데이터구조가 극적으로 변경되지 않을 경우
NoSQL
- 정확한 데이터 요구사항을 알 수 없거나 관계를 맺고 있는 데이터가 자주 변경(수정)되는 경우
- 읽기(read)처리를 자주하지만, 데이터를 자주 변경하지 않는 경우(즉, 한번의 변경으로 수십개의 문서를 수정 할 필요가 없는경우)
- 데이터베이스를 수평으로 확장해야하는 경우(즉, 막대한 데이터를 다뤄야하는 경우, 읽기/쓰기 처리량이 큰 경우)
이렇게 관계형 데이터베이스와 비관계형 데이터베이스의 차이에 대해서 알아봤습니다.
혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.
오늘도 Jindory 블로그에 방문해주셔서 감사합니다.
[참고]
https://newehblog.tistory.com/38?category=834445
https://academind.com/tutorials/sql-vs-nosql
https://www.hooni.net/xe/study/95321
'데이터베이스 > Database' 카테고리의 다른 글
[Database] Transaction, 트랜잭션이란? (0) | 2022.04.14 |
---|---|
[Database] Oracle과 MySQL의 차이점 (0) | 2022.04.13 |