반응형

**Trigger

=>관계형 데이터베이스에서는 테이블에 삽입,삭제,갱신 작업이 발생했을 때 작업 전이나 후에 다른 동작을 수행하도록 하는 것

=>작업 전에 하는 동작은 휴효성을 검사에 실패했을 때 작업을 수행하지 않도록 하기 위해서 인 경우가 많고 작업후에 하는 동작은 하나의 트랜잭션으로 묶여야 하는 작업이나 로그를 기록하는 경우가 많습니다.

1.테이블에 데이터가 삽입될 때 데이터 삽입 시간과 삽인된 데이터의 기본키를 다른 테이블에 저장

=>dept테이블에 데이터를 삽입하면 기록

CREATE TABLE deptlog(

 deptno number(2) PRIMARY KEY,

 insertime DATE

);

 

2.트리거 생성

--트리거 생성

CREATE OR REPLACE TRIGGER tri_01

--dept텡블에 데이터를 삽입한

--전에 동작시키고자 하면 after대신에 before삽입 대신에 다른 작업이면 update delete사용

AFTER INSERT ON DEPT

-- 꺼번에 여러 개의 행에 작업이 발생하면 작업 단위별로 것인지 아니면 전체에 한법만 동작 것인지

--for each row 수행 그렇지 않은 경우는 생략

OR EACH ROW ;

 

a ->dept no primary key

b -> deptno reference A (deptno) on delete cascade

insert, delete, update

로그 잘 만들어 줘야 한다.

--2.트리거 생성

--트리거 생성

CREATE OR REPLACE TRIGGER tri_01

--dept텡블에 데이터를 삽입한

--전에 동작시키고자 하면 after대신에 before삽입 대신에 다른 작업이면 update delete사용

AFTER INSERT ON DEPT

FOR EACH ROW

--begin end ->plsql이라고 한다. 문법체크 하지 않고 만들어진다.

BEGIN

       --새로 입력되거나 수정되는 경우에는 :new 이전 데이터는 :old

       INSERT INTO DEPTLOG(deptno, inserttime) VALUES(:NEW.deptno, SYSDATE);

END;

--/ dbeaver에서는 안해도 된다.

 

 

SELECT * FROM deptlog;

 

 

INSERT INTO DEPT (deptno, dname, loc)

VALUES(73,'경비실','이대');

 

 

INSERT INTO DEPTLOG(deptno, inserttime) VALUES(72, SYSDATE);

DELETE FROM DEPTLOG;

 

2.트리거를 이용한 유효성 검사

=> 작업을 하지 않도록 해주는 코드

raise_application_error(에러코드번호 ,에러메시지)

emp테이블에서 sal 값을 현재 값보다 작은 값으로는 수정하지 못하도록 트리거를 생성

 

CREATE OR REPLACE TRIGGER tri_02

BEFORE UPDATE ON emp

FOR EACH ROW when(NEW.sal < OLD.sal)

--다른 작업 있을 경우 or 연결

BEGIN

       RAISE_APPLICATION_ERROR(-20500,'sal 작은 값으로는 수정 못함');

END;

 

 

UPDATE emp SET sal = 900 WHERE ENAME = 'SMITH';

--정상 수행

UPDATE emp SET sal = 800 WHERE ENAME = 'SMITH';

 

--특정 시간대에 동작하지 않도록 하기

BEGIN

       IF TO_NUMBER(TO_CHAR(SYSDATE,hh24)) NOT BETWEEN 9 AND 18 THEN

               RAISE_APPLICATION_ERROR(-25001,'9시에서 18 까지만 작업을 수행합니다.');

END;

 

RAISE_APPLICATION_ERROR( [에러코드][에러메시지] )

에러코드 : -20000 ~ -20999 사이의 코드

; 부분 주의해서 하기

 

 

**1.사용자 접근 제어

관리자 권한으로 해야 한다.

권한 부여  grant

with admin option 권한을 다른 사용자에게 부여할 없다. 없으면 읽기 전용

권한 취소 revoke

a -> b 권한 부여하는데 a 취소한다고 해서 b 변하지 않는다.

cascade , 하면 연쇄로 삭제되거나 수정된다.

 

 

mysql ->root

