📌RDB (Relational Database)
관계형 데이터베이스는 데이터를 테이블 형식으로 저장하고, 이 테이블들이 서로 관계를 맺도록 하는 데이터베이스를 의미한다. RDB는 데이터 모델을 설명하는 용어이다.
📌RDBMS (Relational Database Management System)
RDBMS은 RDB를 관리하는 소프트웨어를 말한다. 즉, RDB를 생성하고 수정하고 관리할 수 있는 소프트웨어이다. 그리고 이러한 RDBMS는 주로 SQL을 이용하여 데이터를 조회하고, 관리한다.
RDMBS 특징
- 2차원 데이터(테이블)로 표현된다. (행/열)
- 상호관련성을 가진 테이블의 집합으로 구성된다.
- 테이블 사이의 관계를 외래키로 나타낸다.
- 스키마 변경이 어렵다.
- 수직확장이 용이하지만 수평확장은 어렵다.
- ACID(원자성, 일관성, 고립성, 지속성) 특성을 제공하여 데이터 일관성과 안정성을 보장한다.
스키마 : 데이터 베이스에서 사용되는 전체 데이터 구조를 정의하는 개체
트랜잭션의 ACID
Atomicity (원자성) : 트랜잭션은 모두 수행되거나 모두 수행되지 않는다. 트랜잭션안의 단 하나의 작업이라도 실패시 전체를 롤백하여 원자성을 보장한다.
Consistency (지속성) : 하나의 트랜잭션 이후 데이터베이스 상태는 이전과 같이 유효해야 한다. 트랜잭션이 일어난 이후에도 데이터베이스의 제약이나 규칙을 만족한다.
Isolation (격리성) : 트랜잭션 수행 중에 다른 트랜잭션의 작업이 끼어들지 못한다. 트랜잭션 간에는 서로 독립적으로 수행된다.
-> 4단계로 구성 (Read Uncommitted, Read Committed, Reapetable Read, Serializable)
Dependency (영속성) : 트랜잭션이 성공시 적용된 결과는 영구적으로 지속된다. 시스템이 다운되거나, 기타 문제가 발생해도 트랜잭션 결과는 유지된다.
(트랜잭션이 커밋되면, 변경 사항이 로그 파일에 기록 , 시스템이 다운되거나 장애가 발생하면, db는 재시작할때 로그 파일을 사용하여 마지막 커밋 이후의 모든 트랜잭션을 재적용)
스키마 변경이 어렵다.
ex) 데이터 타입 변경
상황 : 사용자가 테이블의 'birthday' 컬럼 데이터 타입을 VARCHAR에서 DATE로 변경하려고 한다.
기존에 테이블에 VARCHAR로 저장되어 있으므로 이를 DATE로 변환해야한다. 이때 이 컬럼을 참조하는 모든 쿼리와 코드도 수정해야 한다. 또한 저장되어 있는 정보를 변경해주어야 하기 때문에 기존 테이블을 복제해서 수정을 한 뒤, 기존 테이블과 교체하는 방식을 택한다.
수직확장이 용이하지만 수평확장은 어렵다.
그 이유는 데이터가 여러 테이블에 의존해 있기때문이다.
ex) 2번 사람이 쓴 게시글의 댓글을 조회하는데 각각 다른 db에 있다고 가정하자.
A 에는 사용자 정보, B에는 게시글 정보, C에는 댓글 정보가 있다고 가정한다면 A에서 2번 사람을 조회하고, B에서 게시글 의정보를 확인한 뒤 C에서 댓글을 조회한다.
이처럼 DB가 확장될수록 RDB는 수평 확장에 대한 관리가 한없이 복잡해진다.
📌NoSQL (Not Only SQL)
NoSQL이란 RDBMS와 달리 테이블 간 관계를 정의하지 않는다. 테이블 간의 관계를 정의하지 않아서 일반적으로 테이블 간 Join도 불가능하다.
NoSQL 특징
- 다양한 방식으로 데이터를 표현한다.
- 테이블 사이에 명시된 제약이나 규칙이 없다.
- 스키마가 고정적이지 않고, 매우 유연하다
- 수평확장이 쉽다.
- 연산이 빠르다.
다양한 방식으로 데이터를 표현한다.
NoSQL은 다양한 방식의 데이터 모델을 사용할 수 있다.
- Document 모델 : Key와 Document 형태로 데이터를 저장한다. 자유로운 스키마 구조를 갖고 있으며 구조가 확정되지 않은 데이터를 밀어넣고, 자유롭게 작업하기 좋다. ex) Mongo DB
- Graph 모델 : 데이터를 버텍스와 Edge로 그래프에 표현하는 방식이다. 데이터 사이의 유기적인 관계를 표현하기에 적합하다. ex) Neo4j
- Key-value 모델 : 하나의 Key에 값을 매핑하는 해시 구조의 데이터 모델이다. 빠르게 데이터에 접근할 수 있는 장점이 있다. ex) Redis
- Wide-column 모델 : 테이블의 형태지만 행마다 갖고 있는 컬럼의 형태가 고정되어 있지 않은 데이터 모델이다.
ex) HBase
🔎RDMBS 와 NoSQL의 장단점
✅ RDMBS
RDBMS 장점
- 스키마에 따라 데이터를 저장하므로 명확한 데이터 구조를 보장한다.
- 각 데이터를 중복없이 한 번만 저장하여 데이터의 정합성을 보장한다.
RDBMS 단점
- 테이블간의 관계를 맺고 있기 때문에 시스템이 커질 경우 (Join 문이 많을 경우) 복잡한 쿼리가 만들어 진다.
- 성능 향상을 위해서는 Scale-Up(수직확장) 을 지원한다. 이로 인해 비용이 높아진다.
- 스키마로 인해 데이터가 유연하지 못하다. 스키마가 변경될 경우 번거롭다.
✅ NoSQL
NoSQL 장점
- 스키마가 없기 때문에 유연하며 자유로운 데이터 구조를 가진다.
- 데이터 분산이 용이하며 성능 향상을 위한 Scale-Out 이 용이하다.
NoSQL 단점
- 데이터 간 중복이 발생할 수 있으며 중복된 데이터가 변경될 경우 수정을 모든 컬렉션에서 수행을 해야 한다.
- 스키마가 존재하지 않기에 명확한 데이터 구조를 보장하지 않으며 데이터 구조 결정이 어려울 수 있다.
🔎RDMBS 와 NoSQL 언제 사용해야 할까?
RDBMS
데이터 구조가 명확하여 변경될 가능성이 적고, 명확한 스키마가 중요한 경우에 사용하는 것이 좋다. 데이터 중복을 피하고 데이터 무결성을 유지할 수 있으며, 관계를 맺고 있는 데이터가 자주 변경되는 시스템에 적합하다. 자주 수정되는 데이터와
트랜잭션이 중요한 데이터 (ex : 사용자 프로필)를 저장하는데 특히 유용하다.
NoSQL
NoSQL은 읽기 중심의 데이터나 대규모 데이터를 저장하는 데 적합하다. 데이터 구조가 유연하며, 변경이나 확장이 자주 일어날 수 있는 경우에 사용하는 것이 좋다. NoSQL은 데이터 중복이 발생할 수 있으며, 중복된 데이터가 변경될 시 모든 컬렉션에서 수정을 해야 하는 단점이 있다. 따라서 업데이트가 많이 이루어지지 않는 시스템에 적합하다. 또한 NoSQL의 수평확장 특성을 활용하여 막대한 데이터를 저장하고 처리해야 하는 시스템에 유리하다.
요약
- RDBMS: 데이터 구조가 명확하고, 스키마가 중요하며, 자주 수정되는 데이터와 트랜잭션이 중요한 데이터를 저장하는 데 적합하다. 데이터 무결성을 유지하며, 관계형 데이터베이스의 특성을 최대한 활용할 수 있다.
- NoSQL: 읽기 중심의 데이터나 대규모 데이터를 저장하는 데 적합하다. 유연한 데이터 구조를 지원하며, 데이터 확장과 변경이 자주 발생하는 경우에 유용하다. 대규모 데이터 저장과 Scale-out이 필요한 시스템에 적합하다.