SKP 신호철
 SQLite  MySQL  MongoDB
 Overview ◦ 2000년 리처드 힙(D. Richard Hipp)과 그의 친구들이 만 들었습니다. 2000년 8월에 1.0 버전이 출시. ◦ Android, iOS등 거의 모든 모바일 디바이스에서 사용되 고 있는 DBMS. ◦ 그 외 firefox, dropbox, 등 왠만한 client-side 앱들도 거의 다 사용.
 단일 데이터베이스 파일 ◦ SQLite에서는 데이터베이스의 모든 정보가 단 하나의 파 일에 저장됨.  즉, 테이블 스키마, 레코드 데이터, 인덱스와 같은 모든 정보 가 한 파일에 저장  단일 파일로 동작하기 때문에 프로그램이 다중 프로세스나 다중 스레드로 동작하는 경우 파일 잠금(lock) 이슈가 발생할 수 있음.
 설정 파일 X ◦ SQLite는 라이브러리 형태로 제공되며, 별도의 설정 파일 이 없고 별도 서버를 구동하는 등의 사전 작업이 없음.
 간결성 ◦ 매우 간결한 데이터베이스  모바일 client-side에 적합.  페이지 크기(page size) 제한이 있으며, 데이터베이스 파일 이 파일시스템에 파일로 저장되기 때문에 파일 크기 제한이 있는 경우 데이터베이스가 동작하는 데 문제가 생길 수 있음.
 동시성 ◦ 읽기는 여러 프로세스에서 가능하지만, 쓰기는 한 순간에 오직 하나의 프로세스만 가능  모든 SQL문을 지원하지 않음. ◦ 예 : RIGHT / FULL OUTER JOIN, VIEW 수정, GRANT.
 npm install sqlite3
 SQL문 ◦ http://www.sqlite.org/lang.html를 참고  API ◦ https://github.com/developmentseed/node- sqlite3/wiki/API를 참고.
 세계에서 가장 많이 쓰이는 관계형 DBMS.  Mediawiki, drupal, bugzilla, …  mysql : http://www.mysql.com/  node-mysql : https://npmjs.org/package/mysql  server-client 구조. ◦ node-mysql을 설치하고 mysql-server도 설치해야함.
 다양한 storage 엔진 ◦ MyISAM  인덱스만 메모리에 올려서 처리.  테이블 레벨 잠금.  동시다발적인 변경 작업에는 부적합함. ◦ InnoDB  인덱스/데이터를 모두 메모리에 올려서 처리.  트랜잭션 제공.  행단위 잠금.  OLTP(OnLine Transaction Processing)에 적합.
 Archive ◦ 트랜젝션, 인덱스 모두 지원하지 않음. ◦ 행 단위 잠금. ◦ 메모리에서 데이터압축을 수행하며 디스크에 기록. ◦ 원시로그수집에 적합.  출처 : http://gywn.net/2011/12/mysql-three-features/
 Live replication ◦ 단순한 복사가 아닌 연속적인 업데이트 제공  읽기 부하 분산 가능 ◦ Read traffic이 많은 서비스에서 활용 가능 ◦ 그러나 write는 master만 가능 출처 : http://gywn.net/2011/12/mysql-three-features/
 NoSQL ◦ SQL을 사용하지 않는 데이터베이스 소프트웨어를 총괄 하는 용어  문서지향 데이터베이스 ◦ 문서 지향 데이터베이스는 테이블과 같은 경직된 구조에 데이터를 저장하지 않고 느슨하게 정의된 문서에 데이터 를 저장 ◦ 관계형 데이터베이스 시스템(RDBMS) 테이블에서는 열을 새로 추가하려면 테이블 자체의 정의를 변경해야 한다. 그러나 문서를 사용하는 경우에는 기타 모든 문서를 변경 하지 않고도 개별 문서에 속성을 새로 추가할 수 있다. 이 는 문서 지향 데이터베이스가 일반적으로 스키마를 사용 하지 않도록 설계되기 때문.
 JSON 형태의 문서 콜렉션으로 데이터를 저장 ◦ JSON의 2진 버전인 BSON을 사용하여, 키/값 쌍으로 데 이터를 유지하는 JSON 형태의 문서에 데이터를 저장  SQL문을 MongoDB 쿼리 함수 호출로 매우 간단 하게 변환 가능  MySQL과 비슷한 마스터/슬레이브 복제  자동 샤딩(Auto-sharding)을 이용한 수평적 확장  fourSquare 등에서 사용.
 > use test  switched to db test  > db.colors.save({name:"red",value:"FF0000"});  > db.colors.find();  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }  > db.colors.find({name:"red"})  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }   > db.colors.save({name:"white",value:"ffffff"});  > db.colors.save({name:"green", value:"00ff00"});  > db.colors.find()  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }
 인덱스 걸기 ◦ > db.alphabet.ensureIndex({code: 1}); ◦ > db.alphabet.ensureIndex({char: 1});  Skip, limit ◦ db.alphabet.find().limit(5); // first 5 rows ◦ db.alphabet.find().skip(5).limit(5); // next 5 rows
 > var red = db.colors.findOne({name:"red"});  > red.value = "ff0000";  ff0000  > red  {  "_id" : ObjectId("50ea1629da4e9474005af6fd"),  "name" : "red",  "value" : "ff0000"  }  > db.colors.find()  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }   > db.colors.save(red);  > db.colors.find()  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "ff0000" }  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }
 > db.colors.remove({name:"red"})  > db.colors.find()  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }  >
 > show collections  colors  system.indexes   > db.colors.drop();  true   > show collections  system.indexes   > show dbs  local (empty)  test 0.203125GB   > db.dropDatabase();  { "dropped" : "test", "ok" : 1 }   > show dbs  local (empty)
 Sharding ◦ 데이터를 여러 서버에 분할하여 저장  mongoDB에서는 auto sharding을 제공.  Write가 빈번하고, 공간이 부족할 경우 사용. http://hochul.net/blog/%ED%8F%AC%EC%8A%A4%ED%80%98%EC%96%B4%EA%B0%80-mongodb%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9D%B4%EC%9C%A0-auto-sharding/