oracle ->system sys

관리자 권한에서는 테이블 만든는게 좋다. 권한도 없을 있고 테이블도 많아서 찾기 힘들다.

 

전역데이터베이스명

xe ->express edition

orcl ->exterprise edition

자기것은 owner 사용하지 않는다.

특정 테이블 가져올때는 tables

dmp

 

 

fromuser touser

 

python DB API

 

 

**파이썬에서 데이터베이스 연동

1.표준 API 이용하는 방법

2.pandas 같은 자료구조를 제공하는 패키지에서는 데이터베이스에 별도의 방식으로 접근

3.orm(object relation mapping)

=관계형 데이터베이스의 테이블과 객체를 1:1 매핑시켜서 sql없이 데이터베이스를 사용하는 방식

=>Django프레임워크 에서 지원

=>java hibernate,android content values, IOS에서의 CORE DATA등이 ORM 개념

 

 

** 오라클 사용

1.CX_ORACLE이라는 패키지를 이용

1)패키지 설치

pip install 패키지이름

pip install 패키지이름 --upgrade:업그레이드

pip install 패키지이름 = 버전:  특정 버전 설치

 

2)pip업그레이드

 

 

c->vc++

   spss

:업그레이드 제조회사에서 제공

java ->오픈 소스

누구나 자바 가지고 배포 수있다.

 

maven

gradle

이것들이 검정한다.

코드 + 문서 올려서 cran 업로드 한다.

cran 한글로 되여있는것 안읽는 것이다.

일반인이 만들 경우 버전 문제가 있을 있다.

 

 

다운할 경우 종속의 경우가 있다.

tensorflow numpy 종속이 되여있ㄷ

numpy 있어야 tensorflow있어야 한다.

pip install tensorflow numpy필요하면 자동으로 업데이터 한다.

여러개 같이 사용해서 작업한다.

 

3).pip명령이 오류가 발생하는 경우

=>pip command 없다고 나오는 경우

python 설치되지 않았거나 python명령어 디렉토리가 path 추가되지 않은 경우 입니다.

 

=>windows 경우에는 VC++ 패키지를 만드는 경우가 있는데 이러한 패키지들은 vc++ 재배포 패키지를 설치해야만 설치되는 패키지들이 있습니다.

 

4).금융기관이나 공공기관 폐쇄망에서의 설치

=>다운로드가 가능한 곳에서

pip download 패키지이름으로 현재 컴퓨터에 다운로드

 

=>다운로드 받은 파일들을 복사한

pip install 파일명으로 설치

때는 자동으로 종속된 패키지를 설치해주지 않기 때문에 직접 하나하나 순서대로 설치해야 합니다.다른 패키지가 필요하면 어떤 패키지가 없다고 에러 메시지가 나오기 때문에 메시지를 읽으면서 하면 됩니다.

 

2.외부 모듈 가져오기

1)import 모듈이름 : 모듈이름에 해당하는 모듈을 모듈이름으로 묶어서 가져옵니다.

ex).import numpy

numpy 있는 것들은 numpy.이름 으로 사용해야 합니다.

 

2)from모듈이름 import모듈 내부 요소들을 나열: 모듈이름에 해당하는 모듈에서 import뒤에 있는 것들을 현재 모듈에 포함시켜서 가져옵니다.

 

import pandas

pandas.DataFrame()

 

from pandas import DataFrame

DataFrame()

 

3)from 모듈이름 import * : 모듈이름에 해당하는 모듈 모든 내부요소를 현재 모듈에 포함시켜서 가져옵니다.

 

4).import 모듈이름 as 별명: 모듈이름 대신에 별명을 사용합니다.

import pandas as pd :pandas대신에 pd라는 이름을 사용

import numpy as np:numpy대신에 np라른 이름을 사용

 

3.파이썬에서 오라클 연결

import cx_Oracle

 

#접속 정보 만들기

변수1 = cx_Oracle.makedsn(‘ip 주소’,’포트번호’,’데이터베이스이름’)

#접속

변수2 = cx_Oracle.connect(user= ‘계정’,password = ‘비번’,dsn = 변수1)

 

#연결 해제하기

변수2.close()

 

프로젝트에서 설치 된다.

 

