160822: 107회차

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[02] NoSQL 구조 및 특징, 키구조

[01] NoSQL 구조 및 특징

   - NoSQL에서는 관계형 데이터베이스에서 금기시했던 정규화 관련 제약사항들이 
     거이 허용되며, 그런만큼 NoSQL에서 데이터 모델 구조 설계의 폭이 더 넓어졌다.
   - NoSQL에서는 시스템의 품질이 설계 구조에 따라 결정된다.


1. Static Column Family와 Eynamic Column Family
  - NoSQL에는 컬럼정의가 데이터 저장시 이루어진다.
  - Cassandra DB인 경우에는 테이블 정의시 column을 정의
    할 수 있다.
  1) Static Column Family(고정 컬럼 패밀리)
   - 관계형 데이터베이스와 같이 테이블 정의시 컬럼정의(Cassandra)
  
  2) Dynamic Column Family(유동 컬럼 패밀리)
   - 테이블 생성시 컬럼을 미리 정의하지 않는다.
   - 컬럼은 데이터 저장시 컬럼명을 그때 그때 부여받는다.
   - 관계형 데이터베이스와 가장 큰 차이점이다.
 
  3) 관계형/NoSqL 모델
 
   a. 관계형 모델
    - PK : 년월 + 도서명 , 작가
 
  
   b. NoSQL(Static) // 관계형 데이터 모델과 거의 비슷하다
    - 년월 + 도서명이 row key로 정의되어 테이블생성시 정의된다.

 
 
   c. NoSQL(Dynamic)
    - row key는 년월이 되고 컬럼이 도서명이 된다.value값은 작가가된다.
    - NoSQL에서는 컬럼명이 데이터로 들어가기 때문에 이 모델도 가능하다.
    - 컬럼명은 무한대로 확장 가능하고 컬럼명도 계속 변한다.
 
고정값이 아니라서 변형 가능하다.

 
2. Nested Table
  - NoSQL에서는 관계형 데이터베이스와는 다른 nested 테이블이 가능하다
    테이블 안에 테이블을 정의할 수 있다.
  - 관계형 모델에서 nested 모델은 제 1정규화 위반이다
 
  1) 단일 nested 모델
  - 관계형 모델에서 부모자식 관계로 표현된다.
  - 관계형 모델에선 nested 모델은 추천하지 않는 구조이며
    이구조를 구현하기위해선 별개의 테이블을 생성한다.

  a. 관계형 모델
  - 학생이 과목을 수강하는 예에서 학생은 여러과목을
    수강할 수 있다.
  - 학생과 수강테이블이 분리되어 관계를 맺게된다.
 
 
  - 만약 조인을 하지 않기 위해서 역정규화를 하게되면
    하나의 학생테이블에 통합하게 되어 잘못된 설계가
    된다.
  - 이 잘못된 사례가 NoSQL에서는 정상적인 모델링 방법
    이 된다.
  b.NoSQL 모델
  - 사원과 조직이력을 예를 들어 보면, 사원은 근무하면서 여러번
    조직이 바뀔수 있다.
  - 관계형 모델에서는 사원,조직 테이블로 분리해 테이블이 생성
    된다.
   
 
 
  - NoSQL에서는 하나의 사원테이블안에 조직 변경이력을 관리한다.
 
 
 
  - 실제로 데이터베이스에 저장되는 모습이다.
 
  - row key는  사번이 저장되고, Columns에 성명 컬럼은 
    CQ(column qualifier)로 저장된다.
   
  - nested에 해당되는 개편차수와 부서코드를 통합하여
    CQ로 저장하고 부서명과 부서장이 결합되어 value로
    저장된다.

 
  2) 복합 nested 모델
   - Nested 엔티티가 하나 이상일 경우에 사용되는 모델이다.
  - 하나 이상을  구분하기 위해 CQ에 prifix를 사용하여 구분한다.
 



  - 데이터베이스 실제 저장되는 형태, 자격증은 L을 prefix로 사용하며,
    부서는 D를 prefix로 사용한다.
  

 
  3) Column Family를 활용한 Nested 모델

   - 부서이력과 자격사항을 Column Family로 구분해 설계했다.
   
   

  - 데이터베이스에 저장된 형태
  

 
 
