Develop/CS

NoSQL이란?

연로그 2021. 11. 18. 17:28
반응형

이번에 토이 프로젝트를 만들기 앞서 NoSQL에 대해 이야기가 나왔다.

대용량 데이터를 처리하는데 쓴다... 정도로만 알고 있어서 한 번 정리해보기로 한다.

 


NoSQL이란?

 

  • 비관계형 데이터베이스 (<-> RDBS: 관계형 데이터베이스)
  • ACID 특성을 제공하지 않음
  • 확장성, 가용성, 높은 성능
  • 데이터 저장 및 검색을 위해 특화된 매커니즘 제공
  • = No SQL, Not Only SQL, Non-Relational Operational Database, ...

 

🔻 ACID란?

더보기

데이터베이스 트랜잭션의 안전한 수행을 보장하기 위한 성질

 

Atomicity; 원자성

  • 각 트랜잭션들이 단일 단위로 취급하도록 보장
  • 트랜잭션 연산이 DB 모두에 반영되도록 commit 또는 전혀 반영되지 않도록 rollback
  • 모든 명령은 반드시 완벽히 수행되어야 함
    (오류나 일부만 수행 시 트랜잭션 전부 취소)

 

Consistency; 일관성

  • 시스템이 가진 고정 요소의 상태는 트랜잭션 수행 전후가 같아야 함

 

Isolation; 독립성; 격리성

  • 병행 실행하는 경우 하나의 트랜잭션이 실행하는 중에 다른 트랜잭션 연산이 낄 수 없음
  • 수행 중인 트랜잭션은 완료 전까지 다른 트랜잭션에서 결과를 참조할 수 없음

 

Durability; 영속성; 지속성

  • 성공적으로 완료된 트랜잭션 결과는 시스템이 고장나도 영구적으로 반영됨

 

1. Multiple 쿼리

  • 쿼리 하나로 모든 데이터를 검색하기 보다는 원하는 데이터 검색을 위해 여러 쿼리 수행이 일반적임
  • NoSQL 쿼리들은 전통적인 SQL 쿼리들보다 빠르므로 추가적인 쿼리 비용도 수용할 수 있음
  • 💡 굉장히 많은 수의 쿼리를 꼭 필요로 한다면 2, 3 방안이 더 적합

 

2. 캐싱, 복제, 비정규화 데이터

  • 외래키를 저장하는 것보다는 외래 값을 모델 데이터와 함께 저장하는 것이 일반적
  • ex: 각 블로그들의 코멘트들은 사용자 ID와 함께 사용자 이름이 포함될 수 있음.
    -> 다른 조회 없이 사용자 이름에 쉽게 액세스되면 좋음.
    ❓ 만약, 사용자 이름이 변경된다면? DB의 여러 위치에서 변경해야 함.
    💡 write보다 read가 일반적일 때 더 효율이 좋음

 

3. 중첩 데이터

  • 문서형 DB를 제외하고는 collections의 수에 비해 더 많은 데이터를 넣는 것이 일반적
  • ex: 블로그 게시글 내의 댓글을 저장하도록 선택해 한 번의 검색으로 모든 댓글 조회
    💡 단일 문서 내에 특정 작업에 필요한 모든 데이터가 포함

 


NoSQL의 종류

 

Type NoSQL DB
Key–value cache Apache Ignite, Couchbase, Coherence, eXtreme Scale, Hazelcast, Infinispan, Memcached, Redis, Velocity
Key–value store Azure Cosmos DB, ArangoDB, Aerospike, Couchbase, Redis
Key–value store
(eventually consistent)
Azure Cosmos DB, Oracle NoSQL Database, Dynamo, Riak, Voldemort
Key–value store
(ordered)
FoundationDB, InfinityDB, LMDB, MemcacheDB
Tuple store Apache River, GigaSpaces
Object database Objectivity/DB, Perst, ZopeDB
Document store Azure Cosmos DB, ArangoDB, BaseX, Clusterpoint, Couchbase, CouchDB, DocumentDB, eXist-db, IBM Domino, MarkLogic, MongoDB, Qizx, RethinkDB, Elasticsearch
Wide Column Store Azure Cosmos DB, Amazon DynamoDB, Bigtable, Cassandra, Google Cloud Datastore, HBase, Hypertable,
Native multi-model
database
ArangoDB, Azure Cosmos DB, OrientDB, MarkLogic

 

Key-Value store

  • associative array (map이나 dictionary 같은) 사용
  • key-value 쌍으로 나타냄
  • 다른 유형의 DB로는 불가능한 범위까지 수평 확장 가능

 

Document store

  • JSON, XML 등 형태로 표시
  • 문서를 나타내는 고유한 key를 통해 DB에서 주소 지정됨

 

Graph

  • 유한한 수의 관계로 연결된 요소로 구성된 그래프로 표현되는 데이터를 위해 설계
  • 소셜 네트워킹, 로드맵, 사기 감지 등

 


+ 프로젝트 적용 건에 대해...

실시간으로 반응을 확인하는 좋아요 기능이 있어서 도입하면 좋을 것 같다는 생각이 들었다.

NoSQL을 찾다보니 처음 사용해보는 사람들은 MongoDB나 Redis를 자주 사용하는 것 같다.

MongoDB는 문서 데이터베이스라 JSON와 유사한 형태로 데이터를 저장되는 것도 장점인 것 같다.

Redis와 Mongo DB를 함께 사용해서 Redis는 데이터를 캐시에 저장하고 Mongo DB는 디스크에 저장하는 형식도 있는 것 같은데.. 해당 부분에 대해서는 팀원들과 논의 후 결정 해야겠다.


참고

  1. 시나공 정보처리기사 필기
  2. en.wikipedia - NoSQL
반응형