아래 3개는 반드시 닫기

file

newwork

database

close안하면 읽기 전용으로 자주 뜬다. 파일을 닫지 않을 경우

 

4.관계형 데이터베이스 연동 때는 tuple 사용하고  No sql 연동할 dict 사용합니다.

 

5.insert,delete,update

=>연결 객체로 부터 cursor. 가져옵니다.

cur = 변수2.cursor()

 

=>cursor 이용해서 sql 실행

cur.execute(‘sql 구문’)

cur.execute(‘매개변수를 이용한 sql구문 작성’,(매개변수에 해당하는 데이터 나열))

 

=>작업을 완료하려면 cur.commit()

 

 

6.작업 도중 오류가 발생

에러 메시지가 ora 시작하면 오라클 접속오류나 sql에러

 

dept테이블에 데이터 삽입

cursor = con.cursor()

cursor.execute(“insert into dept(deptno,dname,loc) values(51, ‘총무’,’광주’)”)

con.commit()

 

방화벽 끄기

 

7.파라미터를 이용한 실행

sql구문을 만들 :번호 형태로 매개변수를 만들고 두번째 매개변수로 :번호 자리에 매핑될 튜플을 대입하는 방법으로 실행이 가능

cursor = con.cursor()

cursor.execute("insert into dept(deptno,dname,loc) values(:1, :2,:3)",

                   (53,"비서실","부산"))con.commit()

=>매핑하는 구조를 이용하면 데이터를 입력받아서 사용하는 것이 편리

 

 

 

deptno dname,loc 입력받아서 deptno 해당하는 데이터의 dname loc 수정

#데이터 입력받기

    deptno = input("부서번호")

    dname = input("부서명")

    loc = input("지역")

 

    cursor.execute("insert into dept(deptno,dname,loc) values("+deptno+",'"+dname+"','"+loc+"')")

 

cursor.execute("insert into dept(deptno,dname,loc) values(:1, :2,:3)",

                   (int(deptno),dname,loc))

 

 

#데이터 수정하기

#수정 구무 실행

    cursor.execute('update dept set dname=:1 , loc = :2 where deptno = :3',(dname,loc,int(deptno)))

 

**데이터 읽기

=>execute까지는 같은데 cursor객체의 fetchall 이라는 메소드를 호출하면   select 결과가 튜플의  튜플로 만들어집니다.

fetchone이라는 메소드를 호출하면 1개만 튜플로 리턴됩니다.

cursor.execute('select * from dept')

    #1 데이터 가져오기

    data = cursor.fetchone()

    print(data)

    for imsi in data:

        print(imsi)

 

#여러개 데이터 가져오기

    data = cursor.fetchall()

    #print(data)

    for imsi in data:

        print(imsi)

 

#데이터를 저장할  list 생성

    li = []

    for imsi in data:

        dic = {'부서번호':imsi[0],'부서명':imsi[1],'지역':imsi[2]}

        li.append(dic)

    print(li)

 

 

    cursor.execute('select * from dept where deptno = 93')

    data1 = cursor.fetchall()

    #없을 경우에는 어떻게 구분하는지

    #튜플은 데이터 개수를 카운터로 구할 있다.

    #print(data.count())

    #데이터 개술 출력 0개면 검색된 데이터가 없음

    #1이상이면 검색된 데이터가 있음

    print(len(data1))

   

    #작업한 내역을 원본에 반영

    con.commit()

    print("삽입성공")

   

   

    #print(con)

    #print(dir(con))

 

 

**로그인

아이디와 비밀번호를 입력받아서 아이디와 비밀번호에 해당하는 데이터가 있으면 로그인 성공 없으면 로그인 실패

 

원래는 비밀번호는 반드시 암호화해서 저장하고 복호화가 불가능하도록 해야 합니다.

 

**데이터베이스 연동 프로그램의 가장 기본은  crud(create,read,update,delete)

=>데이터 삽입 , 수정 ,삭제

=>데이터 전체 또는 페이지 단위로 가져오기 ,기본키를 가지고 하나의 데이터를 조회

 

**프로시저실행

=>커서.callproc(‘프로시저이름’,(프로시저의 매개변수 나열))

 

