NOSQL와 관계형데이터베이스 정리, pymongo(python)을 이용한 MONGODB Atlas 연결

David's Data Science·2021년 9월 28일
1

NoSQL

NoSQL은 기존에 많이 사용하던 관계형 데이터베이스와는 다른 방식의 데이터베이스로써, 대량의 데이터를 적재하는데에 초점을 둔 데이터베이스이다.

확장성 (NoSQL은 수평확장이 가능)

1) 수직확장: 관계형 DB의 주된 방식으로 2000년대 초반부터 WEB 발전과 함께 더 큰 장치와 서버 이용.

  • 서버를 직관리하므로 보안성이 향상
  • 반면, 크고 성능이 좋은 서버일수록 비용 증가
  • 메모리 사용이 증가하여 효율이 떨어지게 됨.

2) 수평확장: 이후 작은 컴퓨터 여러대로 나누어 데이터베이스 저장 > 분산 컴퓨팅(클러스터링 등)

  • 상대적으로 저렴한 컴퓨터 여러대를 이용 > 비용의 감소
  • 또한 위의 이유로 메모리 효율도 상승하게 됨.
  • 용량이 큰 데이터의 경우 빠르게 적재가 가능 (빅데이터의 활용)

관계형 데이터베이스(RDB)의 특징

  • 고정된 스키마로 인해 명확하고 논리적인 데이터 구조, 데이터 간의 관계 파악 가능.
  • NoSQL에 비해 데이터 적재 시 유연성이 떨어짐 > 스키마 구조가 명확해야 적재도 가능.
  • 데이터가 테이블 형식이머 기본 키(primary key)를 통해 식별 및 무결성 보장.
  • 데이터가 많아질 수록 성능에 영향이 생긴다. (수직확장의 한계)

NoSQL의 특징

  • DATA를 BSON(Binary JSON)형식으로 저장해 딕셔너리처럼 구분.
  • 데이터 내부의 요소 하나하나를 꺼내서 사용하는 용도로는 부적합.
  • DB엔진 별로 다르지만, _id를 식별자로 자동(document)또는 수동(key_value)으로 업데이트해서 구분.
  • 스키마가 동적이기 때문에 모든 데이터가 없더라도 속성에 따른 열을 추가할 수도 있는 등 유연하다.
  • API에서 필요한, 또는 제공한 형식을 그대로 저장해서 사용하기 때문에 변환할 필요가 없이 빠르게 이용 가능.
JSON: Java Script 의 객체표기법으로 이뤄진 data.

NoSQL 기반 DB TYPE

1) KEY_VALUE: Key와 Value로 이뤄진 속성으로 이뤄진 Data를 이용. 대표: DynamoDB
2) DOCUMENT: 전체 Data가 Key에 따른 value 값을 뜻하는 Dictionary와 같은 형태. 대표: MongoDB
3) WIDE-COLUMN: 열에 대한 Data를 집중관리하는 DB, Key, Value형식으로 적재. 대표: HBase

MongoDB (Atlas)

NoSQL(비관계형 데이터베이스) 중 Document형식으로 data를 적재하고 BSON data를 이용하여 그 적재 형식이 매우 유연하다. 자유롭게 문자, 숫자, 배열을 저장 가능.

그 중 Atlas는 MongoDB에서 제공하는 Cloud Database이며, local DB에 비해선 기능적 제약이 있다.

MongoDB LOCAL 및 CLUSTER로는 추후 좀 더 Deep하게 연구해볼 생각이다.

MongoDB Atlas 사용 준비

  1. 회원가입 https://www.mongodb.com/ko-kr/cloud/atlas/efficiency

  2. Organization까지 진행 완료 - 개인 이름으로도 가능하며, 추후 수정도 가능하다.

  3. 아래와 같이 우측 상단 New Project 생성

  4. project명 기재 후 Next

  5. 추후 협업을 위한 창으로 지금은 패스하고 create한다.
    이후로도 db 생성 후 무료로 create를 진행한다.




    이렇게 진행하면 빠르면 몇초, 오래걸리면 1~3분도 걸리는 것 같은데, db 생성에 시간이 좀 걸린다.

  6. 완료가 된 뒤, connect 탭을 들어가 username과password를 설정한 뒤 CREATE 해준다.

  7. IP 설정을 내 연결 IP로 설정해준다. 빨간 칸만 클릭하면 된다.

  8. 최종적으로 MongoDB 연결할 방법으로는 python을 사용할 것이므로 아래와 같이 python 3.6 or later로 설정하면 된다.


    MongoDB URI는 Mongodb_srv 서비스를 이용하기 위해 따로 메모하거나 창을 띄워놓는다.

pymongo를 이용한 MongoDB 연결

Mongo URI 확인


우선 MongoDB URI를 파악한다. 위와 같이 구간 별로 user, password, host, database이름을 구분지을 수 있다. 아래 바로 전체 연결 코드를 작성해본다.

pymongo package를 통한 python 코드 작성


# MongoDB URI
URI = 'mongodb+srv://david:password@cluster0.idvui.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'

host = 'cluster0.b7qcq.mongodb.net'
user = 'david'
password = 'password'
database_name = 'myFirstDatabase'
collection_name = 'mongo' #table 명과 같이 생각하기

from pymongo import MongoClient

Mongo_URI = f'mongodb+srv://{user}:{password}@{host}/{database_name}?retryWrites=true&w=majority'

#MongoClient 객체 생성 
client = MongoClient(URI)

# database 지정
database = client[database_name] # = client['myFirstDatabase']

# collection 객체 생성 - db로부터 'mongo'이름의 table이라고 생각하기
collection = database[collection_name] # = database['mongo']

# 집어넣을 데이터 예시 = JSON 또는 DICT형식
document={'example':'first one'}

# collection 객체의 insert_one으로 한개의 doc을 업로드
collection.insert_one(document)

그냥 맨 위의 URI를 이용해 MongoClient 객체를 생성해도 되지만, 언제든 편리하게 다른 db를 사용할 수 있도록 처음 작성시부터 각 URI의 주요 입력부분을 formatting할 수 있도록 코딩한다.
database_name의 경우 default로 myFirstDatabase가 정해졌는데, 변경 가능하다.


이후 python을 실행한 뒤, Browse Collection을 하면 DB가 생성된 것을 볼 수 있다.
myFirstDatabase라는 DB에 mongo라는 collection(RDB의 table정도의 규모)이 정렬되어있고, 가운데엔 고유 _id가 자동으로 정해져서 반환되었으며, vs code에서 넣어뒀던 example: "first one" dictionary가 적재된 것을 볼 수 있다.

profile
데이터 사이언티스트가 되고싶은 David입니다.

0개의 댓글