내일배움캠프에서 MongoDB, MySQL이 두가지의 데이터베이스를 배우고 사용해봤다. 그리고 Redis라는 데이터베이스라는게 있다는 것 또한 들었다.
여기서 MySQL은 RDBMS(Relational DataBase Management System)의 한 종류이고, MongoDB와 Redis의 경우에는 모델은 서로 다르지만 둘 다 NoSQL(Not Only SQL)의 종류 중 하나이다.
이번 포스팅에서는 RDBMS와 NoSQL에 대해 알아볼 예정이다.
RDBMS(Relational DataBase Management System)는 단어 뜻 그대로 관계형 데이터베이스 관리 시스템으로, 데이터를 테이블 형식으로 저장한다. 각 테이블(Table)은 행(Row)과 열(Column)로 구성되어있고, SQL을 사용해서 데이터를 관리한다.
이때, 각 행은 데이터 레코드를 나타내고, 열은 특정 데이터 유형을 가지고 있다.

RDBMS의 가장 중요한 특징으로는 ACID 특성이 있다. ACID는 원자성, 일관성, 격리성, 지속성으로 정의된다.
- 원자성(Atomicity) : 트랜잭션은 완전히 수행되거나 전혀 수행되지 않아야 한다.
=> 트랜잭션은 부분적으로만 완료되지 않는다.- 일관성(Consistency) : 트랜잭션 전후에 데이터베이스는 일관된 상태여야 한다.
- 격리성(Isolation) : 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 다른 트랜잭션과 격리되어야 한다.
=> 다른 트랜잭션에 의해 수정된 데이터에 대해 접근하지 않는다.- 지속성(Durability) : 트랜잭션이 성공적으로 완료된 경우, 결과는 영구적으로 저장되어야 한다.
- 트랜잭션(Transaction) : 데이터 베이스에서 수행되는 단일 논리적 작업 단위.
=> 하나 이상의 데이터베이스 작업이 모두 성공하거나 실패할 때 까지 모두 적용 혹은 모두 롤백되어야 하는 작업 그룹.
RDBMS는 위의 ACID 특성을 기본으로 구성하기 때문에 데이터의 무결성과 정합성을 보장한다.
또한 외래 키(foreign key)를 사용하여 테이블 간 Join이 가능해 복잡한 쿼리를 지원하고, 데이터 간의 관계 표현을 쉽게 해준다.