3. Tall-Narrow vs, Flat-Wide Table 구조

   1) Tall-Narrow
   - 한 row에 컬럼수가 적고 컬럼이 고정되어 있다.
   - Cassandra에서는 skinny Row 라고도 하다.
  

   - row key에 아이디와 t1,t2..(등록일시)로 합쳐진 복합키로 이루어졌다.
   - message라는 컬럼이 고정되어있다.
   - 장점: row key로 부분 선별이 가능하다, 대량의 데이터 더 적합하다.
   - 단점: row가 많아진다.
 

  2) Flat-Wide
    - 한 row에 컬럼수가 많고 row수가 적다
    - Dynamic 컬럼을 많이 사용한다.
    - Cassandra에서는 Wide Row라고 한다.
   

   - CQ의 컬럼이 고정이 아니라 유동컬럼이다.
   - 한 row에 많은 컬럼들이 포함된다. row 단위로 저장하기 때문에 row에 데이터가 집중될수 있다.
   - 장점: 모든 컬럼은 row별로 정렬되어 저장된다, 
컬럼의 부분집합을 선택할 수 있다 
           즉, 한 계정의 메세지의 t1~t3사이의 메세지를 수분선택 가능하다.
   - 단점: row의 크기가 너무 커지면, 데이터가 한 서버에 집중 될 수 있다.
 

//2교시

4. NoSQL json
  - JSON 현태의 테이터 보관이 가능
 - 한 컬럼이지만 내부적으로 제이터 구조를 가지고 저장되므로 프로그램에서
    json 데이터 처리가 가능하다.
 - 저장된 데이터의 형태이다.


  


[02] NoSQL 키구조

 - 데이터베이스에서는는 거의 모든 연산이 key에 의해 수행된다.
 - 데이터베이스에서 key를 설정하는 것이 무척중요하다. 그렇치만 Key 구조를 
   
결정하는 것은 그리 쉬운일이 아니다. 
 - key 선택에는 경우의 수가 많아 많은 요구조건을 고려한 최적의 선택을 하여야 하고 
   
그선택은 데이터베이스 구조 및 성능을 구성하는 데 결정적 역할을 한다.

 
1. 관계형 모델 Key구조


 
 - 위에 예에서 주키(PK)의 설정은 매우 중요하고 성능 및
   모델의 품질을 결정한다.?
 - 베스트 앨범에도 같은 노래의 키를 사용하면 원 앨범을 쉽게
   조회할 수 있다.

 
2. NoSQL key구조
 1)Key/Value Key 구조
  - Row Key : 해당 테이블의 유일한 키
  - Value : 해당 테이블의 값
  - Key/value는 Key로 value에 접근하는 Key-based file systems로
    NoSQL에서 가장 간단한 구조이자 가장 기본적인 구조인다.
 
 2)Column Family 구조
  - NoSQL 키구조
  
 
 - key 영역은 row key, columns으로 구분된다.
    그리고 columns영역은 Column Family, Column Qualified,
    Timestamp로 세분화 된다.
  
  - RK(row key)
    모든 row는 논리적으로 Rk(Row key)에서 의해 결정되고
    전체 row에서 유일하다.예로 사원테이블의 사번이 RK이다
  
  - Column
    NoSQL 모델은 컬럼 단위로 데이터를 저장하기 때문에 컬럼
    RK와 같이 NoSQL의 key를 구성한다.
 
  - CF(Column Family)
    같은 개념을 갖는 컬럼들을 묶어 CF로한다. 일종의 구조적
    표현방식이다. 기존 관계형 모델에서 표현하지 못한 부분을
    NoSQL에서는 CF를 활용해서 표현한다.
 
  - CQ(Column Qualifier) 
    관계형 모델에서 이야기하는 컬럼이다. 컬럼별로 value가 
    저장된다. NoSQL에서 RK+CF+CQ와 value형태로 구성된다.
 
  - TS(Timestamp)
    TS는 해당 컬럼이 생성된 시간을 나타낸다. 이력 데이터 보관
    이라는 기능을 사용할 수 있도록 key로 구성된다.
 
  - 값(value)
    실제 데이터의 값이 들어간다.
 
 
