160822: 107회차
Programming
2016. 8. 22. 18:03
종료하기 전 티스토리 네이버 로그아웃 할 것
1. 툴
동일
추가시:
2. 폴더
동일
추가시:
3. 사용할 사이트
동일
추가시:
4. 공부하는 것
[02] NoSQL 구조 및 특징, 키구조
[01] NoSQL 구조 및 특징
- NoSQL에서는 관계형 데이터베이스에서 금기시했던 정규화 관련 제약사항들이
거이 허용되며, 그런만큼 NoSQL에서 데이터 모델 구조 설계의 폭이 더 넓어졌다.
- NoSQL에서는 시스템의 품질이 설계 구조에 따라 결정된다.
- 부서이력과 자격사항을 Column Family로 구분해 설계했다.
- 데이터베이스에 저장된 형태
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의 크기가 너무 커지면, 데이터가 한 서버에 집중 될 수 있다.
4. NoSQL json - JSON 현태의 테이터 보관이 가능
- 한 컬럼이지만 내부적으로 제이터 구조를 가지고 저장되므로 프로그램에서
json 데이터 처리가 가능하다.
- 저장된 데이터의 형태이다.
[02] NoSQL 키구조
- 데이터베이스에서는는 거의 모든 연산이 key에 의해 수행된다.
- 데이터베이스에서 key를 설정하는 것이 무척중요하다. 그렇치만 Key 구조를
결정하는 것은 그리 쉬운일이 아니다.
- key 영역은 row key, columns으로 구분된다.
- 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. 관계형 모델
a. 관계형 모델
- 학생이 과목을 수강하는 예에서 학생은 여러과목을
수강할 수 있다.
- 학생과 수강테이블이 분리되어 관계를 맺게된다.
- 만약 조인을 하지 않기 위해서 역정규화를 하게되면
하나의 학생테이블에 통합하게 되어 잘못된 설계가
된다.
- 이 잘못된 사례가 NoSQL에서는 정상적인 모델링 방법
이 된다.
b.NoSQL 모델
- 사원과 조직이력을 예를 들어 보면, 사원은 근무하면서 여러번
조직이 바뀔수 있다.
- 관계형 모델에서는 사원,조직 테이블로 분리해 테이블이 생성
된다.
- NoSQL에서는 하나의 사원테이블안에 조직 변경이력을 관리한다.
- 실제로 데이터베이스에 저장되는 모습이다.
- row key는 사번이 저장되고, Columns에 성명 컬럼은
CQ(column qualifier)로 저장된다.
- nested에 해당되는 개편차수와 부서코드를 통합하여
CQ로 저장하고 부서명과 부서장이 결합되어 value로
저장된다.
2) 복합 nested 모델
- Nested 엔티티가 하나 이상일 경우에 사용되는 모델이다.
- 하나 이상을 구분하기 위해 CQ에 prifix를 사용하여 구분한다.
- 데이터베이스 실제 저장되는 형태, 자격증은 L을 prefix로 사용하며,
부서는 D를 prefix로 사용한다.
- 하나 이상을 구분하기 위해 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 데이터 처리가 가능하다.
- 저장된 데이터의 형태이다.
[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 개요
- Document는 동적(dynamic)의 schema 를 갖고있다.
5) RDMS와의 비교
- 환경변수에 추가 Path=C:\Program Files\MongoDB\Server\3.2\bin;
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 다운로드 및 설치
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(
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 |