2018년 8월 14일 화요일

2. MongoDB 기본개념

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 등 다양한 연산을 적용하여 계산된 결과를 반환