본문 바로가기
IT

문서(document) 데이터베이스 / 대표적인 것은 몽고DB

by laoching 2023. 10. 29.
728x90
반응형

문서 db는 문서를 저장하고 조회한다. ex) XML, JSON, BSON 등등..

 

여기서 문서는 맵이나 컬렉션, 스칼라 값을 포함할 수 있는 자체 기술적, 계층적 트리 데이터 구조임.

 

오라클 vs 몽고DB

용어의 차이가 있다.

오라클 몽고DB
스키마 DB
테이블 컬렉션
문서
rowid _id (모든 문서에 있는 특별한 필드, 유일하기만 하면 사용자 설정 가능)

 

document db의 형태
{
"key": "1",
"key1": "a"
"key2": [ "b", "c"]
"key3": [ { "food": "pizza", "price": 200000 } ]
}

관계형 DB는 모든 행이 같은 스키마를 따라야 한다.

하지만 문서 DB는 스키마가 없어서 문자열이 들어가던 숫자가 들어가던 관계 없다.

 

관계형 DB는 모든 칼럼을 정의해야 하지만, 문서 DB는 그럴 필요가 없음

또 데이터를 가지고 있지 않으면 속성이 설정되지 않았거나 문서와 관계 없다고 가정한다.

 

문서 DB 종류

몽고DB, 카우치DB, 테라스토어, 오리엔트DB 등등..

 

몽고DB의 일관성

몽고DB는 복제본 집합(replica set)을 사용해 일관성 수준을 설정한다. 쓰기가 모든 슬레이브에 복제될 때까지 기다리거나, 설정한 수의 슬레이브에 복제될 때까지만 기다리던지 선택 가능하다.

(* 일관성 : 트랜잭션이 일어난 이후의 DB는 DB의 제약이나 규칙을 만족해야 함)

 

트랜잭션

관계형 DB에서의 트랜잭션은 insert, update, delete 명령으로 여러 테이블에 걸쳐 DB를 변경한 다음 commit이나 rollback으로 변경 사항을 유지할지 말지 결정할 수 있게 하는 기느이다.

 

하지만 NoSQL에서는 유효하지 않은 개념임. NoSQL은 성공 or 실패 밖에 없음

이를 원자적 트랜잭션이라 하며, 모든 쓰기는 기본적으로 성공이라 보고한다.

 

WriteConcern 파라미터를 사용해 안전성 수준을 조정할 수 있고, WriteConcern.REPLICAS_SAFE를 통해 둘 이상의 노드에 쓰기가 완료된 다음에 쓰기가 성공했다고 보고할 수 있다. 

 

*writeconcern에 대한 설명

Write Concern — MongoDB Manual

 

Write Concern — MongoDB Manual

Docs Home → MongoDB Manual Write concern describes the level of acknowledgment requested from MongoDB for write operations to a standalone mongod or to Replica sets or to sharded clusters. In sharded clusters, mongos instances will pass the write concern

www.mongodb.com

 

가용성

보통 문서DB는 마스터-슬레이브 설정으로 데이터를 복제해 가용성을 높인다. 여러 노드에 같은 데이터 뿌려놓고 하나 뻗으면 다른 곳에 있는걸 쓰는 방식으로다가..

 

몽고DB는 복제를 수행하고 복제본 집합을 사용해 고가용성을 제공함

 

* 복제본 집합 : 비동기 마스터-슬레이브 복제의 한 형태로, 둘 이상의 노드로 구성된다. 

모든 요청은 마스터 노드로 가고, 데이터는 슬레이브 노드로 복제된다. 마스터 노드가 뻗으면 복제본 집합에서 남은 노드가 투표를 통해 새로운 마스터를 선정함.

그리고 새로 뽑힌 마스터가 요청을 다 받고, 아까 뻗은 노드가 다시 살아나면 슬레이브로 참여한다. 

 

조회 쿼리 비교

select * from order 

-> db.order.find()

 

select * from order where customer = 'sss'

-> db.order.find({"customer":"sss"})

 

select * from a, b, c where a.id = b.id and b.pid = c.pid and c.name like '%RRR%'

-> db.orders.find({"b.c.name":/RRR/})

 

몽고 쿼리가 더 간단하다.

 

확장성

노드를 추가하거나 DB 스토리지를 변경하는 행위

-> DB의 어떤 기능이 더 많은 부하를 처리할 수 있을까?

 

* 읽기 부하 확장성: 읽기 슬레이브를 추가해 읽기 요청을 슬레이브에서 처리하자

* 쓰기 확장이 필요하면 데이터 샤딩을 하자.

 

사용처

* 이벤트 로깅

 

* 콘텐츠 관리 시스템, 블로깅 플랫폼 

-> 스키마가 없고 JSON을 이해하는 문서 DB의 특징 이용

 

* 웹 분석 또는 실시간 분석

-> 스키마 변경 없이 새로운 측정 기준 추가 가능!

 

* 전자상거래 app

-> DB 리팩터링이나 데이터 전환 없이 데이터 모델 개발 가능

728x90
반응형

댓글