본문 바로가기
Study/Database

NoSQL

by 왕방개 2024. 1. 23.

1.데이터베이스 분류


1)RDBMS: 테이블 기반, SQL을 이용해서 작업


2)NOSQL
=>Not Only SQL
=>RDBMS 시스템의 주요 특성을 보장하는 ACID(Atomicity,Consistency,Isolation,Durability-Transaction성질) 특성을 제공하지 않는 확장성이나 성능의 특성을 갖는 비관계형 데이터베이스
=>최근에는 NOSQL에 관계형 데이터베이스의 트랜잭션의 개념을 도입시키고 관계형 데이터베이스에도 NoSQL의 개념을 도입하는 형태로 발전하고 있습니다.

 

 

 

2. NoSQL


1)Key-Value DB
=>key와 value 형태로 저장하는 데이터베이스
=>Redis가 대표적인 key value 데이터 베이스

2)Document DB
=>하나의 데이터를 하나의 문서로 취급
=>Mongo DB가 대표적인 Document DB

3)Wide Column Store
=>열의 집합체를 만들 수 있는 데이터베이스
=>HBase나 Cassandra가 대표적인 Wide Column Store

4)Graph DB
=>데이터에 그래프 자료구조를 도입한 데이터베이스
=>SNS에 주로 이용

5)Mongo DB
1)개요
=>데이터를 하나의 문서로 취급하는데 데이터를 표현할 때 JSON 표기법(자바스크립트 객체 표현법인데 파이썬도 동일) 사용

배열:[데이터나열]
객체(dict):{키:값,키:값....}
=>Mongo DB는 JS 문법으로 데이터를 다룸
MEAN(Mongo DB, Express.js,Angular.js,Node.js):자바스크립트만으로 Web application 제작하는 기술

MERN(위에서 Angular.js대신 React.js)

2)docker을 이용해서 설치
=>mongo image를 다운받아서 컨테이너 이름으로 컨테이너를 생성하는데 data/data/db라는 디렉토리에 데이터를 저장 및 백그라운드로 실행하고 27017번 포트를 27017번 포트로 접속할수 있도록 실행

docker run --name mongodb -v ~/data/data/db -d -p 27017:27017 mongo



3)bash shell 에 접속
=>shell: 운영체제와 사용자 사이의 인터페이스
cmd와 powershell: shell은 프로그래밍도 가능하지만 cmd는 명령어만 가능


=>도커 컨테이너 안에 접속: -it 뜻) 터미널에 접속할수 있는... 이라는 뜻

docker exec -it 컨테이너이름 bash

 

밑에처럼 바뀌면 접속한것을 알 수 있습니다.

 

4)Mongo DB Manual
=>https://docs.mongodb.com/manual/crud/

 

MongoDB CRUD Operations — MongoDB Manual

Docs Home → MongoDB Manual CRUD operations create, read, update, and delete documents.You can connect with driver methods and perform CRUD operations for deployments hosted in the following environments:Create or insert operations add new documents to a

www.mongodb.com


5)MongoDB 작업
=>로컬에 직접 설치한 경우 터미널에서 접속해서 사용할 수도 있고, 도커에 설치한 경우 bash shell에 접속해서 명령어를 실행할 수 있습니다.

=>Compass나 Robo 3T같은 GUI TOOL을 이용해서 작업을 수행할 수 있습니다.


6)구성요소
=>데이터베이스:가장 큰 단위
=>컬렉션:테이블 개념, 미리 생성하거나 구조를 만들 필요가 없습니다
=>도큐먼트:하나의 데이터로 관계형 데이터베이스의 행의 개념
=>필드:관계형 데이터베이스에서 열의 개념
=>인덱스: 데이터를 빠르게 접근하기 위한 객체
=>JOIN이 없는 대신에 Embedding이나 Linking의 개념을 가짐
데이터 안의 필드에 다른 테이블을 포함시킬 수 있습니다
=>SELECT문의 결과로 관계형 데이터 베이스는 Row 의 집합을 return하지만 Cursor을 반환

