DAY 44 [N324]

NoSQL(Not Only SQL)


  • 몽고DB, CouchDB, 카산드라, LevelDB 등

SQL과 NoSQL의 차이점

데이터 저장

  • SQL : 데이터를 테이블에 저장, 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장
  • NoSQL: key-value, document, graph, wide-column 형식등으로 저장

스키마

  • SQL : 고정된 스키마가 필요, 처리하려는 데이터 속성별로 열(column)에 대한 정보가 미리 정해져야 한다는 의미
  • NoSQL: 행을 추가할 때 즉시 열을 함께 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력하지 않아도 된다

쿼리

  • SQL : 테이블의 형식과 테이블간의 관계에 맞춰서 데이터를 요청-> 쿼리 언어 사용
  • NoSQL: 데이터 그룹 자체를 조회하는 것에 초점(쿼리 가능함)

확장성

  • SQL : 수직적 확장(높은 메모리,CPU)-> 하드웨어 성능 많이 이용->고비용, 매우 복잡하고 시간이 많이 소모
  • NoSQL: 수평적 확장(값싼 서버 증설, 또는 클라우드 서비스 이용하는 확장) ,수직적 확장보다 비용 효율성이 높음

SQL과 NoSQL 중에서 어떤 것을 사용해야 하나요?

SQL을 사용하는 경우

  • 데이터베이스의 ACID 성질을 준수해야 하는 경우
    • 전자 상거래, 금융 서비스를 위한 소프트웨어 개발
  • 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우

NoSQL을 사용하는 경우

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

MongoDB


대표적인 NoSQL 의 종류

이미지 출처

  • Key-Value 타입: 데이터를 Key(속성)-Value(속성에 연결된 데이터 값)의 쌍을 속성으로 하는 배열 형태로 저장
    • Redis, Dynamo
  • 문서형(Document) 데이터베이스: 테이블이 아닌 문서처럼 저장
    • 보통 JSON 유사 형식으로 데이터를 문서화
    • 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리
    • MongoDB
  • Wide-Column 데이터베이스:데이터베이스의 열(column)에 대한 데이터 관리를 집중하는 데이터베이스
    • 각 열에는 key-value 형식으로 데이터가 저장되고, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터를 처리
    • 높은 유연성 -> 규모가 큰 데이터분석에서 주로 사용
    • Cassandra, HBase

Document vs Key-Value


노란색 : key 분홍색: value
분홍색으로 표시된 { } 전체가 value

  • key :school
    value: {"school_id":"226", "name:: "Tech Secodary" ...}
  • key: info
    value: { actors:......}

둘 다 JSON 형태임

  • JSON: {} 안에 JSON에서 받을 수 있는 자료형이 키:값 형태로 들어가 있는 형태
  • JSON 안에 들어가있는 데이터들이 꼭 dictionary 형태일 ({}로 감싸져있을) 필요는 없습니다.

Key, value 단어는 Key, value를 가지고 있는 데이터 모델에서 모두 사용 가능

Unique key

  • Document: 일반적으로 _id, 지정 가능(중복되어서는 안된다)
  • Key-value: 사용자가 지정

Mongodb이미지 출처
Dynamodb 이미지 출처

Document Databases

  • BSON 형태로 저장, 정해진 틀이나 데이터 타입X
    -> 자유롭게 문자, 숫자,객체 등 저장
  • 보통은 일관되지 않은 데이터들을 추가해야하거나 혹은 재빠르게 데이터를 쌓아야 할 때 사용
  • 자유롭지만 스키마가 아예 없는 것은 아님

Pymongo


파이썬과 연결하기

사전 준비
:pymogo 패키지가 필요 + URI이용한 작업을 하기 위해서 dnspython 패키지 필요

from pymongo import MongoClient

HOST = 'cluster어저꾸mongodb.net'
USER = '유저이름'
PASSWORD = '유저 비밀번호'
DATABASE_NAME = '기본 데이터베이스'
COLLECTION_NAME = ''

MONGO_URI = f"mongodb+srv://{USER}:{PASSWORD}@{HOST}/{DATABASE_NAME}?retryWrites=true&w=majority"

client = MongoClient({URI})

작업 흐름

db_1 = client["db_1"] 
#연결한 클라이언트 객체의 필드로 데이터베이스를 생성/선택

collection_1 = db_1["new_collection"] 
# 데이터베이스의 콜렉션을 조작

collection_1.insert_one({"a":"hi", "b":[1, 2, {"c":"bye"}]})
# 문서를 해당 콜렉션에 삽입

문서 구별

: 고유 번호를 통해서 문서를 구별한다

  • {"a":"hi", "b":[1, 2, {"c":"bye"}]} 삽입할때 _id 자동으로 추가되었다
doc_1 = collection_1.find_one()
print(doc_1) # 고유번호 확인 가능

N324


Mongodb conneect오류

2021-04-22T17: 41: 00.533-0300 I NETWORK [thread1] Starting new replica set monitor for atlas-12cwpw-shard-0 / mflix-shard-00-02.maiqr.mongodb.net 1.: 27017, mflix-shard -00-00.maiqr.mongodb.net.:27017,mflix-shard-00-01.maiqr.mongodb.net.:27017
2021-04-22T17: 41: 00.819-0300 E NETWORK [ReplicaSetMonitor-TaskExecutor-0] SSL peer certificate validation failed: unable to get local issuer certificate

💡 certifi 사용하기
pip install certifi

from pymongo import MongoClient
import certifi

HOST = 'cluster어저꾸mongodb.net'
USER = '유저이름'
PASSWORD = '유저 비밀번호'
DATABASE_NAME = '기본 데이터베이스'
COLLECTION_NAME = ''

MONGO_URI = f"mongodb+srv://{USER}:{PASSWORD}@{HOST}/{DATABASE_NAME}?retryWrites=true&w=majority"

client = MongoClient({URI}, tlsCAFile=certifi.where())

참고

여러개를 삽입할 때

pymongo typeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument

database= client[DATABASE_NAME]

collection = database[COLLECTION_NAME]

# octokit_repos: 여러개 _id가 있는 json 

collection.insert_many(octokit)

참고

좋은 웹페이지 즐겨찾기