데이터베이스 - 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)
- 정렬된 구조 -> 빠른 범위 검색
- 검색 속도 예측 가능 -> 균형 유지