1.dept테이블에 데이터를 삽입하는 프로시저를 생성

create or replace procedure insert_dept(

)

is

begin

       프로시저 내용

end;

 

 

create or replace procedure insert_dept(

       vdeptno dept.DEPTNO%TYPE,

       vdname dept.DNAME%TYPE,

       vloc dept.LOC%TYPE

)

is

BEGIN

               INSERT INTO DEPT(DEPTNO,DNAME,LOC)

               VALUES(vdeptno,vdname,vloc);

      

END;

 

2.프로시져 테스트

 

BEGIN

       INSERT_DEPT(13,'영업','서울');

END;

 

 

new PROJECT->

 

이것 설정시 pycharm에서도 연결 가능하다.

프로젝트를 전체것사용하기

 

 

 

=>프로그램을 나누어서 한다.

controller service dao

나누어서 단위테스트 한다.

프로그램을 분할해서 한다.

 

 

3.파이썬 코드

pycharm

import cx_Oracle

try:
    #접속 정보 만들기 :컴퓨터 ip,port,sid
    dtnStr = cx_Oracle.makedsn("IP","1521","xe")
    # 데이터베이스 연결 객체 생성
    con = cx_Oracle.connect(user= "scott",password="tiger",dsn = dtnStr)
    # 데이터베이스 작업 객체 생성
    cursor = con.cursor() 


   
   
# sql execute를 호출하고 프로시저는 calporc를 호출
   
# 매개변수는 튜플
   
cursor.callproc("insert_dept",(14,"제무","이대"))

   
#작업 내용을 원본 데이터베이스에 반영
   
con.commit()
except Exception as e:
   
print(e)
finally:
   
#데이터베이스 연결 해제
   
con.close()

 

 

**blob 저장과 읽기

blob:파일의 내용을 저장하기 위한 오라클 자료형

프로그래밍 언어에서는  byte 집합으로 간주(python 경우는 bytes)

 

1.blob 저장하기 위한 테이블을 생성

=>데이터베이스에서 작업

=>파일이름과 파일내용을 저장할 있는 테이블을 생성

create table filesave(

  FILENAME VARCHAR2(50),

  FILECONTENT BLOB

);

-- 명렬 수행에 실패하거나 수행하지 않으면 파이썬에서 VIEW또는 TABLE 없다는 에러 메시지

 

 

더블 클릭시 이미지 창이 나온다.

 

c 드라이브에 파일 저장하면 오류가 경우 있어서

사용할 있는 디렉터리로 해야 한다.

문서 디렉터리가 제일 편하다.

저장이 되야 읽는 것이 가능하다.

 

 

import cx_Oracle

try:
   
#접속 정보 만들기 :컴퓨터 ip,port,sid
   
dtnStr = cx_Oracle.makedsn("IP주소","1521","xe")
   
# 데이터베이스 연결 객체 생성
   
con = cx_Oracle.connect(user= "scott",password="tiger",dsn = dtnStr)
   
# 데이터베이스 작업 객체 생성
   
cursor = con.cursor()

   
#읽을 파일의 경로 만들기 -파이썬은 디렉토리 기호를 \를 사용해도 되고 /를 사용해도 됨
   
filePath = "C:/Users/admin/Desktop/03. DB/img1.jpg"

   
#파일 내용 읽기
   
f = open(filePath, "rb")
    photo = f.read()
   
#파일 닫기
   
f.close()

   
#파일 이름 만들기- /로 분할해서 가장 마지막 부분을 파일이름으로 설정
   
path = filePath.split("/")
    filename = path[
len(path)-1]#파일 이름은 img1.jpg이 될 것이다.

    #sql
실행
   
cursor.execute('insert into filesave(filename,filecontent) values(:1,:2)',(filename,photo))

   
#작업 내용을 원본 데이터베이스에 반영
   
con.commit()
except Exception as e:
   
print(e)
finally:
   
#데이터베이스 연결 해제
   
con.close()

 

 

import cx_Oracle

try:
   
#접속 정보 만들기 :컴퓨터 ip,port,sid
   
dtnStr = cx_Oracle.makedsn("IP주소","1521","xe")
   
# 데이터베이스 연결 객체 생성
   