3. NoSQL Row Key 확장
  - row key가 하나인것은 기본모델이지만 row key는 하나
    이상 확장될 수 있다.
  - row key가 사번+프로젝트 구개로 구성된 예다


 
  - row key를 구성하는 방법이 여러가지 있다.
 
  1)고정길이(Fixed Length)표현방법
  - 복합된 속성의 자리수를 고정시키는 방법이다.
    4자리 사번이고 5자리부터 8자리까지는 프로젝트 코드
    로 정의하고 자리수로 정의하는것이다.
 
  - 이방법은 속성의 길이가 고정되어 있을 경우에 사용해야
    한다.
  
  2)구분자(Delimiter)표현방법
  - 속성과 속성 사이에 사전에 약속한 구분자를 사용해
    구분하는 방법이다. 
  - 이방법은 key 속성의 길이가 가변일 경우에 주로 사용된다.
  - 사번:프로젝트와 같이 :로 구분해 두개의 key를 조합한다.
  
  3) Json 형식으로 데이터를 관리하는 방법도 있다.


--------------------------------------------
nosql 설계 공부해보기

---------------------------------------------------------------------

[03] MongoDB 개요 및 설치
[01]몽고DB 개요
 
1) 특징
 - 몽고DB는 NoSQL(Not Only SQL)데이터베이스로, JSON(Javascript
   Object Notation) 형태이 데이터를 저장한다.
 - SQL를 지원하지 않기 때문에 조인(Join)개념이 없고, 스키마는
   유동적이다. 
 - 스키마가 유동적이다란 몽고DB에서 저장하는 데이터 단위가 
   도큐먼트라는 것을 의미한다.
 - 몽고DB의 도큐먼트 속성은 SQL처럼 정형화되어 있지 않고, 
   가변적이기 때문에 모든 문서형태가 비정형 데이터를 저장하고
   처리하는데 적합하다.
 - 몽고DB는 C++로 작성된 오픈소스 문서지향(Document-Oriented)적 
   Cross-platform (어떤 OS던지 상관없이 설치가 가능한) 데이터베이스이며, 확장성과 성능이 높다 
 
2) Document

 - Document Oriented 데이터베이스란 Document를 그냥 ‘문서’로 
  번역해버리면 조금은 애매하다. 문서라고 하면 보통 워드/엑셀에 
  사용되는 그런 문서가 아니라 Document는 RDMS의 record 와 비슷한 
  개졈으로 이의 데이터 구조는 한개이상의 key-value pair (키와 값 쌍)으로 
  이뤄져있다. MongoDB 샘플 Document이다.
{
    "_id": ObjectId("5099803df3f4948bd2f98391"),
    "username": "velopert",
    "name": { first: "M.J.", last: "Kim" }
}
 
{
    "_id": ObjectId("5099803df3f4948bd2f98391"),
    "username": "velopert",
    "name": { first: "M.J.", last: "Kim" }
}

 - Document는 동적(dynamic)의 schema 를 갖고있다. 
   같은 Collection 안에 있는 Document 끼리 다른 schema 를
   갖을수 있다. 서로 다른 데이터(즉 다른 key) 들을 가지고 있다.
 
 
 3) Collection

 
 - Collection은 MongoDB Document의 그룹이다. 
 - Document들이 Collection내부에 위치하고 있으며, RDMS의 table과
   비슷한 개념이지만 RDMS와 달리 schema를 따로 가지고 있지 않는다. 
 - Document 부분설명에 나와있듯이각 Document들이 동적인 schema를 
   가지고 있다.
 
 4) Database
 
 - Database는 Collection들의 물리적인 컨테이너이다.
   각 Database는 파일시스템에 여러파일들로 저장된다.
 
    
 5) RDMS와의 비교
 
  - RDMS(Relational Database Management System:관계형 데이터베이스
    관리시스템)은 행과 열로 된 2차원의 table로 데이터를 관리하는 
    데이터베이스 시스템이다. Mysql, Oracle Database, DB2 등 

    

 
 [02]몽고 DB 설치

