본문 바로가기
코드스테이츠 AI 부트캠프/Section 4

NoSQL(Not Only SQL)

by yunyoung424 2023. 6. 2.

NoSQL (2023.06.01)

 

SQL은 많이 들어봤는데 NoSQL은 처음 듣고 접해봤다.
데이터의 형태가 고정되어 있지 않은 비관계형 데이터 베이스라니 데이터의 세계는 정말 무궁무진하구나..!!


[ 주요 개념]

NoSQL 단어의 유래

  • 조핸 오스카슨(Johan Oskarsson)이라는 사람이 2009년 6월 샌프란시스코에서 조직한 모임에서 관계형 데이터 모델을 쓰지 않는 연구를 빠른 시간에 다양한 사람들과 논의하고 싶었고, 사람들을 모을 가장 효과적인 방법으로 트위터의 해시태그를 이용하는 방법을 생각해냈다고 한다. 짧고, 해시태그로 중복되지 않으면서, 부정적이어서 사람의 관심을 이끌 수 있는 단어를 생각하다가 # NoSQL 을 생각해 냈고, 그 단어가 현재 비관계형 데이터베이스 기술을 아우르는 말이 되었다고 한다.
  • reference : "NoSQL Distilled: ABrief Guide to the Emerging World of Polyglot Persistence"

 

NoSQL이 등장한 시대적 배경 (Web, Cluster)

NoSQL은 2000년대 초 웹 환경에서 발생하는 데이터를 다루기 위해 많이 사용되기 시작했다.

  • Web 시장의 발전과 함께 데이터 소스와 데이터의 양이 폭발적으로 증가하기 시작했다.
  • 웹 서비스 데이터 처리는 보통 xml, json 등으로 처리되는데, 관계형 데이터베이스로 처리하기에는 데이터 설계시간이 오래 걸리기 시작했다.
  • 하나의 서버를 크게 만드는 것보다, 여러개의 서버를 연결시켜 확장하는 방법이 더 적은 비용이 든다. (수직확장 -> 수평확장)

 

RDB(관계형 데이터베이스) vs. NoSQL(비관계형 데이터베이스)

데이터베이스→ 관계형 데이터베이스 & 비관계형 데이터베이스

  • 관계형 데이터베이스 :
    • SQL 기반
    • 사전에 테이블을 정의 한 후 알맞은 형태의 데이터만 넣을 수 있음
    • 행과 열로 구성된 테이블에 데이터 저장
    • 각 행은 하나의 속성에 대한 정보, 열은 데이터 형식에 맞는 데이터 저장
    • 특정 형식을 지키기 때문에 꺼낼 때는 수월함
    • 스키마가 뚜렷하다 → 테이블 간 관계가 어떻게 되는지 알 수 있음
    • MySQL, Oracle, SQLite, PostgresSQL, MariaDB
  • 비관계형 데이터베이스 :
    • NoSQL(Not Only SQL)
    • 데이터가 고정되어 있지 않은 데이터베이스 형태들을 주로 가리킴
    • 데이터를 읽어올 때 스키마에 따라 읽어온다.(schema on read)
    • 어떻게 쓰냐가 결국에는 어떻게 읽어와야 하는지에 영향을 미친다!!

 

