데이터베이스 - otw7917/oig GitHub Wiki

데이터베이스

도입

왜 나는 NoSQL 데이터베이스에 관심을 갖게 되었는가? -> 유연한 스키마

  • 메타버스 아카데미에서 유니티 팀과 융합프로젝트를 진행하는중 처음 찾아봤던 문제였다. 한달간 진행한 프로젝트인데 어려웠던 점은 계속해서 스펙이 변경된다는점?
  • 데이터베이스 정규화하고 엔티티 설계하고 하는 과정이 반복되는게 힘들었다.
  • (분명 스케일 아웃하기 쉽게 설계하는 방법도 있을거고 했겠지만, 이 부분은 나중에 더 찾아봐야겠다.)

그렇다면 NoSQL에는 무엇이 있는가?

  • RDBMS의 반대는 non RDBMS, 뭔가 정확하게 분류하는 단어는 이게 최고 인거 같다. 여기서 중요한건 MongoDB(Document DB)만 Nosql이 아니고 Redis(key-value), Neo4j(Graph DB), Cassandra(wide-column store) 등 다양하게 있다.

구조에 따른 분류

구조 설명 대표 제품
JSON-like Document 객체 구조로 데이터 저장 (유연한 스키마) MongoDB, Couchbase, Amazon DocumentDB
Key ↔ Value 단순하고 빠른 읽기/쓰기 Redis, DynamoDB, Riak, KeyDB
Column Family 구조 대규모 분산 테이블 기반 Apache Cassandra, HBase, ScyllaDB
Node ↔ Edge 구조 관계 중심 데이터 처리에 최적화 Neo4j, Amazon Neptune, ArangoDB

유즈케이스에 따른 분류

목적 적합한 NoSQL DB
실시간 캐시, 세션 저장 Redis (Key-Value)
유저 프로필, 게시글 MongoDB (Document)
수억 건의 로그 분석 Cassandra, HBase (Wide-Column)
소셜 그래프, 추천 시스템 Neo4j (Graph)

  • 아무래도 공부해본 내용이 MySQL과의 비교가 많을듯하다.
항목 MySQL MongoDB
분류 RDBMS (관계형 DBMS) Document-Oriented NoSQL DBMS
저장 단위 Row (행) Document (JSON/BSON 객체)
저장 구조 Table + Schema (정형) Collection + 유연한 구조 (비정형)
관계 표현 JOIN 기반 Embedded Document or Reference
쿼리 언어 SQL MongoDB Query Language (MQL)
트랜잭션 강력한 ACID 보장 기본은 약하지만, 일부 지원 (multi-doc은 제한적)

  • 그럼 다시 도입으로 돌아와서 스키마의 유연성만 얘기했다. 그 외에도 장점이 있다.

  • 그래서 RDBMS의 장점들의 그림자를 찾아보면, 즉 한계를 찾아보면

  • 정형화된 스키마 -> 비정형 데이터 처리 어려움

  • 고정된 스키마 -> 데이터 구조가 자주 바뀌는 문제에 대한 대응

  • 무결성과 일관성 유지 -> (트랜잭션마다 FK, 제약조건, 충돌방지) -> I/O 부하 상승 -> write 부하 상승

  • -> 이렇게 되면 RDBMS 한계들이 NoSQL 사용을 앞당기고 있다.

그로써리

정규화 - normalization : 중복하는 데이터를 없애고 논리적으로 나누는 과정

RDBMS : 관계형 데이터베이스

  • ACID
속성 의미 설명
A - Atomicity 원자성 트랜잭션은 모두 실행되거나 전혀 실행되지 않아야 함 (All or Nothing)
C - Consistency 정합성 트랜잭션 전후 데이터 상태는 항상 정의된 규칙을 만족해야 함(외래키, 제약조건 만족)
I - Isolation 격리성 여러 트랜잭션이 동시에 실행돼도 서로 간섭 없이 독립적으로 처리되어야 함
D - Durability 지속성 트랜잭션이 커밋된 후에는 시스템 장애가 발생해도 결과는 보존되어야 함

  • 트랜잭션 (Transaction) : 데이터베이스에서 이루어지는 일련의 논리적 연산 과정 BEGIN -> [UPDATE] -> COMMIT or ROLLBACK

B-Tree

  • Balanced Tree의 일종으로 다중 자식을 가질 수 있는 이진탐색 트리.
  • 모든 노드는 키 값을 정렬된 순서로 유지
  • 모든 리프 노드는 같은 깊이
  • 한 노드가 최대 M개의 자식(M은 트리 차수)
  • 한 노드에 여러 키를 담아 I/O 줄이는 디스크 친화적
  • 탐색, 삽입, 삭제 O(logn) 성능 보장

RDB 인덱스에 많이 쓰이는 이유?

  • MySQL, InnoDB, PostgreSQL등 사용됨 (구현은 b+tree)
  • 정렬된 구조 -> 빠른 범위 검색
  • 검색 속도 예측 가능 -> 균형 유지