관계형 데이터모델을 사용하지 않는다는 공통점만 가질 뿐 각각 다른 특성을 가지고 있다.
NoSQL 은 2000년대 초 웹 환경의 데이터를 다루기 위해 사용되었다.
(데이터양의 증가 - 데이터설계시간의 증가 - 여러개의 서버를 연결시켜 확장하는 방법 사용)
분산컴퓨팅, 클러스터를 이용한 수평확장이 이루어졌다.
RDB의 특징
테이블을 사전에 정의한 뒤 알맞은 형태의 데이터만 넣을 수 있다.
행과 열로 구성된 테이블에 데이터 저장.
형식을 지키기에 꺼내기 수월하다
스키마가 뚜렷이 보인다.
MySQL, Oracle, SQLite, PostgresSQL, MariaDB가 있다.
NoSQL의 특징
데이터를 읽어올 때 스키마에 따라 읽어온다.
그렇다고 쓰는 방식이 안정해진 것은 아니다.
(어떻게 쓰냐가 어떻게 읽어올지에 영향을 끼친다)
데이터 저장에서의 차이점
RDB : SQL을 이용하여 테이블에 저장
NoSQL : key-value, document, graph, wide-column 형식으로 데이터 저장
스키마에서 차이점
RDB : 고정된 스키마가 필요하며 수정시 전체 데이터베이스 수정 or 오프라인 전환이 필요
NoSQL : 스키마의 형태가 동적, 행을 추가할 때 열을 추가할 수 있으며 모든 열에 대한 데이터를 입력하지 않아도 된다.
쿼리에서의 차이점
RDB : SQL같은 구조화된 쿼리언어를 정보요청에 사용
NoSQL : 데이터 그룹 자체를 조회하는 것에 초점, 구조화 되지않은 쿼리언어로도 요청가능하다.
확장성에서의 차이점
RDB : 수직적 확장, 복수의 서버에 걸쳐 관계를 DB간 관계를 정의할 수 있지만 복잡하고 시간이 많이 소모
NoSQL : 수평적 확장, 범용 하드웨어나 클라우드 기반의 인스턴스에 호스팅할 수 있어 비용 효율성이 높다.
결론
NoSQL이 확장성과 속도가 좋지만 SQL 기반의 DB가 좋은 성능을 보이는 경우도 있기에 혼용해서 사용
데이터베이스의 ACID 성질을 준수해야하는 경우
데이터의 무결성을 보호해야하는 경우를 의미
전자 상거래, 금융 서비스등의 경우이다.
SW에 사용되는 데이터가 구조적, 일관적인 경우
많은 서버가 필요없어 굳이 NoSQL을 사용할 이유가 없는 경우를 의미
데이터 구조가 없는 대용량 데이터를 저장하는 경우
(빅데이터의 경우 주로 이용)
클라우드 컴퓨팅 및 저장공간 최대한 활용하는 경우
(저장공간이 한정되어 있는 경우가 많다.)
빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트하는 경우
Key-Value 타입
Key-Value의 쌍을 속성으로 하는 배열 형태
Redis, Dynamo등이 존재한다.
문서형(Document) 데이터베이스
테이블이 아닌 문서처럼 저장
(JSON 유사형식으로 문서화하는 것이 일반적)
문서는 하나의 속성에 대한 데이터로 구성
컬렉션이라는 그룹으로 묶어 관리
MongoDB가 대표적이다.
Wide-Column 데이터베이스
열에대한 데이터 관리를 집중
각 열은 key-value 형식으로 데이터 저장
컬럼 패밀리라고하는 열의 집합체로 데이터를 처리
열을 유연하게 선택할 수 있어 규모 큰 데이터 분석에 적합하다.
Cassandra, HBase등이 존재한다.
문서들은 BSON 형태로 저장된다.
데이터 타입이 없다.
일관되지 않은 데이터추가, 빠른 데이터추가에 사용된다.
데이터를 읽을 때 특정 스키마에 따라 데이터를 불러온다.
Atlas 로 클러스터 생성
지역과 클러스터 이름을 설정하여 클러스터 생성
(클러스터 : 여러개의 컴퓨터가 하나의 시스템으로 작동하는 것)
IP를 화이트리스트에 추가한다.
DB접근하는 유저와 유저 비밀번호도 생성한다.
연결방법
Mongo shell : 터미널 CLI로 접근
Application : 코드를 통해서 접근
MongoDB Compass : GUI형태로 접근
파이썬에서 몽고작업하기 위해서는 pymongo 패키지가 필요하다.
URI 이용해 작업할 경우 dnspython 패키지도 필요
진행과정
데이터베이스에 연결해줄 MongoClient를 불러온다.
from pymongo import MongoClient
client = MongoClient({URI})
Atlas의 URI 형식
mongodb+srv://{유저 이름}:{유저 비밀번호}@cluster-prac.hubjn.mongodb.net/{기본 데이터베이스 이름}?retryWrites=true&w=majority
SQL과 연결하는 방식은 같지만 DB선택과 documents 상호작용 방식은 다르다.
공식문서 참고
(https://pymongo.readthedocs.io/en/stable/tutorial.html)
진행과정
연결한 클라이언트 객체 필드로 DB생성/선택
db_1 = client["db_1"]
DB의 콜랙션도 같은 방법으로 조작가능
collection_1 = db_1["new_collection"]
콜렉션 생성뒤에 문서를 콜렉션에 삽입
(사전 구조가 없기에 JSON으로 바로 저장가능)
collection_1.insert_one({"a":"hi", "b":[1, 2, {"c":"bye"}]})
자체적으로 _id라는 ObjectId값이 입력된다. 문서중 하나를 불러와서 확인가능하다
doc_1 = collection_1.find_one()
print(doc_1)