con = cx_Oracle.connect(user= "scott",password="tiger",dsn = dtnStr)
   
# 데이터베이스 작업 객체 생성
   
cursor = con.cursor()

    cursor.execute(
"select * from filesave")

   
# 전체 데이터 가져오기
   
data = cursor.fetchall()

   
for imsi in data:
       
print(imsi[0])
        f =
open("C:\\Users\\Public\\Documents\\" +imsi[0] ,"wb")#파일 이름
       
#기록할 데이터 가져오기
       
blob = imsi[1]
       
#파일에 기록
       
offset = 1
       
while True:
           
#65536 바이트 단위로 읽어준다.
           
temp = blob.read(offset, 65536)

           
#데이터가 있으면
           
if temp :
                f.write(temp)
           
#읽은 데이터가 65536 보다 작으면 전부 읽은 것이므로 읽기 중단
           
if len(temp) < 65536:
               
break
   
f.close()
except Exception as e:
   
print(e)
finally:
   
#데이터베이스 연결 해제
   
con.close()=====================이미지가 경우import cx_Oracle

try:
   
#접속 정보 만들기 :컴퓨터 ip,port,sid
   
dtnStr = cx_Oracle.makedsn("IP주소","1521","xe")
   
# 데이터베이스 연결 객체 생성
   
con = cx_Oracle.connect(user= "scott",password="tiger",dsn = dtnStr)
   
# 데이터베이스 작업 객체 생성
   
cursor = con.cursor()

    cursor.execute(
"select * from filesave")

   
# 전체 데이터 가져오기
   
data = cursor.fetchall()

   
for imsi in data:
       
print(imsi[0])
        f =
open("C:\\Users\\Public\\Documents\\" +imsi[0] ,"wb")#파일 이름
       
#기록할 데이터 가져오기
       
blob = imsi[1]
       
#파일에 기록
       
offset = 1
       
while True:
           
#65536 바이트 단위로 읽어- 한번에 읽을 크키를 설정하는 것이므로 메모리 크기를 가지고 조절
           
#1부터 65536까지 읽어오기
           
temp = blob.read(offset, 65536)

           
#데이터가 있으면
           
if temp :
                f.write(temp)
           
#읽은 데이터가 65536 보다 작으면 전부 읽은 것이므로 읽기 중단
           
if len(temp) < 65536:#64k
                
break
           
# 앞 쪽의 64k를 읽고 다음 데이터 읽기 위해서 offset을 조정
           
offset += len(temp)#이미지가 클 경우
   
f.close()
except Exception as e:
   
print(e)
finally:
   
#데이터베이스 연결 해제
   
con.close()

 

 

mongodb procedure 자바스크립트로 것이다.

mean(Mongo DB-자바스크립트 문법으로 데이터베이스 작업, Express.js – 서버 생성, Angular.js- 서버의 데이터를 mvc 패턴으로 출력, Node.js-서버 사이드 언어의 역할 )

angular 자리는 최근에는 react vue 구현하기도 합니다.

react 많이 사용한다.(andriod, ios )같이 사용가능하다.

facebook - hbase

mysql ->nosql사용가능하다.

mondo DB 소계할 mysql 한다.

 

예전의 프로그래밍

1.관계형 데이터베이스(oracle,MySQL, -SQL)