7)CRUD(Create-데이터 삽입,Read-데이터 조회, Update- 데이터 갱신, Delete- 데이터 삭제)

=>데이터 삽입
db.컬렉션이름.insertOne({키:값,키:값..})
db.컬렉션이름.insertMany([키:값,키:값..],[키:값,키:값..])

키는 문자열이고 값은 null,숫자,문자, 객체,배열, boolean, 날짜 등이 가능
데이터를 삽입할 때 objectID라는 타입의 _ id라는 키 값이 같이 삽입됩니다.

db.users.insertOne({"name":"park","age":"34"})
db.users.insertOne({"nick":kim,"height":170})
이렇게 데이터를 넣는 건 합당하지 않는다.파이썬의 list안에는 어떤 데이터든 들어갈 수 없지만, 서로 비교 대상이 되지 않을경우에는 잘 넣지 않음

=>데이터 전체 확인
db.컬렉션이름.find({})

=>데이터베이스 생성 및 사용
use 데이터베이스 이름;

=>현재 데이터베이스 확인
db;

=>데이터베이스 삭제
db.dropDataBase();

=>전체 데이터베이스 확인 - 데이터가 존재하는 것만 확인 가능
show dbs;

=>데이터 수정
db.컬렉션이름.updateOne(
{"update filter"},
{"update action"});

 

 

=>Capped collection
정해진 크기를 초과하면 자동으로 가장 오랴된 데이터를 삭제하는 collection
디스크가 한정된 상황에서 로그 데이터 나 분석 결과를 저장해야 하는 사용
--CappedCollection을 생성 -크기는 10000비트까지
db.createCollection('cappedCollection',{capped:true,size:10000});

--데이터삽입
db.cappedCollection.insertOne({x:1})

--데이터확인
db.cappedCollection.find({})

--데이터 여러개 삽입
for(i=0;i<1000;i++){db.cappedCollection.insertOne({x:i});

--데이터확인
db.cappedCollection.find({})


=>View
데이터베이스 안에 쓸 수는 없고 읽을 수만 있는 데이터베이스 개체
뷰를 만들면 읽기 속도가 빨라지고 보안을 유지할 수 있습니다

 

5.Python 과 Mongo DB 연동
1)기본적인 사용법
=>패키지 설치: pip install pymongo
=>서버 연결
변수1 = pymongo.MongoClient("서버 IP", 포트번호)
=>데이터베이스 연결
변수2 = 변수1.데이터베이스이름 # 없으면 생성됨
=>컬렉션 연결
변수3 = 변수2.컬렉션이름 #없으면 생성됨
=>데이터 1개 삽입
변수3.insert_one(dict 객체)
=>데이터 여러 개 저장
변수3.insert_many([dict객체, dict 객체...])

2)데이터 삽입 및 조회

ar = [10, 20, 30]

from pymongo import MongoClient

try:
    #Mongo 데이터베이스 연결
    con = MongoClient('127.0.0.1', 27017)
    #print(con)

    #사용할 데이터베이스 연결
    itstudy = con.itstudy
    #print(itstudy)

    #컬렉션 연결
    users = itstudy.users
    #print(users)

    '''
    #1개 데이터 삽입
    users.insert_one({'name':'kim', 'age': 45})
    #여러 개 데이터 삽입
    users.insert_many([{'name':'lee', 'age': 37}, {'name':'park', 'age': 53}])
    #확인은 몽고 DB 접속도구에서
    #use itstudy 수행한 후 db.users.find({})
    '''

    result = users.find()
    for row in result:
        print(row['name'])
        #dict 에서 get 메서드를 이용하면 속성이 없을 때의 기본값을 지정할 수 있습니다.
        print(row.get('name', "noname"))

except Exception as e:
    print("데이터베이스 연결 오류")