- nosql : mongoDB
- RDB 와 nosql차이는?
- 어떤 점이 좋은가?
- monogoDB가 RDB를 대신할 수 있는건 아님
- api 준비해야함 : 내장 X
- driver준비할때 api도 같이 사용할 수 있음
- 5개 부족하면 다시 붙일 수 있음
- RDB
- 테이블 늘릴려면 컴퓨터 성능을 높여야 함
mongoDB
- 도큐먼트 데이터베이스
- 도큐먼트 : mongoDB가 데이터를 저장하는 최소 단위
- 필드와 쌍으로 구성됨
- 관계를 갖는 중첩 도큐먼트와 배열을 사용하여 1개의 도큐먼트로 표현 가능
- 데이터 입출력
- JSON형식의 도큐먼트 사용
- 데이터 저장
- 이진 포맷으로 인코딩한 BSON 형식의 도큐먼트로 변환되어 저장됨
- 도큐먼트 : mongoDB가 데이터를 저장하는 최소 단위
- 테이블을 만들지 않음
- 콜랙션이라는 것을 만듦
mongoDB RDB 스키마 - 컬럼 얼마든지 원하는대로 만들 수 있음
- key, value쌍으로 저장
- 테이블 구조 없음
- 문서 작성 규칙
- 같은 필드라도 데이터 타입이 다를 수 있음
(비정형 스키마)- 이미 만들어져 있는 컬럼에 대해서만 가능
- 갑자기 컬럼 추가 못함 (정형데이터)
- 똑같은 컬럼 구조여야함
- 데이터 구조 미리 정함SQL NOSQL SQL - 저장되어 있는 형식을 지정하지 않는다.
- free- 중복 최소화시 여러개의 테이블 나눠서 저장
- 테이블간에 관계 있음서버 확장 - 서버 확장 시 붙이면 됨 - 서버 확장 시 전체 복사해야함 트랜젝션 - 트랜젝션 불가능
- 성능을 더 크게 생각함- 트랜젝션 가능 (은행업무)
- 다른 유저들은 commit할 때까지 볼 수 없음
- jdbc는 자동 커밋JOIN - Join 지원 X
- 임베디드 방식 or 레퍼런스 방식의 도큐먼트 구조 사용하고 나서 애플리케이션에 조인해야함- join 지원 O 컬렉션 사용 테이블 사용 도큐먼트 행 - 유연성
- 도큐먼트를 바꾼다고 해서 특별히 할 일은 없다.
- 확장성
- 서버 확장 가능
- 백업 안 해도 됨
- 가져다 붙이면 됨
- 고성능
- 대용량 처리 성능 뛰어남
- 일관성
- 트랜젝션 포기
- 가용성
- 데이터 저장할 때, 4개의 머신 묶어놓은 것을 클러스터라고 함
- 마스터가 데이터 저장할 때, 슬레이브가 여러곳에 복제해서 저장
- 단일 컴퓨터 환경 X
- 장애가 생기더라도 쓰는 데이터는 읽고 쓰는 거 지장 X
- 스케일링에 좋다
- 성능을 키우는데 적합하다.
- 스케일 아웃
- 그냥 붙이는 것,
- 환경설정 해줘야함
- 데이터 저장시 BSON형식으로 저장해서 사용함
BSON | JSON | |
- json 데이터를 이진 형식으로 인코딩한 포맷 (인코딩 디코딩 필요) |
-javascript에서 객체 생성시 사용하는 표현식 | |
포맷 형식 | - 컴퓨터가 이해할 수 있는 이진포맷 | - 인간이 쉽게 이해할 수 있는 텍스트 형식 |
검색 속도 | - 검색속도 빠름 | - 데이터 검색 전 파싱 필요 -> 검색 속도 느림 |
이진 데이터 타입 지원 | - 날짜 및 이진 데이터 타입 지원함 | - 날짜 및 이진 데이터 타입 지원 X |
데이터 조작어 ( DML )
insert
// mongoDB
db.member.insert({no : "C001", age : 45, status : "A"})
//관계형 DB
insert into memeber(no, age, status) values('C001', 45, 'A')
- db : 현재 사용준인 db 참조하는 내장 변수
- 내장 변수 : 선언하지 않아도 사용 가능
- member : 컬렉션 이름
- insert : 하고자 하는 작업
- 한 덩어리의 JSON형식 컨텐츠가 하나의 도큐먼트가 된다.
- 몇개가 될 수 있는지 제한 없다.
- 키 : 필드
- no필드, age 필드, status 필드
- 필드 명에 더블인용부호 안 줘도 된다.
- 근데 진짜 JSON은 줘야함
update (수정)
// mongoDB
db.member.update({age : {$gt : 25}}, {$set : {status : "C"}}, {multi : true})
- {multi : true} → 다중, 모두 다
- {multi : false} → 최초 하나만 바꿈
- {$gt : 25} 네임 벨류
- $gt : 연산자 (크다 연산자)
- key에는 일반 문자형만 올 수 있어서
- 아규먼트 찾은거
- 어떻게 업데이트 할 것인가
- 추가적으로 전달하는 부가정보 (옵션)
//관계형 DB
updete memeber set status = 'C' where age > 25
삭제
// mongoDB
db.member.remove({no : "C001"})
- 필드명이 C001인 것을 삭제해라
//관계형 DB
delect from member where no = 'C001'
조건에 해당하는 JSON 객체 안 주면 ALL이 된다.
스키마
mongoDB | 관계형 DB | |
스키마 생성 | - 어떤 컬럼 정의하는지 미리 정함 - 데이터구조 미리 정함 |
|
데이터입력 | - 비정형 Data - 집어 넣고 싶은 도큐먼트 사양 그때 그때 마음대로 유연하다. |
- 정형 Data - 컬럼 사양 맞춰줘야함 |
스키마조회 | 스키마 없음 | 스키마(테이블 구조)정해져 있음 |
장점 | 스키마 선업없이 도큐먼트에 필드 추가 및 삭제 자유로움 | 컬럼 사양에 맞춰야함 |
단점 | 전체 도큐먼트 조사해야함 | 스키마 선언 후 , 정형화 구조에 맞춰야만 데이터 입력가능 |
실습
use 데이터 베이스 이름
- 없으면 새로 만들어줌
db
- 현재 사용하고 있는 db 뭐냐
show dbs
- 도큐먼트 한개도 없으면 온전한 db가 될 수가 없다.
db.book.insert({"name":"python","price":10000})
- book 컬렉션 먼저 만들어주고
- 그 안에 도큐먼트 넣어줌
show collections
현재 안에 있는 컬렉션들을 보여달라
db.book.find()
// 가격이 낮은 순
db.book.find().sort({"price":1})
// 가격이 높은 순
db.book.find().sort({"price":-1})
// 가격이 높은 순 - 여러개 설정
db.book.find().sort({"price":-1,"name":1})
// 이름이 자바스크립트인 서적만 꺼내라
db.book.find({"name":"javascript"})
// 자바로 시작하는 친구
db.book.find({"name" : {"$regex":"^java"}})
//가격이 8000넘는 친구
db.book.find({"price" : {"$gt":8000}})
//가격이 8000보다 작거나 같은
db.book.find({"price" : {"$lte":8000}})
- 데이터 일치
- 연산자 : regex
- ^ : 시작하는 문자
- ^java : 자바로 시작하는
- $ : 끝나는 문자
- . : 개행식을 제외한 모든 문자
- 연산
- lt : 미만
- lte : 이하
- gt : 초과
- gte : 이상
//메서드 전부 다 나옴
db.book.help()
// 첫번째 아규먼트 아무것도 없는 것 -> 안 주면 안됨
// name필드는 꺼내, price는 빠짐 (name만 꺼내고, id는 언급 안 하면 무조건 나옴)
db.book.find({},{'name':1})
// id는 안 뽑고 싶다 (따로 언급 안 한건 모두 0이 됨)
db.book.find({},{'name':1,'_id':0})
// 꺼내고 싶은 것 true로
db.book.find({},{'name':true})
- 아무것도 설정 안 해주면 0임
- 1이나 true와 같음
db.book.find({price : {$lt : 10000}},{name : true, price : true, _id : false})
- 첫 번째 아규먼트는 where절과 비슷
- 두번째는 select와 비슷
db.book.find({}, {'name':0, _id:0})
- 언급한 필드가 다 false이면 다 true라고 인식함
- 위의 코드 name, _id빼고 price나옴
'study > JAVA 전문가' 카테고리의 다른 글
[mongoDB] 날짜 데이터 (0) | 2021.12.24 |
---|---|
[mongoDB] 2 (0) | 2021.12.23 |
[mysql] 연습문제 2 (0) | 2021.12.22 |
[sql] roll back 연습문제 (0) | 2021.12.21 |
[JDBC] 방명록 (0) | 2021.12.21 |