2.서버 사이드 프로그래밍 언어(JAVA – JSP&SERVLET, c#-asp.net, Php)

3.클라이언트 사이드 프로그래밍 언어 (html, css , javascript)

 

 

python 자료구조와 javascript같다.

{“”:””}python 에서는 dict 라고 하고 javascirpt 객체이다.

[]python에서는 list javascript 배열 자료구조는 비슷한데 같지는 않다.

서버 ->csv,xml, json

python이라고 하면 json형식으로 하는게 좋다. 바로 치환가능하다.

python 주식 으로 하는 원인이 구글이 json으로 되여있다. 그래서 python으로

mongoDb python 같게 사용한다. 연동이 된다.

관계형은 execute

스키마 생성없이 가능하다.

데이터 넣으면 바로 스키마 생성한다.

테이블만들지 않고 바로 테이블 만들 있다.

 

DTO(RDBMS) ->구조를 만들고 구조를 기반으로 데이터

구조 (테이블)->데이터

구조 변경이 어렵다. ALTER 하면 데이터 망가질 가능성이 있기 때문에

강력한 트랜잭션

 

DICT(MAP) No SQL -> 구조 생성 없이 바로 데이터 생성 가능

구조 변경이 쉽다. 

확장이 쉬움

 

 

 

오라클은 결과를 가져온다.

no sql 포인터를 지정한다.

다음다음 하면서 데이터 하나씩 하나씩 접근한다.

디비에서는 cursor program 언어에서는 :iterator(반복자)

eg: for in

기존에는 데이터가 

d1     d2     d3

 

 

 

 

 

조인을 하려면 d1+d2+d3 모으고 -> 작업수행 -> 결과

 

리듀스

작업 원리는

작업을 각각에서 하고

 

 

결과를 처리한다.->집계

 

시각화 -> javascript web에서 시각화는 d3.js

https://d3js.org/

 

v  Mongo DB Hbase 차이

v  Mongo DB 하나의 Collection 저장된 데이터들을 하나의 파일에 저장하지만 Hbase 관련된 컬럼들을 패밀리로 묶어서 하나의 파일에 저장

v  Hbase에서는 Row Key 설계하는 방법에 따라 하나의 데이터를 저장하는 방식을 결정하지만 Mongo DB에서는 Document Id라는 _id라는 필드를 생성해서 JSON 문자열을 BSON으로 변환해서 저장

mongodb 옆으로 저장

hbase 관계성 있는 것으로

 

아래 두개 같다.

{‘1’:10 , ‘2’ : 20}

{‘2’ : 20 ,‘1’:10 }

hasing 한다. 데이터 값이 같고 hasing하면 운영체제가 값을 정하는 것이다.

같은 속성의 같은 값이 있더라고 다른 데이터이다.

 

$ 몽골디비가 연산자를 할때

. -> windows 제외하고 이것은 숨김이다.

맥은 unix기반에다 max osx덮어 씌우는 것이다. gui 만든 것이다.

unix(c) ->돈주고 산다. 컴퓨터를 사면 준다.

solaris

상용하면서 대비

linx ()->andriod linux위에 씌우는 것이다.

window dos라는 기반에다 visual 해서  windows이다.

python r unix, linux에서 했다.

_ 시작하는 것도 사용하지 말라 예약어일 가능성이 높다.

대소문자 데이터 형을 정확히 구분

 

json데이터 읽기

 

msi는 설치 버전의 약자이다. 실행

zip은 압축풀고 명령어로 한다.

 

**mongo db명령

1.서버 실행

mongod –dbpath  데이터디렉토리

 

2.클라이언트 실행

mongo

 

3.기본 포트 번호는 27017

 

 

명렁어나 수행하는 것 bin에 가서 찾기

pip명령어도 bin에 가서 찾으면 된다.

mongo d가 서버를 만들어주는 것이고

환경변수 등록

 

**mongo db명령어를 환경 변수의 path에 등록

=>path는 명령어를 입력했을 때 찾는 데렉토리를 설정하는 환경변수

 

운영체제마다 설정이 조금씩 자른다.

윈도우즈에서는 탐색기를 실행하고 [내 컴퓨터] 를 선택하고 마우스 오른쪽을 클릭해서 [속성]을 선택 하고 왼쪽 화면에서 [고급 시스템 설정]을 클릭

고급 탭으로 이동하고 [환경변수]를 클릭

C:\Program Files\MongoDB\Server\4.2\bin

 

4.2버전

위에는 admin

아래에서는 관리자

윈도우에서는 어디에 해서도 문제없다.

[시스템 변수] 항목에서 path 를 찾아서 편집을 클릭

C:\Program Files\MongoDB\Server\4.2\bin

 

path에 추가하기

=>windows7에서는 새로만들기가 없고 경로 문자열이 보일 텐데 맨 뒤에 붙여넣기를 하고 ;를 추가하면 된다.

=>환경 변수를 설정하면 다음에 실행되는 command창에서부터 적용

 

1.서버 실행

1)데이터를 저장할 디렉토리를 생성

저는 c드라이브에 mongodata

 

