1. RDB & Nosql 차이
- RDB : SQL 정해진 규격 : 스키마, 테이블, 칼럼 / 조인 가능, 트랜잭션 사용 / 분산처리 어려움
- Nosql : 정해진 규격 없음 / 조인 불가능 / 트랜잭션 비사용 / 분산처리 쉬움
- 매일 수천개의 데이터를 쌓을 경우 RDB에서 Nosql로 확장함 (40% 이상 write를 하는 데이터의 경우 고려)
- 종류
+ Key & Value : redis
+ Wide Colum : Hbase, Casandra
+ Document : MongoDB, CouchDB
+ Graph : Neo4j, InfiniteGraph
2. mongoDB 기본 개념
- Json 기반의 Document 데이터 처리
{
"_id": ObjectId("5099803df3f42312312391"),
"username": "davelee",
"name": { first: "Dave", last: "Lee" }
}
- RDBMS | MongoDB
+ Database - Database
+ Table - Collection
+ Tuple / Row - Document
+ Column - Key / Field
+ Table Join - Embedded Documents
+ Primary Key - Primary Key (_id)
+ mysqld - mongod
+ shell 수행 : mysql - mongo (mongo --host 'host_address' --port 'port')
3. mongoDB CRUD
- insert
+ insertOne : 한개의 document 생성
+ insertMany : list of document 생성
- select
+ findOne : 매칭되는 한개의 document 검색
+ find : 매칭되는 list of document 검색
- update
+ updateOne : 매칭되는 한개의 document 업데이트
+ updateMany : 매칭되는 list of document 업데이트
- delete
+ removeOne : 매칭되는 한개의 document 삭제
+ removeMany : 매칭되는 list of document 삭제
4. mongoDB Index
- 기본 인덱스 (_id) : 모든 컬렉션에 기본적으로 _id 필드를 기본 index로 설정함
- 단일 인덱스
+ _id 이외에도 사용자가 직접 지정할 수 있는 인덱스
+ db.COLLECTION.createIndex( { 'field': 1 } ) 또는 db.COLLECTION.createIndex( { 'field': -1 } ) // 인덱스 방향 주의
- 복합 인덱스
+ 두개 이상의 필드를 사용하는 인덱스(최대 31개)
+ db.COLLECTION.createIndex( { 'field1': 1, 'field2': -1} ) // 인덱스 방향 주의
- 텍스트 인덱스
+ 텍스트 관련 데이터를 효율적으로 쿼리하기 위한 인덱스
+ db.COLLECTION.createIndex( { 'field' : 'text' } )
5. 스키마 설계 (참고 : https://www.haruair.com/blog/3055)
- One To Few : 하나당 적은 수의 관계
- One To Many : 부모가 되는 문서에서 배열로 자식이 되는 문서 저장 (애플리케이션 레벨 join 으로 두 문서 연결 필요)
- One-to-Squillions : 이벤트 로그와 같이 큰 크기의 데이터(16mb 이상)인 경우 parent-referencing 방식 이용
- 양방향 참조 : One To Many에서 자식이 부모를 참조할 수 있게 만듬, 단 삭제나 업데이트 시 2번 이용해야 하므로 원자성 보장 X
- 비정규화(Many To One, One To Many, One To Squilions) : 업데이트 비율이 낮고, 쓰기 속도를 높이고 싶은 경우
6. 빅데이터 개념
- 빅데이터 저장(샤딩) : 소프트웨어적으로 데이터베이스 분산처리 구조를 만듬
- 빅데이터 처리(어그리게이션) : Shard를 통하여 BigData를 저장하고, Aggragation Framework을 통하여 BigData를 처리
+ documents를 grouping, filtering 등 다양한 연산을 적용하여 계산된 결과를 반환