RDBMS(Relational Database Management System)와 NoSQL은 데이터를 저장하고 관리하는 두 가지 주요 유형의 데이터베이스 시스템
각 시스템은 고유한 데이터 모델과 사용 사례에 맞게 설계
- RDBMS: 관계형 데이터베이스 관리 시스템으로, 데이터를 테이블 형식으로 저장하며, 각 테이블은 열(필드)과 행(레코드)로 구성
SQL(Structured Query Language)을 사용하여 데이터를 정의, 관리, 쿼리
데이터 간의 관계를 명확히 정의하고, 스키마를 통해 데이터 무결성을 유지하는 것이 특징
예시로 MySQL, PostgreSQL, Oracle, SQL Server 등 - NoSQL: 관계형 데이터베이스의 제약을 벗어나 다양한 데이터 저장 모델(문서, 키-값, 그래프, 열 기반 등)을 사용하는 데이터베이스
스키마가 유연하며, 대량의 데이터를 빠르게 처리
구조화된 쿼리 언어 대신 각 데이터베이스 시스템마다 고유한 API를 통해 데이터를 조작
MongoDB, Cassandra, Redis, DynamoDB 등이 대표적인 NoSQL 데이터베이스입니다.
장점:
- RDBMS:
- 데이터 무결성 및 ACID(Atomicity, Consistency, Isolation, Durability) 속성을 보장하여 트랜잭션 관리
- 데이터 관계와 정규화가 잘 정의되어 있어 중복을 줄이고, 데이터 일관성 유지
- 강력한 쿼리 언어(SQL)를 통해 복잡한 쿼리와 조인이 가능
- NoSQL:
- 스키마가 없거나 유연하여 구조가 자주 변경되는 데이터를 쉽게 관리
- 수평적 확장이 용이하여 대규모 분산 시스템을 구성
- 대용량 데이터 처리와 고성능을 요구하는 애플리케이션에 적합
단점:
- RDBMS:
- 수직적 확장(서버 성능 향상)에 한계가 있으며, 수평적 확장(서버 추가)이 어려움
- 대량의 비정형 데이터나 빈번한 스키마 변경을 처리하기에 부적합
- 데이터의 크기와 복잡성에 따라 성능 저하 가능성
- NoSQL:
- 데이터 일관성과 무결성 관리가 어려울 수 있으며, 복잡한 트랜잭션 관리 어려움
- ACID 속성을 완전히 보장하지 않는 경우가 많아 애플리케이션 레벨에서 보완이 필요
- 원자성(Atomicity) : 트랜잭션에 속한 각각의 문(데이터를 읽기, 쓰기, 업데이트 또는 삭제하기 위함)을 하나의 단위로 취급합니다. 문 전체를 실행하거나 그 문의 어떤 부분도 실행하지 않거나 둘 중 하나입니다. 이 속성이 있으면 예컨대 스트리밍 데이터 소스가 스트리밍 중에 갑자기 오류를 일으키더라도 데이터 손실과 손상이 방지됩니다.
- 일관성(Consistency) : 트랜잭션이 테이블에 변경 사항을 적용할 때 미리 정의된, 예측할 수 있는 방식만 취합니다. 트랜잭션 일관성이 확보되면 데이터 손상이나 오류 때문에 테이블 무결성에 의도치 않은 결과가 생기지 않습니다
- 격리성(Isolation) : 여러 사용자가 같은 테이블에서 모두 동시에 읽고 쓰기 작업을 할 때, 각각의 트랜잭션을 격리하면 동시 트랜잭션이 서로 방해하거나 영향을 미치지 않습니다. 각각의 요청이 실제로는 모두 동시에 발생하더라도, 마치 하나씩 발생하는 것처럼 발생할 수 있습니다
- 영속성(Durability) : 트랜잭션 실행으로 인해 데이터에 적용된 변경 사항이 저장되도록 보장합니다. 시스템 오류가 발생해도 마찬가지입니다
- 출처: https://www.databricks.com/kr/glossary/acid-transactions
- 쿼리 언어와 접근 방식이 각 데이터베이스마다 달라 학습 곡선이 높음
- 사용 사례 비교:
- RDBMS: 금융 시스템, 재고 관리, 예약 시스템과 같이 데이터 무결성과 관계가 중요한 애플리케이션에 적합
- NoSQL: 소셜 네트워크, 로그 데이터 분석, IoT 데이터 저장 등 대용량 데이터와 빠른 확장이 필요한 애플리케이션에 적합
사용 예시:
- RDBMS 사용 예시 - MySQL로 사용자 데이터 관리: 관계형 데이터베이스에서 테이블을 정의하고, 데이터를 삽입 및 조회하는 기본적인 SQL
CREATE TABLE Users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO Users (username, email) VALUES ('john_doe', 'john@example.com');
SELECT * FROM Users WHERE username = 'john_doe';
- NoSQL 사용 예시 - MongoDB로 문서 데이터 관리: MongoDB에서는 데이터가 JSON 형태로 저장되며, 스키마를 엄격하게 정의하지 않고도 데이터를 쉽게 추가하고 조회 가능
// MongoDB 사용 예시 (Node.js 환경)
const { MongoClient } = require('mongodb');
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);
async function run() {
try {
await client.connect();
const database = client.db('mydatabase');
const users = database.collection('users');
// 데이터 삽입
await users.insertOne({ username: 'john_doe', email: 'john@example.com', createdAt: new Date() });
// 데이터 조회
const user = await users.findOne({ username: 'john_doe' });
console.log(user);
} finally {
await client.close();
}
}
run().catch(console.dir);
'공부' 카테고리의 다른 글
서버 스케줄링이란 (0) | 2024.08.31 |
---|---|
시스템 설계란 (0) | 2024.08.31 |
Spring과 Node.js (1) | 2024.08.30 |
백엔드 아키텍처란 (2) | 2024.08.30 |
블록킹(Blocking), 논블록킹(Non-Blocking)이란? (0) | 2024.08.29 |