NoSQL

코난·2023년 11월 9일
0

CS 면접 정리

목록 보기
14/67

개념

not only sql이라는 뜻으로 비관계형 데이터베이스 유형을 가리키며 관계형 테이블과는 다른 형식으로 데이터를 저장한다. 높은 확장성과 가용성이 주요 장점이기 때문에 실시간 웹 어플리케이션 및 빅데이터에 널리 사용된다.

SQL VS NoSQL

SQL

  • 장점
    • 명확하게 정의된 스키마
    • 데이터 무결성 보장
  • 단점
    • 상대적으로 덜 유연
    • 데이터 스키마는 사전에 계획되고 알려져야 함
    • 관계를 맺고 있어 매우 복잡한 쿼리 만들어질 가능성 높음(JOIN 연산)
    • 수평적 확장이 어렵고 대체로 수직적 확장만 가능 (처리량과 관련하여 성장 한계에 직면하게 될 가능성 있음)

NoSQL

  • 장점
    • 스키마가 없어 유연함(언제든지 데이터 조정하고 새로운 필드 추가 가능)
    • 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. (읽는 속도 빨라짐)
    • 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기/쓰기 요청 처리 가능
  • 단점
    • 유연성때문에 데이터 구조 결정 못하고 미룰 수 있음
    • 데이터 중복은 여러 컬렉션과 문서가 변경된 경우 업데이트를 해야함
    • 여러 컬렉션에 데이터가 중복되어 있기 때문에 수정을 하는 경우 모든 컬렉션에서 수행해야 함

사용하면 좋은 경우

  • SQL
    • 관계를 맺고 있는 데이터가 자주 변경되는 경우 사용
    • 변경될 여지가 없고 명확한 스키마가 사용자와 데이터에게 중요한 경우
  • NoSQL
    • 정확한 데이터 구조를 알 수 없거나 변경/확장될 수 있는 경우
    • 읽기 처리를 자주하지만, 데이터를 자주 변경하지 않는 경우
    • 데이터베이스를 수평으로 확장해야 하는 경우

NoSQL의 종류

Key-Value

  • 키와 값으로 이루어진 저장과 조회라는 가장 간단한 원칙에 충실한 데이터베이스이다.
  • 가장 기본적인 패턴으로 key, value가 하나의 묶음으로 저장되며 단순한 구조라 속도가 빠르고 분산 저장시 용이하다.
  • key 안에 (Column, Value) 형태로 된 여러개의 필드를 갖는다.
    값에 모든 데이터타입을 허용한다. -> 입력 검증 로직 별도로 필요하다.
  • 조인을 고려하지 않으므로 외부키나 constraints 등이 필요 없다.

사용하는 경우

  • 성능 향상을 위해 RDB에서 데이터 캐싱
  • 웹 어플리케이션에서 일시적인 속성 추적(ex. 장바구니)
  • 모바일 어플리케이션용 사용자 데이터 정보와 구성 정보 저장
  • 이미지나오디오 파일 같은 대용량 객체 저장

종류

Redis, Riak, Oracle Berkely, AWS DynamoDB

Document

  • 계층적 트리 데이터 방식으로 저장한다.(XML, JSON, BSON)
  • _id : PK, RowID를 가진다.
  • 집합적 데이터 모델이기에 RDB에서의 여러개 테이블 데이터를 하나의 Document에 모아둘 수 있다. (Join 기능 대체)
  • 컬럼이 없기에 스키마도 없다.
  • Document 내에 Field를 정의한다. (Key에 대한 값은 Document가 될 수 있다.)
  • key-value 와의 차이는 DB에 값을 문서로 저장한다는 점이다.
  • 데이터를 여러 서버에 분산 저장 가능하고, 복제와 회복이 가능한 형태이다. 장애가 발생하더라도 대응에 유리하다.

사용하는 경우

  • 대용량 데이터를 읽고 쓰는 웹 사이트용 백엔드 지원
  • 제품처럼 다양한 속성이 있는 데이터 관리
  • 다양한 유형의 메타데이터 추적
  • JSON 데이터 구조를 사용하는 애플리케이션
  • 비정규화된 중첩 구조의 데이터를 사용하는 애플리케이션

종류

MongoDB, Azure Cosmos DB, CouchDB, MarkLogic, OrientDB

Wide Column

  • 행마다 키와 해당값을 저장할때마다 각각 다른값의 다른 수의 스키마를 가질 수 있다.
  • Wide Column Database는 대량의 데이터의 압축, 분산처리, 집계처리 및 쿼리 동작 속도 그리고 확장성이 뛰어나다.

종류

Cassandra, HBase, Google BigTable, Vertica, Druid, Accumulo, HyperTable

Graph

  • 데이터를 노드로 표현하며, 노드 사이의 관계를 엣지로 표현한다.
  • RDBMS보다 Performance가 좋고 유연하며 유지보수에 용이한 것이 특징이다.
  • Social Networks, Network Diagrams 등에 사용된다.

종류

Neo4j, Blazegraph, OrientDB, AgensGraph

락킹

대부분의 RDBMS가 Row 단위의 Lock을 사용하지만 많은 NoSQL은 DB단위의 Lock을 사용한다.
그래서 대용량 데이터가 Insert 되는 경우 사실상 데이터베이스가 정지된다고 봐야한다. 왜냐하면 Write Lock과 Read Lock 중 Write Lock이 우선시되면서 Write 중에는 Read가 Queue에 대기하게 되기 때문이다. 따라서 해당 Insert가 종료되기 전까지는 Read조차 불가능하게 되는 것이다.

Redis(레디스)

한마디로 저장하면 고성능을 가지고 있는 Key-Value 타입의 저장소로서 문자열, 리스트, 해시, 셋, 정렬된 셋 형식의 데이터를 지원하는 NoSQL이다.

Redis 영속성

레디스는 지속성을 보장하기 위해 데이터를 DISK에 저장할 수 있다. 서버가 내려가더라도 DISK에 저장된 데이터를 읽어서 메모리에 로딩을 한다.

데이터를 DISK에 저장하는 방식은 크게 두 가지 방식이 있다.

  • RDB(Snapshotting) 방식
    순간적으로 메모리에 있는 내용을 DISK에 전체를 옮겨 담는 방식
  • AOF (Append On File) 방식
    Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태

Redis에 저장할 수 있는 Value는 5가지 정도이다.

  • String (text, binary data) - 512MB까지 저장이 가능함
  • set (String 집합)
  • sorted set (set을 정렬해둔 상태)
  • Hash
  • List (양방향 연결리스트도 가능)

참고

https://velog.io/@swhan9404/NoSQL-%EC%9D%98-%EC%A2%85%EB%A5%98%EB%B3%84-%ED%8A%B9%EC%A7%95
https://devlog-wjdrbs96.tistory.com/374
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/Redis.md

profile
몸은 커졌어도, 머리는 그대로... 하지만 불가능을 모르는 명탐정 현아! 진실은 언제나 하나!

0개의 댓글