하지만 여러 테이블 간의 복잡한 Join의 경우 대규모 데이터 세트에서 성능에 관한 문제를 일으킬 수 있다.
=> 복잡한 쿼리는 처리 시간이 오래 걸리고 시스템 성능을 저하시킨다.
sql
-- 예제: 다중 테이블 조인
SELECT orders.id, customers.name, products.title
FROM orders
JOIN customers ON orders.customer_id = customers.id
JOIN products ON orders.product_id = products.id;
위의 예제는 주문, 고객, 제품 테이블 간의 관계를 가져오는 작업을 수행하는데,
이때 데이터세트가 클 경우, 위와 같은 Join은 성능을 저하시킬 수 있다.(쿼리 최적화 필요.)
- Scale-up
- 기존의 서버를 높은 사양으로 업그레이드 하는 것.(CPU 업그레이드, RAM 추가 등)
- 하나의 서버의 능력을 증강하므로 수직 스케일링(vertical scaling)이라고도 함.
- Scale-out
- 장비를 추가해 서버를 확장.(하나의 장비가 하던 일을 여러 장비가 나눠서 처리.)
- 서버를 추가로 확장하기 때문에 수평 스케일링(horizontal scaling)이라고도 함.
- 비슷한 사양의 서버를 추가로 연결해 처리할 수 있는 데이터의 용량 증가뿐만 아니라 기존 서버의 부하를 분담해 성능도 향상.
☞ RDBMS는 Join과 정해진 규격으로 인한 한계점이 존재했다. 이러한 한계를 극복하기 위해 만들어진 새로운 형태의 데이터베이스가 바로 NoSQL이다.
NoSQL(Not only SQL)은 SQL을 사용하지 않는다는 뜻이 아니라 SQL 뿐만 아니라 다른 여러 유형의 데이터 베이스를 사용한다는 뜻이다.(비관계형 데이터베이스)
대량의 분산된 비정형 데이터를 저장하고 조회하는데 특화된 데이터베이스로 스키마 없이 사용하거나 느슨한 스키마를 제공한다.
RDBMS는 데이터 간의 관계를 외래 키(foreign key)로 정의하고 Join 연산을 수행하는데 반해 NoSQL은 Key-Value의 형태로 저장되기 때문에 Join 연산이 불가능하다. 즉, 데이터 간의 관계를 정의하지 않는다.
또한 분산형 구조로 설계되어 여러 곳의 서버에 데이터를 분산 저장해 특정 서버에 장애가 발생해도 데이터가 유실되거나 서비스가 중지되지 않도록 한다.
데이터가 유연하고 자유롭기 때문에 언제든 저장된 데이터 조정과 새로운 필드 추가가 가능하다.
또한 RDBMS는 성능 향상에 Scale-up만 지원했던 것에 비해 Scale-out까지 모두 가능하므로 데이터 분산이 용이하고, 대용량의 데이터를 저장할 수 있다.
하지만 데이터가 유연하다는 것은 데이터의 일관성이 존재하지 않고, 데이터 구조 결정이 어렵다는 말이 된다.
또, 데이터가 중복 발생이 가능하기 때문에 데이터를 변경하려면 모든 컬렉션에서 데이터를 변경해줘야 한다.
이러한 특징과 장단점으로 인해 NoSQL은 데이터의 수정이 많이 이루어지는 시스템이나 다량의 데이터를 저장해야 할 경우에 사용할 수 있다.
- NoSQL 모델 종류
- Key-Value DB
- Key-Value 방식으로 데이터 저장.
- Key값은 모든 데이터 타입을 수용할 수 있고, 중복되지 않는 유니크한 값.
- 메모리 기반으로 빠르게 데이터를 읽어올 수 있음.
※ ex) Redis, Riak, Oracle Berkely, AWS DynamoDB 등- Document DB
- 비정형 대량 데이터를 저장하기 위한 방식.
- Key-Document 형태로 저장.
- Document는 계층적인 데이터 타입(JSON, XML)으로 저장됨.
- JSON타입을 사용하므로 HTTP 기반의 웹서버에서 데이터를 편하게 주고받을 수 있음.
※ ex) MongoDB, Azure Cosmos DB, CouchDB, OrientDB 등- Wide Column DB
- Row가 아닌 Column 위주로 데이터를 저장하는 방식.
- Column-family Model(Key, Value와 유사한 형태)
- 데이터가 내부에서 Key를 기준으로 오름차순 저장됨.
- 이전 모델들이 Key-Value 값을 이용해 필드를 결정한데 비해 해당 모델은 키에서 필드를 결정함.
※ ex) Cassandra, HBase, Google BigTable, Vertica, Druid 등- Graph DB
- 객체와 관계를 그래프 형식의 데이터로 저장하기 위한 방식.
- 데이터를 Node, Edge, Property와 함께 그래프 구조를 사용해 데이터를 저장.
- SNS, Network Diagrmas 등과 SNS에서 함께 아는 친구찾기, 추천 등 연관 데이터를 추천해주는 엔진 및 패턴 기능에 사용.
※ ex) Neo4j, Blazegraph, OrientDB, AgensGraph
다음 포스팅에선 Redis를 사용하고 익혀 볼 예정이다.
참고 블로그
NoSQL이란 무엇인지 간단하게 알아보자!
RDBMS와 NoSQL의 차이점과 사용 사례
Database 종류 및 개념 정리
[Database] RDBMS와 NoSQL의 차이점 알아보기 !
NoSQL 이해