Order 주문 테이블에는 주문번호, 상품번호 등등이 존재하는 상태에서 로켓배송을 하고 싶은 경우 로켓배송 여부를 판단하는 column을 추가할 수 있다.
만약 이벤트를 진행할 경우 어떻게 해야할까 ? column을 추가하여 다시 schema를 변경해야한다.
이미 데이터가 5천만개 있는 테이블에 새로운 column을 추가하게 될 경우 기존에 존재하던 5천만건의 데이터의 event_id는 null로 입력이된다.
relational database는 경직된 스키마를 가지며, 유연한 확장성이 부족하다.
relational database는 중복 제거를 위해 정규화를 진행한다.
데이터를 가져올게 될 경우 복잡한 join은 cpu 사용량이 증가하여 성능이 하락된다.
RDB는 기본적으로 한대의 컴퓨터에 저장하고 사용한다. 만약 DB서버에 많은 요청이 오게 될 경우 scale up을 통한 database 성능을 향상시켜야한다.
scale up : 더 좋은 성능을 가진 컴퓨터로 교체 (CPU, Memory, HDD, SDD등 교체. DB 서버의 성능 향상) or Replication.
Replication 후 secondary server는 read-only로만 구성했는데, write 트래픽이 증가하는 경우 primary server에서 모든 write 트래픽을 감당해야한다.
scale out : 데이터 베이스 서버를 추가하여 성능을 향상시킨다.
일반적으로 RDB는 scale-out에 유연하지 않다. 서버를 추가하게 되는 경우 데이터를 모두 옮겨주고 복사해야한다.
트랜잭션의 ACID는 좋은 기능이지만, 성능에 영향을 미친다.
인터넷의 보급이 많아지고, 트래픽이 증가함에 따라 RDBMS만으로 해결하기 어려운 성능 문제가 발생한다.
때문에 high-throughput(높은 응답률), low-latency(짧은 응답시간)이 요구되며, 비정형 데이터의 증가(Schema를 미리 정해준 상태에서 데이터를 추가하지 않는 데이터)
RDB는 스키마를 구성하고 테이블을 생성하는 반면, NoSQL은 컬렉션(=테이블)을 스키마 구성없이 생성할 수 있다.
db.createCollection("컬렉션명")
db.컬렉션명.insertOne({프로퍼티 : 벨류})
스키마가 정의되어 있지 않기 때문에, 원하는 형태로 데이터를 넣을 수 있다. 몽고DB는 JSON 형태로 값을 받는다.
db.컬렉션명.find({프로퍼티 : 벨류})
조건문도 JSON 형태로 작성한다. 해당 컬렉션에 존재하는 모든 데이터가 나오는게 아닌, 조건문에 해당하는 데이터만 리턴
db.컬렉션.find({})
해당 컬렉션에 존재하는 모든 데이터를 찾는다.
단, RDBMS의 경우 schema 관리를 데이터베이스에서 하지만, NoSQL의 경우 application level에서 schema를 관리해야한다.
user_name, phone_number등 데이터의 중복이 발생한다. RDB의 경우 중복을 회피하기 위해 사용자 정보를 다른 table에 저장한다.
join을 할 필요성이 사라지기 때문에 조회속도가 빠르다.
중복된 데이터들이 많기 때문에 application 레벨에서 모두 최신 데이터를 유지할 수 있도록 관리가 필요하다.
RBDMS에 비해 scale-out이 편리하여 서버를 증설하기 쉽다.
서버 여러개로 하나의 클러스터(cluster)를 구성하여 사용.
일반적으로 각각의 서버는 데이터들을 나눠서 저장하고 중복을 허용하기 때문에 특정 컬렉션 조회 시 담당 서버에서 데이터를 read하면 된다.
ACID의 일부를 포기하고, high-throughput, low-latency를 추구한다.
금융 시스템처럼 consistency(일관성)이 중요한 환경에서는 사용하기가 어렵다.
HDD를 사용하지 않고 메모리를 사용하여 키,벨류 형태로 데이터, 캐시를 저장한다.
redis > SET name easycode
-- SET 키 벨류
redis > GET name //easycode
-- GET 키
여러 타입의 데이터를 가질 수 있다.
해시 기반 샤딩 클러스터, 고 가용성을 보장한다.
Redis는 Memory를 사용하기 때문에 SSD보다 빠른 처리속도를 가진다.
사용자의 요청이 들어오면 백엔드 서버를 값을 처리하고 데이터베이스 서버로 부터 데이터를 read한다.
Redis에 데이터가 존재하지 않으면 첫 read는 데이터베이스에서 가져오고 그 이후에 백엔드 서버는 redis에 해당 데이터를 저장한다.