데이터 베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않는다.
그러나 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 커져 느려질 수 있다.
많은 양의 I/O를 발생시키는 데이터의 경우(조회수 같은 카운트 형태) Redis를 사용해 데이터를 캐싱 처리하고, 일정 주기에 따라 RDS에 업데이트하면 RDS에 가해지는 부담을 줄일 수 있다.
cache : 한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결괏값을 받을 수 있도록 도와주는 공간
▮Redis 특징
데이터를 하드 디스크가 아닌 RAM에 저장(In-memory) → 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠름
Key, Value 구조이기 때문에 쿼리를 사용할 필요 없음
2. Relational Database
▮ RDMBS 특징
2차원 구조 모델(열 : 속성, 행 : 튜플, 데이터) == 테이블 형식
ACID(원자성, 일관성, 독립성, 지속성) 트랜잭션 보장 → 모든 규칙에 따라서 일관성을 가지게 함으로써 오류, 시스템 충돌과 같은 문제가 없는지 확인하여 데이터 무결성, 완전성, 정확성을 보장 → 정확도가 매우 중요한 서비스라면 해당 데이터베이스를 사용
Structed Query Language(SQL)를 사용해서 데이터 접근을 하며 CRUD 조작을 허용
데이터를 정규화해서 저장
3. Graph Database
노드와 관계로 구성된 데이터베이스
SNS 친구 관계, 추천 서비스 등에서 사용
4. Document Database
필드와 값의 형태로 구성된 데이터를 JSON 포맷으로 관리
값을 저장하기 전에 schema를 별도로 정의하지 않으며, 문서를 추가하면 그게 schema가 됨
정규화 없이 사용
분산처리가 잘 되기 때문에 SNS, 실시간 채팅 등에 사용 → 그러나 일관성이 떨어질 수 있음
5. Column-family Database
Column과 Row와 같이 Relation Database와 동일한 용어를 사용하여 스키마를 정의
그러나 테이블 간 조인을 지원하지 않음 RDB의 경우 고객의 기본 정보 테이블(이름, 주소 등)과 고객의 주문 정보 테이블 처럼 나누어서 저장하고 조인을 통해 객체의 정보를 활용하지만, Column Family DB는 비정규화되어있기 때문에 한 객체와 관련된 모든 정보를 위 그림처럼 단일 Row에 넣어서 보관함 (수백만개의 컬럼을 보관할 수 도 있음)
대용량 데이터, 읽기와 쓰기 성능, 고가용성을 위해 설계
아래와 같은 경우에 사용함 1. 데이터베이스에 쓰기 작업이 많은 애플리케이션 2. 지리적으로 여러 데이터 센터에 분산되어 있는 애플리케이션 3. 복제본 데이터가 단기적으로 불일치하더라도 큰 문제가 없는 애플리케이션
6. Search Engine
index 보관에 특화
RDB의 경우, CRUD를 하기 위해서는 클라이언트에서 관계형 DB가 있는 서버에 연결을 맺어 SQL을 날리는 방식, 엘라스틱서치의 경우에는 데이터를 CRUD하기 위해서RESTful API 방식 이용