SQL vs NoSQL

  1. 데이터 저장(Storage)
    • 관계형 데이터베이스 :
      → SQL을 이용해서 데이터를 테이블에 저장, 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장해야 함
    • NoSQL :
      → key-value, document, graph, wide-column 형식 등의 방식으로 데이터를 저장 가능
  2. 스키마(Schema)
    • SQL : 형식이 고정된 스키마 필요
      → 스키마는 추후 변경 가능하지만 전체 db를 수정하거나 오프라인(down-time)으로 전환해야 함
    • NoSQL : 스키마 형태가 동적
      → 행을 추가할 때 열을 같이 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력하지 않아도 된다는 장점이 있다.
  3. 쿼리(Querying)
    • 쿼리 : db에 정보를 요청하는 행동.
    • 관계형 데이터베이스 : 테이블의 형식과 테이블 간의 관계에 맞춰서 데이터를 요청, SQL과 같은 구조화된 쿼리 언어를 정보 요청에 사용함
    • 비관계형 데이터베이스 : 데이터 그룹 자체를 조회하는 것에 초점을 둠, 구조화되지 않은 쿼리언어(UnQL(UnStructured Query Language))로 데이터 요청이 가능
  4. 확장성(Scalability)
    • SQL 기반의 관계형 데이터베이스 :
      • 수직적 확장(높은 메모리, CPU를 사용하는 확장) → 성능을 많이 쓰기 때문에 비용⬆️
      • 복수의 서버에 걸쳐서 db 관계 정의 가능하지만 매우 복잡하고 시간이 많이 소모됨
    • NoSQL로 구성된 데이터베이스 :
      • 수평적 확장(보다 값싼 서버 증설, 또는 클라우드 서비스 이용하는 확장)
      • 많은 트래픽을 처리할 수 있도록 NoSQL 데이터베이스를 위한 서버를 추가적으로 구축하는 것이 편함
      • 저렴한 범용 하드웨어나 클라우드 기반의 인스턴스에 NoSQL 데이터베이스를 호스팅 할 수 있어 비용 효율성이 높음

 

SQL과 NoSQL 중 어떤 것을 사용해야 할까?

데이터베이스를 구축하는 방법을 선택하는 것에 완벽한 솔루션은 없다.

⇒ 서비스에 맞고 유저의 요구를 충족하기 위해 여러 사례를 보고 적절한 데이터베이스를 선택하는 것이 중요

 

SQL 기반의 관계형 데이터베이스를 사용하는 경우

  1. 데이터베이스의 ACID 성질을 준수해야 하는 경우
  2. 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우

 

NoSQL 기반의 데이터베이스를 사용하는 경우

  1. 데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우
  2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
  3. 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트 하는 경우

 

대표적인 NoSQL의 종류

  • Key-Value 타입 : 데이터를 Key-Value의 쌍을 속성으로 하는 배열 형태로 저장
    • Key : 속성 이름
    • Value : 속성에 연결된 데이터 값
    • 대표적인 Key-Value 형식의 데이터베이스 : Redis, Dynamo 
  • 문서형(Document) 데이터베이스 : 데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스를 의미
    • 보통 JSON 유사 형식으로 데이터를 문서화
    • 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리한다.
    • 대표적인 문서형 데이터베이스 : MongoDB
  • Wide-Column 데이터베이스 : 데이터베이스의 열(column)의 데이터 관리에 집중하는 데이터베이스
    • 각 열은 key-value 형식으로 데이터가 저장되고, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터를 처리
    • 하나의 행에 많은 열을 포함할 수 있다 ⇒ 높은 유연성 자랑
    • 데이터 처리에 필요한 열을 유연하게 선택할 수 있다는 점에서 규모가 큰 데이터 분석에 주로 사용됨
    • 대표적인 wide-column 데이터베이스 : Cassandra, HBase

[ MongoDB 실습 ]

파이썬과 연결하기

pymongo 에서 데이터베이스에 연결해줄 클라이언트 MongoClient 불러오기

from pymongo import MongoClient

client = MongoClient({URI})

 

 

from pymongo import MongoClient

HOST = '호스트주소'
USER = 'user 이름'
PASSWORD = '비밀번호'
DATABASE_NAME = '데이터베이스이름'
COLLECTION_NAME = 'collection이름'
MONGO_URI = f"mongodb+srv://{USER}:{PASSWORD}@{HOST}/{DATABASE_NAME}?retryWrites=true&w=majority"


# MongoClient를 사용하여 연결
client = MongoClient({MONGO_URI})

# 데이터베이스 선택
database = client[DATABASE_NAME]

# collection 선택
collection = database[COLLECTION_NAME]

# collection에 데이터 삽입 - 1개 : insert_one, 여러개 : insert_many
collection.insert_many(data)

 

 

  • MongoDB는 각 문서에 고유번호(_id ) 부여 → 각 문서 구분 가능하게 하기 위함, 해당 고유번호는 변경 가능 but 중복되면 안됨!!

댓글