Node.js DBMS short summary

Node.js DBMS short summary

  • 1.
  • 2.
    SQLite  MySQL  MongoDB
  • 3.
    Overview ◦ 2000년 리처드 힙(D. Richard Hipp)과 그의 친구들이 만 들었습니다. 2000년 8월에 1.0 버전이 출시. ◦ Android, iOS등 거의 모든 모바일 디바이스에서 사용되 고 있는 DBMS. ◦ 그 외 firefox, dropbox, 등 왠만한 client-side 앱들도 거의 다 사용.
  • 4.
    단일 데이터베이스 파일 ◦ SQLite에서는 데이터베이스의 모든 정보가 단 하나의 파 일에 저장됨.  즉, 테이블 스키마, 레코드 데이터, 인덱스와 같은 모든 정보 가 한 파일에 저장  단일 파일로 동작하기 때문에 프로그램이 다중 프로세스나 다중 스레드로 동작하는 경우 파일 잠금(lock) 이슈가 발생할 수 있음.
  • 5.
    설정 파일 X ◦ SQLite는 라이브러리 형태로 제공되며, 별도의 설정 파일 이 없고 별도 서버를 구동하는 등의 사전 작업이 없음.
  • 6.
    간결성 ◦ 매우 간결한 데이터베이스  모바일 client-side에 적합.  페이지 크기(page size) 제한이 있으며, 데이터베이스 파일 이 파일시스템에 파일로 저장되기 때문에 파일 크기 제한이 있는 경우 데이터베이스가 동작하는 데 문제가 생길 수 있음.
  • 7.
    동시성 ◦ 읽기는 여러 프로세스에서 가능하지만, 쓰기는 한 순간에 오직 하나의 프로세스만 가능  모든 SQL문을 지원하지 않음. ◦ 예 : RIGHT / FULL OUTER JOIN, VIEW 수정, GRANT.
  • 8.
    npm install sqlite3
  • 9.
    SQL문 ◦ http://www.sqlite.org/lang.html를 참고  API ◦ https://github.com/developmentseed/node- sqlite3/wiki/API를 참고.
  • 14.
    세계에서 가장 많이 쓰이는 관계형 DBMS.  Mediawiki, drupal, bugzilla, …  mysql : http://www.mysql.com/  node-mysql : https://npmjs.org/package/mysql  server-client 구조. ◦ node-mysql을 설치하고 mysql-server도 설치해야함.
  • 15.
    다양한 storage 엔진 ◦ MyISAM  인덱스만 메모리에 올려서 처리.  테이블 레벨 잠금.  동시다발적인 변경 작업에는 부적합함. ◦ InnoDB  인덱스/데이터를 모두 메모리에 올려서 처리.  트랜잭션 제공.  행단위 잠금.  OLTP(OnLine Transaction Processing)에 적합.
  • 16.
    Archive ◦ 트랜젝션, 인덱스 모두 지원하지 않음. ◦ 행 단위 잠금. ◦ 메모리에서 데이터압축을 수행하며 디스크에 기록. ◦ 원시로그수집에 적합.  출처 : http://gywn.net/2011/12/mysql-three-features/
  • 17.
    Live replication ◦ 단순한 복사가 아닌 연속적인 업데이트 제공  읽기 부하 분산 가능 ◦ Read traffic이 많은 서비스에서 활용 가능 ◦ 그러나 write는 master만 가능 출처 : http://gywn.net/2011/12/mysql-three-features/
  • 19.
    NoSQL ◦ SQL을 사용하지 않는 데이터베이스 소프트웨어를 총괄 하는 용어  문서지향 데이터베이스 ◦ 문서 지향 데이터베이스는 테이블과 같은 경직된 구조에 데이터를 저장하지 않고 느슨하게 정의된 문서에 데이터 를 저장 ◦ 관계형 데이터베이스 시스템(RDBMS) 테이블에서는 열을 새로 추가하려면 테이블 자체의 정의를 변경해야 한다. 그러나 문서를 사용하는 경우에는 기타 모든 문서를 변경 하지 않고도 개별 문서에 속성을 새로 추가할 수 있다. 이 는 문서 지향 데이터베이스가 일반적으로 스키마를 사용 하지 않도록 설계되기 때문.
  • 20.
    JSON 형태의 문서 콜렉션으로 데이터를 저장 ◦ JSON의 2진 버전인 BSON을 사용하여, 키/값 쌍으로 데 이터를 유지하는 JSON 형태의 문서에 데이터를 저장  SQL문을 MongoDB 쿼리 함수 호출로 매우 간단 하게 변환 가능  MySQL과 비슷한 마스터/슬레이브 복제  자동 샤딩(Auto-sharding)을 이용한 수평적 확장  fourSquare 등에서 사용.
  • 21.
    > use test  switched to db test  > db.colors.save({name:"red",value:"FF0000"});  > db.colors.find();  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }  > db.colors.find({name:"red"})  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }   > db.colors.save({name:"white",value:"ffffff"});  > db.colors.save({name:"green", value:"00ff00"});  > db.colors.find()  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }
  • 22.
    인덱스 걸기 ◦ > db.alphabet.ensureIndex({code: 1}); ◦ > db.alphabet.ensureIndex({char: 1});  Skip, limit ◦ db.alphabet.find().limit(5); // first 5 rows ◦ db.alphabet.find().skip(5).limit(5); // next 5 rows
  • 23.
    > var red = db.colors.findOne({name:"red"});  > red.value = "ff0000";  ff0000  > red  {  "_id" : ObjectId("50ea1629da4e9474005af6fd"),  "name" : "red",  "value" : "ff0000"  }  > db.colors.find()  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "FF0000" }  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }   > db.colors.save(red);  > db.colors.find()  { "_id" : ObjectId("50ea1629da4e9474005af6fd"), "name" : "red", "value" : "ff0000" }  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }
  • 24.
    > db.colors.remove({name:"red"})  > db.colors.find()  { "_id" : ObjectId("512d95bf1d7035fc23f8b9f9"), "name" : "white", "value" : "ffffff" }  { "_id" : ObjectId("512d95d41d7035fc23f8b9fa"), "name" : "green", "value" : "00ff00" }  >
  • 25.
    > show collections  colors  system.indexes   > db.colors.drop();  true   > show collections  system.indexes   > show dbs  local (empty)  test 0.203125GB   > db.dropDatabase();  { "dropped" : "test", "ok" : 1 }   > show dbs  local (empty)
  • 26.
    Sharding ◦ 데이터를 여러 서버에 분할하여 저장  mongoDB에서는 auto sharding을 제공.  Write가 빈번하고, 공간이 부족할 경우 사용. http://hochul.net/blog/%ED%8F%AC%EC%8A%A4%ED%80%98%EC%96%B4%EA%B0%80-mongodb%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9D%B4%EC%9C%A0-auto-sharding/