데이터베이스 비교 가이드¶
실무에서 DB를 선택할 때 고려해야 할 사항과 각 DB의 특성을 정리함.
1. DB 선택 기준¶
1.1 핵심 질문¶
1. 데이터 모델은? (관계형, 문서형, 키-값, 그래프)
2. 읽기/쓰기 비율은? (읽기 중심, 쓰기 중심, 균형)
3. 트랜잭션이 필요한가? (ACID, BASE)
4. 확장성 요구사항은? (수직, 수평)
5. 지연 시간 요구사항은? (밀리초, 초)
6. 데이터 크기는? (GB, TB, PB)
7. 기존 인프라는? (클라우드, 온프레미스)
8. 팀의 경험은? (익숙한 기술 스택)
1.2 워크로드별 추천¶
| 워크로드 | 추천 DB | 이유 |
|---|---|---|
| 웹 애플리케이션 | PostgreSQL, MySQL | 범용, 풍부한 에코시스템 |
| 공공/금융 | Oracle | 안정성, 기술지원, 규제 준수 |
| 빠른 캐싱 | Redis | 메모리 기반, 밀리초 지연 |
| 문서 저장 | MongoDB | 유연한 스키마 |
| 검색/로그 | Elasticsearch | 전문 검색, 분석 |
| 벡터 검색 | pgvector, Pinecone | AI/RAG 파이프라인 |
| 시계열 | TimescaleDB, InfluxDB | 시계열 최적화 |
| 그래프 | Neo4j | 관계 중심 질의 |
2. RDBMS 비교¶
2.1 PostgreSQL¶
강점 - 표준 SQL 준수, 확장성 우수 - pgvector: 벡터 검색 (AI/RAG) - PostGIS: 공간 데이터 (GIS) - JSONB: 문서형 데이터 지원 - 오픈소스, 무료
약점 - Oracle 대비 기술지원 제한 - 극한의 쓰기 성능 필요 시 튜닝 필요
언제 사용
설정 예시
-- pgvector 활성화
CREATE EXTENSION vector;
-- 벡터 컬럼 테이블
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
-- HNSW 인덱스
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
-- 벡터 검색
SELECT * FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 10;
2.2 Oracle¶
강점 - 엔터프라이즈급 안정성 - 풍부한 기술지원 - 한국 공공기관/금융권 표준 - 고급 기능 (RAC, Data Guard) - 대용량 처리 검증됨
약점 - 높은 라이선스 비용 - 복잡한 관리 - 클라우드 네이티브 환경에서 제약
언제 사용
공공기관 특이사항
2.3 MySQL¶
강점 - 간단, 빠른 읽기 성능 - 웹 서비스에 최적화 - 풍부한 호스팅 옵션 - 낮은 학습 곡선
약점 - PostgreSQL 대비 기능 제한 - 복잡한 쿼리 성능 저하 - 벡터 검색 네이티브 미지원
언제 사용
2.4 MS SQL Server¶
강점 - Windows/.NET 생태계 통합 - Visual Studio/Azure 연동 - 강력한 BI 도구 (SSRS, SSAS) - 관리 도구 우수
약점 - Windows 의존성 (Linux 버전 있으나) - 라이선스 비용
언제 사용
3. NoSQL 비교¶
3.1 MongoDB¶
강점 - 유연한 스키마 (스키마리스) - JSON 네이티브 - 수평 확장 (샤딩) - 개발 생산성
약점 - 트랜잭션 제한 (개선됨) - 조인 비효율 - 메모리 사용량 높음
언제 사용
// MongoDB 예시
db.products.insertOne({
name: "상품A",
price: 10000,
attributes: {
color: "red",
size: ["S", "M", "L"]
},
reviews: [
{ user: "user1", rating: 5, comment: "좋아요" }
]
});
// 유연한 쿼리
db.products.find({
"attributes.color": "red",
price: { $lt: 20000 }
});
3.2 Redis¶
강점 - 초고속 (메모리 기반) - 다양한 자료구조 - Pub/Sub 지원 - 클러스터링
약점 - 메모리 제한 (비용) - 영속성 설정 필요 - 복잡한 쿼리 불가
언제 사용
import redis
r = redis.Redis()
# 캐시
r.setex("cache:user:123", 3600, json.dumps(user_data))
# LLM 응답 캐시
cache_key = f"llm:{hash(prompt)}"
cached = r.get(cache_key)
if cached:
return json.loads(cached)
# Sorted Set (순위)
r.zadd("leaderboard", {"player1": 100, "player2": 85})
top_10 = r.zrevrange("leaderboard", 0, 9, withscores=True)
3.3 Elasticsearch¶
강점 - 전문 검색 (Full-text Search) - 실시간 분석 - 로그 분석 (ELK 스택) - 벡터 검색 지원
약점 - 운영 복잡성 - 리소스 소모 큼 - 트랜잭션 없음
언제 사용
// 검색 쿼리
{
"query": {
"bool": {
"must": [
{ "match": { "content": "머신러닝" } }
],
"filter": [
{ "term": { "category": "tech" } },
{ "range": { "date": { "gte": "2024-01-01" } } }
]
}
},
"knn": {
"field": "embedding",
"query_vector": [0.1, 0.2, ...],
"k": 10,
"num_candidates": 100
}
}
4. 특수 목적 DB¶
4.1 벡터 DB¶
| DB | 특징 | 추천 상황 |
|---|---|---|
| pgvector | PostgreSQL 확장 | 기존 PG 사용, 중소 규모 |
| Pinecone | 관리형, 쉬운 사용 | 빠른 개발, 서버리스 |
| Milvus | 오픈소스, 고성능 | 대규모, 온프레미스 |
| Qdrant | Rust 기반, 빠름 | 프로덕션 RAG |
| Weaviate | 하이브리드 검색 | 벡터+키워드 검색 |
| ChromaDB | 경량, 개발용 | 프로토타입, 로컬 개발 |
4.2 시계열 DB¶
| DB | 특징 | 추천 상황 |
|---|---|---|
| TimescaleDB | PostgreSQL 기반 | 기존 PG 확장, SQL 사용 |
| InfluxDB | 시계열 특화 | IoT, 메트릭 |
| Prometheus | 모니터링 | 인프라 메트릭 |
| QuestDB | 고성능 | 금융 데이터 |
5. 의사결정 플로우차트¶
시작
|
v
트랜잭션 필수?
|
+-- Yes --> RDBMS
| |
| v
| 공공/금융?
| |
| +-- Yes --> Oracle
| |
| +-- No --> 벡터 검색 필요?
| |
| +-- Yes --> PostgreSQL + pgvector
| |
| +-- No --> PostgreSQL 또는 MySQL
|
+-- No --> 데이터 유형?
|
+-- 문서형 --> MongoDB
|
+-- 키-값/캐시 --> Redis
|
+-- 검색/로그 --> Elasticsearch
|
+-- 그래프 --> Neo4j
|
+-- 벡터 --> Pinecone, Milvus
|
+-- 시계열 --> TimescaleDB, InfluxDB
6. 비용 비교 (참고)¶
| DB | 라이선스 | 관리형 서비스 (월) |
|---|---|---|
| PostgreSQL | 무료 | AWS RDS: $50~ |
| MySQL | 무료 | AWS RDS: $30~ |
| Oracle | $47,500/프로세서 | AWS RDS: $500~ |
| MS SQL Server | $3,586/코어 | AWS RDS: $200~ |
| MongoDB | 무료 (Community) | Atlas: $57~ |
| Redis | 무료 | ElastiCache: $30~ |
| Elasticsearch | 무료 (OSS) | OpenSearch: $80~ |
7. 마이그레이션 고려사항¶
7.1 Oracle에서 PostgreSQL¶
호환성:
- PL/SQL → PL/pgSQL (변환 필요)
- 시퀀스: 유사하나 문법 차이
- 날짜 함수: 차이 있음
- NULL 처리: Oracle은 빈 문자열=NULL
도구:
- ora2pg: Oracle → PostgreSQL 변환 도구
- AWS SCT: Schema Conversion Tool
7.2 MySQL에서 PostgreSQL¶
호환성:
- AUTO_INCREMENT → SERIAL
- LIMIT/OFFSET: 동일
- 문자열 연결: CONCAT vs ||
- 대소문자: MySQL 기본 대소문자 구분 안함
주의점:
- 인덱스 힌트 문법 차이
- 저장 프로시저 재작성 필요
8. 실무 조합 패턴¶
8.1 웹 서비스¶
[User] --> [API Server] --> [PostgreSQL] (메인 데이터)
|
+--> [Redis] (캐시, 세션)
|
+--> [Elasticsearch] (검색)
8.2 AI/RAG 시스템¶
[User] --> [LLM Service] --> [pgvector] (벡터 검색)
|
+--> [Redis] (LLM 응답 캐시)
|
+--> [PostgreSQL] (메타데이터)