2)command창을 1개 실행해서 아래 명령을 입력

mongod –dbpath c:\mongodata

 

 

2.client 실행

1)로컬에 있는 데이터베이스에 연결

새로운 command창에 열어서 mongo

2)원격에 있는 데이터베이스에 연결

mongo –host “서버IP주소”:”포트번호

=>포트번호는 기본이 27017

mongo –host “IP주소”:”27017”

1.데이터베이스 생성 및 접속

=>존재하는 데이터베이스 이름이면 접속이고 없는 이름이면 접속하고 사용

use 데이터베이스이름

use mymongo=>mysql과 같다.

 

2.collection

 

=>관계형 데이터베이스의 table과 유사한 개념으로 도큐머트의 집합

테이블이라는 표현을 사용하지 않는 이유는 동일한 구조의 데이터만 저장되는 것이 아니기 때문이다.

=>mongo db join을 지원하지 않기 때문에 하나의 collection에 많은 양의 데이터를 저장하는 것을 권장하지만 성능 측면에서 하나의 collection 에 너무 많은 데이터가 있으면 읽기 속도가 느려집니다.

데이터를 가져올 때 디스크 읽기 오퍼레이션이 많이 발생하기 때문입니다.

여러 collection에 데이터를 분산해서 저장하는 것을 실무에서는 권장합니다.

 

=>collection생성

db.createCollection(“컬랙션 이름”)

 

=>데이터를 처음 삽입할 때 없는 컬랙션이름을 사용하면 컬렉션이 자동으로 생성됩니다.

 

3. 데이터 삽입

db.collection.insert({필드:, 필드 :})

db.collection.save({필드:, 필드 :})

db.collection.insertOne({필드:, 필드 :})

db.collection.insertMany({필드:, 필드 :},{필드:, 필드 :}) #여러개 입력할때 사용

 

 

=>데이터를 삽입하면 object라는 자료형으로 _id필드를 생성해서 삽입

_id가 기본키의 역할을 수행

insert save의 차이는 이미 존재하는 _id를 직접 입력했을 때 insert는 에러가 발생하고 save는 수정을 합니다.

 

4.컬렉션의 전체 데이터 조회

db.collection.find()

 

5.데이터 삽입

db.users.insert({"nane":"kim"})

확인

db.users.find()

_id기본 키값이다.

 

게시판

RDBMS

회원테이블 ----------> 게시판테이블 ----------------->댓글 테이블

1 : N                           1:N

회원테이블과 ---->댓글테이블

1:N

데이터를 조회하면 JOIN을 한다.

 

 

MONGODB

회원게시판 댓글을 하나의 COLLECTION으로 만든다.

서로 다른 정보들을 그래서 조회에 강하다.

JOIN작업이 없다.

 

 

db.users.insert([{"name":"lee"},{"name":"park"},{"name":"choi", score:90}])

db.users.find()

 

6. insert 2번째 매개변수

ordered속성에 true false 지정할 있습니다.

옵션은 여러개의 데이터를 삽입할 사용이 가능합니다.

ordered true 설정하면 데이터를 순서대로 하나씩 삽입합니다.-싱글 스레드를 사용

ordered false 설정하면 데이터를 동시에 삽입합니다.-멀티 스레드를 사용

기본값은 true입니다.

 

여러 개의 데이터를 삽입하다가 에러가 발생하면 ordered true인 경우는 에러가 발생하는 시점부터 동작이 중지가 됩니다.

ordered false인 경우는 에러가 발생한 데에터를 제외하고는 모두 삽입이 됩니다.

 

사소한 에러는 무시하고 빠르게 데이터를 삽입하고자 하는 경우에는 ordered false로 해서 삽입하지만 데이터를 순서대로 연쇄적으로 삽입해야 하는 경우는 ordered true로 해서 d에러가 발생하면 작업을 더 이상 진행하지 않도록 해주어야 합니다.

다시 수행하고 싶을때 use mymongo

 

반응형

'Study > DB' 카테고리의 다른 글

DB-6  (0) 2020.09.18
DB-4  (0) 2020.09.15
DB-3  (0) 2020.09.15
DB-2  (0) 2020.09.13
DB-1  (0) 2020.09.13

+ Recent posts