1.MongoDB 다운로드 및 설치 
 
 - 다운로드 :https://www.mongodb.com/download-center



 
 - MongoDB 공식 홈페이지의 다운로드 페이지에서 MSI 파일로 설치하면
   C:\Program Files\MongoDB\Server\3.2\bin\ 에 설치된다.

  
 
  

   
 
 - 기본 데이터베이스 디렉토리를 D:\javadb\mongodb\data\db 실행 전 폴더를 
   수동으로 만들어 준다.
 
 - CMD 창을 열어서 디렉토리로 들어가 mongod 를 실행하면 서버가 실행된다
 
 C:\Program Files\MongoDB\Server\3.2\bin\mongod --dbpath D:\javadb\mongodb\data\db
 
   

   
  
 - MongoDB가 실행되면 접속을 한다.
 
  C:\Program Files\MongoDB\Server\3.2\bin\mongo
 
      

   - 환경변수에 추가 Path=C:\Program Files\MongoDB\Server\3.2\bin;

 
[04] MongoDB CRUD Operation
[01] MongoDB CRUD Operation 
 - 참조:https://docs.mongodb.com/manual/crud/
 - 몽고DB의 CRUD(create,read,update,delete)연산은 별도의
   프로그래밍 언어가 아니며, 프로그래밍 언어의 API의 메소드
   또는 함수로 동작한다.
 - 몽고DB에서는 도큐먼트를 JSON형태로 전달하면서 2진 JSON인 
   BSON(Binary JSON)코드로 저장된다.
 - BSON은 경량화, 이식성 및 효율성을 고려하여 데이터 타입을
   정의한다.
 - BSON은 배열, 부울 대수, 자바스크립트 문자열, 정수, 실수,
   2진수 및 UTC시간, 타임스탬프, 도큐먼트 등의 데이터 형식을
   모두 활용할 수 있다.
 - 몽고DB는 컬렉션에 모든 도큐먼트를 저장하며, 컬렉션은 공유
   하는 3개의 인덱스셋을 갖는 관련 다큐멘트의 묶음이다.
 - 컬렉션은 관계형 모델의 테이블과 유사하다
 
 1) Create Operations
 - db.collection.insert()메소드는 컬렉션에 새로운 도큐먼트추가 

 
 
 - 사용자가 _id 필드없이 새로운 도큐먼트를 추가할 경우,
   클라이언트 라이브러리 또는 mongo 인스턴스는 _id를 추가하고
   유일한 Objectid를 부여한다.
 
 - 컬렉션에 도큐먼트 저장
  db.inventory.insert(
   {
    item:"ABC1",
    details:{
        model : "14Q3",
manufacturer : "xyz Company"
    },
    stock:[{size:"s",qty:25},{size:"M",qty:50}],
    category: "clothing"
   }
  )
 
 - inventory 컬렉션이 존재하지 않으면 컬렉션을 만들고 입력한다.
 
 - 입력된 도큐먼트 확인
  db.inventory.find()
 
 - 변수에 여러개의 도큐먼트를 저장한후 변수의 값(Documents)를
   저장한다.
 
 var mydocuments =
 [
   {
    item:"ABC2",
    details:{
        model : "14Q3",
manufacturer : "ABC Company"
    },
    stock:[{size:"M",qty:50}],
    category: "clothing"
   },
   {
    item:"ABC3",
    details:{
        model : "14Q3",
manufacturer : "CCC Company"
    },
    stock:[{size:"s",qty:25},{size:"M",qty:50},{size:"L",qty:50}],
    category: "clothing"
   },
    {
    item:"ABC3",
    details:{
        model : "14Q3",
manufacturer : "AAA Company"
    },
    stock:[{size:"s",qty:30}],
    category: "clothing"
   },
  ]
 
  db.inventory.insert(mydocuments)
 
 - 입력된 도큐먼트 확인
  db.inventory.find()

  


 
 2) Update Operations
 - db.collection.update()메소드로 갱신동작을 한다.
 - 컬렉션에 이미 존재하는 도큐멘트를 수정한다.
 - 어떠한 도큐먼트를 수정할것인지 결정하기 위해
   쿼리 기준을 정하거나 multi조건으로 다중 도큐먼트를
   갱신할 수 있다.

 
 - id 필드는 항상 도큐먼트의 첫번째 필드이다.
 - 필드이름을 다시 정하는 갱신동작은 도큐먼트의 필드
   순서를 다시 정할 수 있다.

 db.inventory.update(
 {item : "ABC2"},
 {
   $set:{
     category : "apparel",
     details:{model:"14Q3", manufacturer:"XYZ Company"}
   },
 
   $currentDate:{LastModified: true}
 
  }
 )
 
 - item : "ABC2"인 도큐먼트에 대해 $set과 같은 update
   연산자를 이용하여 수정한다.
 - $currentDate연산자를 사용하여 Lastmodified필드를 갱신한다.
 
 - 갱신실습을 위해 users컬렉션에 데이터를 입력한다.
 
 db.users.insertMany(
   [
     {
       _id: 1,
       name: "sue",
       age: 19,
       type: 1,
       status: "P",
       favorites: { artist: "Picasso", food: "pizza" },
       finished: [ 17, 3 ],
       badges: [ "blue", "black" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 85, bonus: 10 }
       ]
     },
     {
       _id: 2,
       name: "bob",
       age: 42,
       type: 1,
       status: "A",
       favorites: { artist: "Miro", food: "meringue" },
       finished: [ 11, 25 ],
       badges: [ "green" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 64, bonus: 12 }
       ]
     },
     {
       _id: 3,
       name: "ahn",
       age: 22,
       type: 2,
       status: "A",
       favorites: { artist: "Cassatt", food: "cake" },
       finished: [ 6 ],
       badges: [ "blue", "Picasso" ],
       points: [
          { points: 81, bonus: 8 },
          { points: 55, bonus: 20 }
       ]
     },
     {
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "Picasso", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
     },
     {
       _id: 5,
       name: "xyz",
       age: 23,
       type: 2,
       status: "D",
       favorites: { artist: "Noguchi", food: "nougat" },
       finished: [ 14, 6 ],
       badges: [ "orange" ],
       points: [
          { points: 71, bonus: 20 }
       ]
     },
     {
       _id: 6,
       name: "abc",
       age: 43,
       type: 1,
       status: "A",
       favorites: { food: "pizza", artist: "Picasso" },
       finished: [ 18, 12 ],
       badges: [ "black", "blue" ],
       points: [
          { points: 78, bonus: 8 },
          { points: 57, bonus: 7 }
       ]
     }
   ]
)
 
 - Update 처리를 한다.
 - db.users.updateOne : 조건에 맞는 첫번째 도큐먼트만 수정한다.
 - db.users.updateMany :  조건에 맞는 모든 도큐먼트 수정.
 - "favorites.artist": "Picasso" : 조건기준
 - $set: { "favorites.food": "pie", type: 3 } : 변경될 데이터
 
 db.users.updateOne(
   { "favorites.artist": "Picasso" },
   {
     $set: { "favorites.food": "pie", type: 3 },
     $currentDate: { lastModified: true }
   }
)
 
db.users.updateMany(
   { "favorites.artist": "Picasso" },
   {
     $set: { "favorites.artist": "Pisanello", type: 3 },
     $currentDate: { lastModified: true }
   }
)
 
 
3) Delete Operations
- db.collection.remove()메소드로 삭제한다.
- users컬렉션의 status:D인 도큐멘트 모두를 삭제함

 
db.users.deleteOne( { status: "D" } )











5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160824: 109회차  (0) 2016.08.24
160823: 108회차  (0) 2016.08.23
160819: 106회차  (0) 2016.08.19
160817: 105회차  (0) 2016.08.17
160816: 104회차  (0) 2016.08.16
Posted by DAVID