Apache CouchDB가 0.9.1버젼에서 0.10.0 버젼으로 뛰었다.

11시간전에 DAMIEN KATZ 블로그에 올라왔다. 


이번 버젼 개선사항은  
  • Added modular configuration file directories.
  • Miscellaneous improvements to build, system integration, and portability.

이렇다고 한다. 

조금 더 편리하게 만들기 위해 노력한 것 같다.  

그 외에도 Show와 List API에 변화가 생겼다. 자세한 건 좀 더 살펴봐야겠다.



 

'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28
  1. [NC]...YellOw
    2009/10/14 22:32 [Edit/Del] [Reply]
    오~~ 뭔지 모르겠지만 버리님 내공이 팍팍 쌓인다는건 느낄 수 있네요.
    싸늘한 날씨에 감기 조심하세요~
    • 버리야
      2009/10/15 00:55 [Edit/Del]
      내공은 저~너머에..ㅠㅠ
      저 오늘 예방접종 주사 맞았어요
      이제 끄떡없다는..
      [NC]...YellOw님두 감기 조심하세요~

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] HTTP view API

Posted at 2009/09/29 09:50// Posted in 나만의 작업/DataBase
CouchDB wiki에 있는 내용을 보고 정리한 내용입니다. 
제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다.


view(뷰)는 Couch document를 쿼리하거나 리포팅할때 사용되는 주요툴이다.
뷰는 자바스크립트 function으로 정의된다.
function(doc) {
  emit(null, doc);
}

Creating Views
permanent view를 만들기 위해 function은 특별한 design document에 먼저 저장되어 있어야 한다.
design document의 id는 _design으로 시작하고 view attribute는 map과 optional하게 reduce를 갖는다.
design document의 모든 view는 index되어 있다.

design document
{
  "_id":"_design/company",
  "_rev":"12345",
  "language": "javascript",
  "views":
  {
    "all": {
      "map": "function(doc) { if (doc.Type == 'customer')  emit(null, doc) }"
    },
    "by_lastname": {
      "map": "function(doc) { if (doc.Type == 'customer')  emit(doc.LastName, doc) }"
    },
    "total_purchases": {
      "map": "function(doc) { if (doc.Type == 'purchase')  emit(doc.Customer, doc.Amount) }",
      "reduce": "function(keys, values) { return sum(values) }"
    }
  }
}


Altering/Changing Views

하나의 뷰나 여러개의 뷰들을 바구기 위해선 document바꿀때랑 똑같다.

Access/Query
database에 document가 한번 저장되어있으면 모든 view는 이 URL로 반환받을 수 있다.
http://localhost:5984/database/_design/company/_view/all

요청은 이렇게..
GET /some_database/_design/company/_view/all HTTP/1.0
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT

응답은 다음과 같다.
HTTP/1.1 200 OK
 Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
 Content-Length: 318
 Connection: close

 {
    "total_rows": 3,
    "offset": 0,
    "rows": [{
        "id":"64ACF01B05F53ACFEC48C062A5D01D89",
        "key": null,
        "value": {
          "LastName":"Katz",
          "FirstName":"Damien",
          "Address":"2407 Sawyer drive, Charlotte NC",
          "Phone":012555754211
        }
      }, {
        "id":"5D01D8964ACF01B05F53ACFEC48C062A",
        "key": null,
        "value": {
          "LastName":"Kerr",
          "FirstName":"Wayne",
          "Address":"123 Fake st., such and such",
          "Phone":88721320939
        }
      }, {
        "id":"EC48C062A5D01D8964ACF01B05F53ACF",
        "key": null,
        "value":
        {
          "LastName":"McCracken",
          "FirstName":"Phil",
          "Address":"1234 Fake st., such and such",
          "Phone":7766552342
        }
      }
    ]
 }


Temporary Views
한번 쿼리 날리고 말것(CouchDB database에 view를 저장하고 싶지않으면) _temp_view라는 특별한 view를 통해 할 수 있다.
Temporary View는 개발중에만 사용하는 것이 좋다.

요청
POST /some_database/_temp_view  HTTP/1.0
Content-Length: 48
Date: Mon, 10 Sep 2007 17:11:10 +0200
Content-Type: application/json

{
  "map" : "function(doc) { if (doc.foo=='bar') { emit(null, doc.foo); } }"
}

응답
{
  "total_rows": 1,
  "offset": 0,
  "rows": [{
      "id": "AE1AD84316B903AD46EF396CAFE8E50F",
      "key": null,
      "foo": "bar"
    }
  ]
}

NOTE : CouchDB 0.9.0에선 _temp_view에 POST 요청시 Content-Type: application/json를 써줘야한다.

Querying Options

아래와 같은 URL query arguments가 허용된다.

    * GET
            key=keyvalue

            startkey=keyvalue

            startkey_docid=docid

            endkey=keyvalue

            endkey_docid=docid

            limit=max rows to return This used to be called "count" previous to Trunk SVN r731159

            stale=ok

            descending=true

            skip=number of rows to skip

            group=true Version 0.8.0 and forward

            group_level=int

            reduce=false Trunk only (0.9)

            include_docs=true Trunk only (0.9)
           
    *  POST

            {"keys": ["key1", "key2", ...]} Trunk only (0.9)
           

'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] HTTP Document API

Posted at 2009/07/14 10:02// Posted in 나만의 작업/DataBase
CouchDB wiki에 있는 내용을 보고 정리한 내용입니다.
제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다.


Naming/Addressing
CouchDB에 저장된 Document들은 DocID를 가진다. DocID는 유니크한 아이디. 두개의 document는 같은 database안에 같은 identifier를 가질 수 없다.

"test"라는 이름의 database안의 some_doc_id, another_doc_id, BA1F48C5418E4E68E5183D5BD1F06476 이름의 document가 있다.
http://localhost:5984/test/some_doc_id
http://localhost:5984/test/another_doc_id
http://localhost:5984/test/BA1F48C5418E4E68E5183D5BD1F06476

JSON
CouchDB document는 간단한 JSON object이다.
{
 "_id":"some_doc_id",
 "_rev":"D1C946B7",
 "Subject":"I like Plankton",
 "Author":"Rusty",
 "PostedDate":"2006-08-15T17:30:12-04:00",
 "Tags":["plankton", "baseball", "decisions"],
 "Body":"I decided today that I don't like baseball. I like plankton."
}

Working With Documents Over HTTP

document생성

buri라는 database안의 document들의 리스트를 얻을려면,
~]curl -i http://localhost:5984/buri/_all_docs

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Server: CouchDB/0.9.0 (Erlang OTP/R13B)
Etag: "EUBRVUD02OXJJT4QD3O565AWW"
Date: Sat, 04 Jul 2009 12:01:04 GMT
Content-Type: text/plain;charset=utf-8
Cache-Control: must-revalidate

{"total_rows":3,"offset":0,"rows":[
{"id":"038dac2f6d16d32cfa4f0beedd1b970f","key":"038dac2f6d16d32cfa4f0beedd1b970f","value":{"rev":"1-752793712"}},
{"id":"_design/log","key":"_design/log","value":{"rev":"1-1517763105"}},
{"id":"test_doc","key":"test_doc","value":{"rev":"1-2073410021"}}
]}

하나의 document의 정보를 알고 싶으면(기본필드(_id, _rev)외에 따로 추가한 필드가 없어서 응답받은 JSON은 이렇다.
~]curl http://localhost:5984/buri/test_doc
{"_id":"test_doc","_rev":"1-2073410021"}

Accessing Previous Revisions

특정한 revision의 document를 가져오고 싶으면,
~]curl http://localhost:5984/buri/test_doc?rev=1-2073410021
{"_id":"test_doc","_rev":"1-2073410021"}

document의 가능한 revision을 찾기 위해선,
~]curl http://localhost:5984/buri/test_doc?revs=true
{"_id":"test_doc","_rev":"1-2073410021","_revisions":{"start":1,"ids":["2073410021"]}}

document의 현재 revision을 반환하지만, _revisions라는 필드는 이용가능한 revision ID를 리스트를 갖는다.

_revisions 결과가 하나라서 확인하여 좀 허무하다면,
revision을 증가시키기위해, document에 필드를 추가한 후 다시 _revisions를 확인하기 위해 요청해보면,
~]curl http://localhost:5984/buri/test_doc?revs=true
{"_id":"test_doc","_rev":"2-3544093946","test":"test field","_revisions":{"start":2,"ids":["3544093946","2073410021"]}}

_rev는 현재 revision을 반환하고, _revisions는 revision의 history ids를 가지고 있다.


이용가능한 document revision에 대해 좀 더 많은 정보를 얻고 싶으면, revs_info 파라미터를 이용하면 된다.
JSON 결과는 _revs_info 프로퍼티를 포함한 객체의 배열을 리턴한다.

{
  "_revs_info": [
    {"rev": "123456", "status": "disk"},
    {"rev": "234567", "status": "missing"},
    {"rev": "345678", "status": "deleted"},
  ]
}

PUT
새로운 document를 생성하기 위해선, POST나 PUT operation을 이용하면 된다.
PUT은 document를 생성/수정할 수 있다.

이미 존재하는 document를 수정하기 위해선 JSON body에 _rev 프로퍼티를 포함하고 있어야 한다.
그래야, CouchDB가 edit할지를 안다. database에 document의 현재 저장된 revision이 맞지 않으면, 409 conflict error를 리턴한다.

만약 revision 번호가 database에 있는 값과 매치하면 새로 generated된 revision 번호를 client에 리턴한다.

~]curl -X PUT http://localhost:5984/buri/test_doc -d '{"_id":"test_doc","_rev":"2-3544093946","test":"update field"}'
{"ok":true,"id":"test_doc","rev":"3-2553359885"}


POST
POST는 서버에 generated된 DocID를 생성하기 위해 사용된다. PUT method대신에 사용되기도 하는데 가능한한 POST를 피하는 걸 추천.
proxy나 다른 네트워크가 종종 POST 요청을 재전송해 document 생성 중복요청을 하므로...

DELETE
~]curl -i -X DELETE http://localhost:5984/buri/test_doc?rev=3-2553359885

HTTP/1.1 200 OK
Server: CouchDB/0.9.0 (Erlang OTP/R13B)
Etag: "4-386883723"
Date: Sat, 04 Jul 2009 12:49:12 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 48
Cache-Control: must-revalidate

{"ok":true,"id":"test_doc","rev":"4-386883723"}


All Documents
database의 모든 document의 리스트를 얻기위해 _all_docs URI를 이용

~]curl http://localhost:5984/buri/_all_docs 이런식으로

wiki에 나와있는 예제로 보면~

GET somedatabase/_all_docs HTTP/1.0

HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close

{
  "total_rows": 3, "offset": 0, "rows": [
    {"id": "doc1", "key": "doc1", "value": {"rev": "4324BB"}},
    {"id": "doc2", "key": "doc2", "value": {"rev":"2441HF"}},
    {"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}
  ]
}


revision ID와 DocID에 정렬로 모든 document의 리스트를 보여준다.
query argument에 descending=true 를 보내면 정렬이 descending으로 결과를 리턴한다.

~]curl http://localhost:5984/buri/_all_docs?descending=true 이런식으로

HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close

{
  "total_rows": 3, "offset": 0, "rows": [
    {"id": "doc3", "key": "doc3", "value": {"_rev":"74EC24"}}
    {"id": "doc2", "key": "doc2", "value": {"_rev":"2441HF"}},
    {"id": "doc1", "key": "doc1", "value": {"_rev": "4324BB"}},
  ]
}

query string 파라미터를 startkey, endkey와 limit을 주면 결과를 제한할 수 있다.

~]curl http://localhost:5984/buri/_all_docs?startkey="doc2"&limit=2 이런식으로 보내면

GET somedatabase/_all_docs?startkey="doc2"&limit=2 HTTP/1.0


HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close

{
  "total_rows": 3, "offset": 1, "rows": [
    {"id": "doc2", "key": "doc2", "value": {"_rev":"2441HF"}},
    {"id": "doc3", "key": "doc3", "value": {"_rev":"74EC24"}}
  ]
}

doc2 부터 두개의 값을 리턴받을 수 있다.

~]curl http://localhost:5984/buri/_all_docs?startkey="doc2"&endkey="doc3"

GET somedatabase/_all_docs?startkey="doc2"&endkey="doc3" HTTP/1.0

doc2와 doc3사이에 포함된 값을 리턴한다.


GET somedatabase/_all_docs?startkey="doc2"&limit=2&descending=true HTTP/1.0


HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close

{
  "total_rows": 3, "offset": 1, "rows": [
    {"id": "doc3", "key": "doc3", "value": {"_rev":"74EC24"}}
    {"id": "doc2", "key": "doc2", "value": {"_rev":"2441HF"}},
  ]
}

all_docs_by_seq

update됐거나, delete된 모든 document를 볼 수 있다.
~]curl http://localhost:5984/buri/_all_docs_by_seq
{"total_rows":3,"offset":0,"rows":[
{"id":"038dac2f6d16d32cfa4f0beedd1b970f","key":2,"value":{"rev":"1-752793712"}},
{"id":"a52617f0a61a11fa894a2ce6f62e3a7c","key":3,"value":{"rev":"2-695380571","deleted":true}},
{"id":"_design/log","key":5,"value":{"rev":"1-1517763105"}},
{"id":"test","key":6,"value":{"rev":"2-1465437068","deleted":true}},
{"id":"test_doc","key":10,"value":{"rev":"4-386883723","deleted":true}},
{"id":"test2_doc","key":11,"value":{"rev":"1-1479752545"}}
]}


Attachments

Document는 email과 값은 첨부파일을 가지고 있을 수 있다. 첨부파일을 사용하는 두가지 방법이 있는데 하나는 document에 인라인으로 기술하는 방법.
두번째 방법은 첨부파일을 위한 REST API을 이용하는 방법이 있다.

Inline Attachments

생성시 document의 _attachments attribute를 이용한다.
JSON 구조는 name, content_type, base64로 인코드된 첨부파일의 데이터를 가진다.
document가 리턴될때 첨부파일의 실제 데이터는 포함하지 않고 metadata만 반환된다. 실제 데이터는 따로 URI로 분라되어 fetch되어 있다.
document 요청시 첨부파일을 접근해야할때는 query parameter에 ?attachments=true를 포함해서 보낸다.

첨부파일이 있는 document 생성
{
  "_id":"attachment_doc",
  "_attachments":
  {
    "foo.txt":
    {
      "content_type":"text\/plain",
      "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
    }
  }
}

document를 요청하면,

GET /database/attachment_doc

이렇게 응답을 얻는다.
{
  "_id":"attachment_doc",
  "_rev":1589456116,
  "_attachments":
  {
    "foo.txt":
    {
      "stub":true,
      "content_type":"text\/plain",
      "length":29
    }
  }
}

첨부파일을 요청하면
GET /database/attachment_doc/foo.txt

foo.txt파일의 내용인
This is a base64 encoded text
자동적으로 디코드되서 리턴된다.

Multiple Attachments

{
  "_id":"attachment_doc",
  "_attachments":
  {
    "foo.txt":
    {
      "content_type":"text\/plain",
      "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
    },

   "bar.txt":
    {
      "content_type":"text\/plain",
      "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
    }
  }
}

Standalone Attachments

CouchDB 0.9버젼에 추가되었다. 그 전 버젼에선 이용할 수 없다.

Content-Type 헤더를 이용하여 MIME type을 이용한다.

요청은 이렇게..

PUT somedatabase/document/attachment?rev=123 HTTP/1.0
Content-Length: 245
Content-Type: image/jpeg

<JPEG data>

응답은 이렇게 온다.
{"ok": true, "id": "document", "rev": "765B7D1C"}

첨부파일을 바꿀땐(수정)

PUT somedatabase/document/attachment?rev=765B7D1C HTTP/1.0
Content-Length: 245
Content-Type: image/jpeg

<JPEG data>

첨부파일을 삭제
DELETE somedatabase/document/attachment?rev=765B7D1C HTTP/1.0

ETags/Caching

CouchDB는 document 요청을 위해 ETag Header를 보낸다.

GET 요청의 예
GET /database/123182719287


응답
cache-control: no-cache,
pragma: no-cache
expires: Tue, 13 Nov 2007 23:09:50 GMT
transfer-encoding: chunked
content-type: text/plain;charset=utf-8
etag: "615790463"

POST 요청도 새롭게 추가되거나 document가 업데이트 하기 위해 ETag header를 리턴한다.





'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] Compaction

Posted at 2009/07/13 13:54// Posted in 나만의 작업/DataBase
CouchDB의 Reference중 Compaction
CouchDB 공식 wiki에 적혀있는 내용을 간략히 정리해서 쓴 글입니다.

Compaction
Compaction은 database파일을 다시 쓰는 것.
outdated document revision을 제거하고 document를 삭제한다.

curl을 이용하여 테스트해보자!
~]curl http://localhost:5984/buri ('buri'라는 이름의 DB의 간략한 정보를 볼 수 있다.)
{"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false,
"disk_size":16361,"instance_start_time":"1246416252648676"}

~]curl -X POST http://localhost:5984/buri/_compact   (compactio수행)
{"ok":true}

~]curl http://localhost:5984/buri (DB정보 확인)
{"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false,
"disk_size":14807,"instance_start_time":"1246707347739253"}

disk_size가 줄었다는거~로 확인할 수 있다.

'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] HTTP database API

Posted at 2009/07/09 18:38// Posted in 나만의 작업/DataBase
CouchDB의 Reference중 HTTP database API

CouchDB wiki에 있는 내용을 보고 실행해 본 과정을 올립니다.
제 나름의 정리이기에 생략된 것도 있습니다.
실행은 curl을 통해서 주로 하였습니다.


Naming and Addressing

database 이름은 모두 소문자 a-z, 숫자 0-9, _$()+-/ 문자로 이뤄져야 하고 slash(/)로 끝나야한다.
http://couchserver/databasename/
http://couchserver/another/databasename/
http://couchserver/another/database_name(1)/

주의! 대문자는 database 이름에 포함되어서는 안된다.
http://couchserver/DBNAME/ (invalid)
http://couchserver/DatabaseName/ (invalid)
http://couchserver/databaseName/ (invalid)

URL에서 DB이름에 slash(/)를 넣기 위해선 escape 처리를 해야한다.
DB이름이 "his/her" 이면 url을 이렇게 써서 보내야 한다.
http://localhost:5984/his%2Fher

List Databases
CouchDB server에 있는 모든 database들의 리스트 조회 /_all_dbs
~] curl http://localhost:5984/_all_dbs

HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Length: 37
Content-Type: application/json
Connection: close

["somedatabase", "anotherdatabase"]


PUT (Create New Database)

위에 slash있는 Database이름을 만들어 보면

~]curl -X PUT http://localhost:5984/buri/test/
{"error":"invalid_json","reason":"undefined"}

escape처리해서 보내야 하므로~

~]curl -i -X PUT http://localhost:5984/buri%2Ftest/

HTTP/1.1 201 Created
Server: CouchDB/0.9.0 (Erlang OTP/R13B)
Date: Sat, 04 Jul 2009 10:56:20 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 12
Cache-Control: must-revalidate

{"ok":true}

이렇게 PUT 메소드를 실행하여 새로운 database를 만들었다!
성공하면 201 이미 존재한다면 412 HTTP status를 응답받는다.

DELETE
database를 지우고 싶으면 DELETE method를 이용하면 된다.

~]curl -X DELETE http://localhost:5984/buri%2Ftest
{"ok":true}

성공하면 200, 존재하지 않는다면 404 error HTTP status를 응답받는다.

Database Information
~]curl http://localhost:5984/buri

{"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false,
"disk_size":16361,"instance_start_time":"1246416252648676"}






'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28
  1. [NC]...YellOw
    2009/07/12 02:30 [Edit/Del] [Reply]
    늘~ 열심히 하고 있네요. 보기 좋네요.
    지금 비가 제법 내리고 있는거 같더라구여. 덕분에 차분한 밤을 보내고 있습니다 ^.~
    • 2009/07/17 11:49 [Edit/Del]
      늘 말씀드리는 거지만...속고 계신거에요...ㅋㅋㅋ
      주말내내 비가 정말 많이 내렸던 듯..
      덕분에 저도 밤에 차분히 보냈답니다..ㅋㅋ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] API Cheatsheet

Posted at 2009/07/09 18:30// Posted in 나만의 작업/DataBase
CouchDB Reference중 API Cheatsheet
 2009년 7월 현재 0.9.0버젼의 CouchDB 공식 wiki에 작성되어 있는 API Cheatsheet를 옮겨 적어놓습니다.


CouchDB Server Level Requests
info : GET /
all_dbs : GET /_all_dbs
config : GET /_config
stats : GET /_stats
UUIDs : GET /_uuids (takes a count parameter)
replicate : POST /_replicate (see Replication) <-http://wiki.apache.org/couchdb/Replication
source에서 destination으로 복제하고 싶을때

CouchDB Database Level Requests
compact : POST /db/_compact
create : PUT /db
drop : DELETE /db
info : GET /db
all_docs : GET /db/_all_docs
open_doc : GET /db/doc_id
save_doc (CREATE) : POST /db
save_doc (UPDATE) : PUT /db/doc_id
remove_doc : DELETE /db/doc_id
bulk_docs : POST /db/_bulk_docs
query (aka temporary view) : POST /db/_temp_view
view

CouchDB 0.9.0 이전 버젼에서는
GET /db/_view/designname/viewname

CouchDB 0.9.0 이후 버젼에서는
GET /db/_design/designname/_view/viewname



댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


one-click으로 가장 간단하게 Mac에서 실행하는 방법!  이보다 더 간단할 수 없다.

링크 : http://janl.github.com/couchdbx/

2009년 7월 현재  0.9.0-R13B 버젼을 받을 수 있다.
이 버젼엔 Erlang R13B, Spidermonkey 1.7 and ICU 3.8 가 포함되어 있다.

앞으로 계속 업데이트 될테니 저 링크에서 다운로드 받으세요~~

다운로드 후 더블클릭 하면 실행된다.!  끝!

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] 1. CouchDB가 뭐지?

Posted at 2009/07/07 10:34// Posted in 나만의 작업/DataBase
CouchDB???가 뭐지 하고 찾아보니
CouchDB는 아파치 오픈소스 프로젝트이고, DB이지만 Non-Relational Database이고 document-oriented기반이라고 합니다.

뭔가..새로운 포스가 느껴지는데..  뭔가 개성이 강한 느낌..으로 조금 더 살펴보면,




Couch를 사전에서 찾아보면 이런 뜻을 가지고 있는데..
1a 긴 의자, 소파 《기댈 수 있는 등받이와 팔걸이가 있는》
2 《문어·시어》 침상, 잠자리
3 《일반적으로》 휴식처 《풀밭 등》;(야생 동물의) 은신처, 굴(lair)


딱 이름만 듣고는 이런 DB를 만들고 싶지 않았을까란 생각은 들지만,
Cluster Of Unreliable Commodity Hardware의 약자라고 하네요..

특징은

    * RESTful API
    * Schema-less document store (document in JSON format)
    * Multi-Version-Concurrency-Control model
    * User-defined query structured as map/reduce
    * Incremental Index Update mechanism
    * Multi-Master Replication model
    * Written in Erlang (Erlang is good)

가장 중요한 점은 RESTful API를 이용한다는 것!

허걱 Erlang(얼랭)으로 쓰여져있다고 하고 스키마 필요없는 document을 저장하는 방식이고 이 document는 JSON format으로 데이터를 교환한다고 하는군요. 그리고 query는 map/reduce 구조를 이용합니다.


CouchDB는 요런 구조로 생겼다고 하네요.


CouchDB은 처음에 C++로 만들어졌지만 도중에 Erlang으로 교체되었고, CouchDB의 default view server는 C를 사용한 모질라의 Spidermonkey Javascript library를 이용합니다.

Apache 2.0 License 이고, CouchDb설치시에 웹서버가 같이 설치되어 Client와 HTTP로 통신하고 Data(Document)를 JSON으로 주고 받는다고 합니다.

처음에 호기심 가지고 보다보니 참 개성강한 듯 하군요.


  1. 2009/07/07 14:22 [Edit/Del] [Reply]
    먼저 올리다니 반칙이에요 ㅋㅋ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[오라클] 초성검색

Posted at 2009/04/28 17:39// Posted in 나만의 작업/DataBase
오라클 데이터 중에 'ㄱ'으로 시작되는 것! 찾을려면~ 
막상 생각나지 않는데~ 알고보면 간단하다! 뜨아

WHERE NAME >= '가' AND NAME < '나' 
  1. [NC]...YellOw
    2009/04/29 11:10 [Edit/Del] [Reply]
    이제 오라클도 접수되는거군요. 오라클 지못미..

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret



1. 제약조건 추가
alter table XXX
add constraint uq_XXX unique(xxx);

2. 제약조건 확인

select constraint_name, table_name 
from user_constraints 
where table_name = 'XXX';

CONSTRAINT NAME은 USER_CONSTRAINTS VIEW를 통해 확인 가능.
모든 CONSTRAINT는 DATA DICTIONARY에 저장된다.

3. index 확인

select a.index_name,a.index_type,a.status,a.uniqueness,a.table_name,b.column_name
from user_indexes a,user_ind_columns b
where a.index_name=b.index_name and a.table_name = 'XXX';

4. Oracle 정보 확인

select * from v$version;






  1. 2009/04/23 00:17 [Edit/Del] [Reply]
    공부 열심히 해 ㅋ
  2. [NC]...YellOw
    2009/04/29 11:10 [Edit/Del] [Reply]
    공부 열심히 하세요 ㅋ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

Oracle을 설치하지 않고, Oracle사에서 제공해주는 client이용하여 원격에 있는 Oracle 접속하기~

1. Mac OSX에서 설치법

1) 다운로드
http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/macsoft.html

여기서 간단히 Instant Client Package - Basic Instant Client Package - SQL*Plus을 받는다.

압축 받은 파일을 적당한 곳에 압축해제 한다. 난 두가지 폴더를 합쳐서 이름은 /usr/local/share/oracle 로 변경하였다. 

2) 터미널에서  vi  ~/.bash_profile 에서

# Oracle setting
export ORACLE_HOME="/usr/local/share/oracle"
export DYLD_LIBRARY_PATH=$ORACLE_HOME

PATH에 ORACLE_HOME을 추가시켜준다.

export PATH="$ORACLE_HOME:$PATH"

저장 후 

$ source ~/.bash_profile

3) sqlplus 실행
$sqlplus username:password@server_url:port/service_name


2. Windows에서 설치법

1) 다운로드
http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html

Mac에서와 같이 1)을 수행 
윈도우즈에서는 /application/oracle 이라고 폴더를 만들었다.

2) 환경변수 Path에 /application/oracle 추가

3) cmd 창에서 sqlplus실행
$sqlplus username:password@server_url:port/service_name


댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

JAVA DB - Derby

Posted at 2007/05/12 05:38// Posted in 나만의 작업/DataBase
이번에 Derby에 대해 접해볼 기회가 생겨서 조금씩 알아가고 있는데,
왠지 깜찍(?)하다는 느낌이 듭니다.

이 글을 쓰는 목적은 순전~히 버리의 이기적인 내용정리라고 할까요~
이렇게 쓰면서 제 자신이 정리하고자 하는 목적입니다. 제가 이해가 잘못된곳도 있을지도 몰라요~

Derby는 2005년 말에 Apache DB sub project로 제작되었는데
Embed와 Network Server를 둘다 지원해주는 순수 자바로 제작된 DB입니다.

서버로 띄우거나 어플리케이션에 내장하는 것이 가능하기 때문에 따로 DB를 띄우지 않고도 자바 어플리케이션 작성하는 것이 가능합니다. 이것이 큰 장점~

이 아이는, JVM만 설치되어 있으면 인스톨없이 작동되고 프로그램짤때
jar파일만 추가시켜 주면 됩니다. java 5.0부터는 아예 포함하고 있구요.

What's New in Java SE 6 Beta 2 (Mustang) - Mustang에 새로 추가되었다고 설명하고있습니다.
3. Database (Top 10중 3번째에 글이 나와있네요)

For a great out-of-the-box development experience with database applications, the final Mustang development kit – though not the Java Runtime Environment (JRE) – will co-bundle the all-Java JDBC database, Java DB based on Apache Derby. Developers will get the updated JDBC 4.0, a well-used API that focuses on ease of use – although it contains many feature additions like special support for XML as an SQL datatype and better integration of Binary Large OBjects (BLOBs) and Character Large OBjects (CLOBs) into the APIs. Additional features that improve ease of use include removal of some JDBC boilerplate and some of the new annotations that make SQL strings embed better into your JDBC application – like decorating your getAllUsers() method with an @Query(sql="select * from user") annotation, and that being all you need.


더 자세한 설명은,

Apache Derby 소개

Network Server 모드는 흔히쓰는 client/server방식 JDBC와 비슷하니, 간단히 하고
접해보지 못한 Embedded Derby 정리하겠습니다.

Eclipse에서 Plugin을 이용하면 Eclipse내부에서 derby Network Server를 시작할수있다.(Network Server일 경우,)

방법
  1. Unzip the two Derby Eclipse plugins (derby_core_plugin_10.1.2.zip and derby_ui_plugin_1.1.0.zip) into your eclipse installation folder (ECLIPSE_ROOT). Detailed instructions are available here: http://db.apache.org/derby/integrate/plugin_howto.html#Installing+the+plug-ins
  2. In your ECLIPSE_ROOT/plugins folder, you should have a folder named org.apache.derby.core_10.1.2. Copy the file derbyclient.jar from that folder to your TOMCAT_ROOT/common/lib folder. This installs the Derby JDBC driver into Tomcat for use in a DataSource.

참고 Creating Database Web Applications with Eclipse


Embedded Derby란?

When an application accesses a Derby database using the Embedded Derby JDBC driver, the Derby engine does not run in a separate process, and there are no separate database processes to start up and shut down. Instead, the Derby database engine runs inside the same Java Virtual Machine (JVM) as the application.
So, Derby becomes part of the application just like any other jar file that the application uses.

Derby Embedded Architecture

Figure 1: Embedded Architecture



JDBC applications and Derby basics

1) Derby embedded basics
- JDBC driver
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

- Connection URL
Connection conn=DriverManager.getConnection("jdbc:derby:sampleDB명");

Developing with Apache Derby -- Hitting the Trifecta:
Database development with Apache Derby, Part 2
에서 발취한 내용

Learn

Get products and technologies

그외,

derby를 떠올리자면 Cloudscape를 빼놓을수 없으니,Cloudscape FAQ 에 derby에 대한 내용도 많이 있습니다.

Derby Reference Manual - http://db.apache.org/derby/docs/10.2/ref/ref-single.html

Tuning Derby - http://www.onjava.com/pub/a/onjava/2007/01/31/tuning-derby.html


헉, 날이 밝아버렸네요... 이제 자야겠습니다~
Tag DB, derby, java, Sun
  1. 2007/05/12 08:32 [Edit/Del] [Reply]
    1.6부터 포함됬던거 같은데 아닌가요? JRE에는 없고 JDK에 포함되어 있던거 같아요.
    • 2007/05/12 12:39 [Edit/Del]
      아하! 제가 착각하고 있었습니다~..지적 감사합니다^^
      What's New in Java SE 6 Beta2(Mustang)에 보니
      여기서 JavaDB를 소개하고있군요,,ㅎㅎ
  2. 2007/05/12 12:01 [Edit/Del] [Reply]
    자바 쪽은 J2SE/J2EE 1.4때 잠깐 하고 치워버려서 이게 뭔지 전혀 모르겠네요 ^^;;
    • 버리
      2007/05/12 12:42 [Edit/Del]
      ^^ 저도 역시 C/C++은 몰라서 너무 불편합니다.
      조만간 다른언어 공부도 해야하단걸 절실히 느끼고 있습니다.^^

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

/*****************************************

Introduction to  Oracle 9i : SQL

작성일  : 2007.02.06

작성자  : 버리 (www.flyburi.com)

*****************************************/


1. SQL
구문

select distinct * column alias(빈칸,AS,””)

from table_name

where column, 표현식, value, 비교연산자(비교,select, 논리연산자)

order by Asc(default), desc

è     Distinct order by 쓰면 내부 그룹화가 발생한다.

è     Distinct 그룹내 정렬이 이루어진다.


2. SQL
함수

함수 : 하나 또는 여러 개의 인수를 받아들여 처리한 다음 결과값을 하나를 얻을수있다.

함수의 종류

1)    인수 하나 : 단일행 함수 문자, 숫자, 날짜, 일반, 변환

2)    인수 여러 : 다중행 함수(그룹함수)

문자함수

1)    대문자 조작함수 : LOWER, UPPER, INICAP(단어 첫글자만 대문자)

2)    문자 조작함수 : CONCAT, SUBSTR, LENGTH, INSTR, LPAD, RPAD, TRIM

알아두기!)

LOWER, UPPER 사용하는

오라클 where 절에서는 인수를 비교할 인수를 ASCII값으로 찾기 때문에 /소문자 구별한다. (내가 정확한 Format 모를 )

날짜함수

  오라클 데이터베이스는 다음과 같은 내부 숫자 형식으로 날짜를 저장합니다. “세기, 연도, , , , ,

변환함수

1)    암시적(implicit) 데이터 유형 변환

2)    명시적(explicit) 데이터 유형 변환

일반함수

    1) NVL 함수 - 무결성규칙을 따라야 한다.

uk : 쓸수있다.

pk : null값을 가지고 있지 않기 때문에 NVL 함수를 필요가 없다. 굳이 쓰려면 수는 있다.


2) NVL2
함수

null 해당되는지 않되는지만 결과를 리턴해 준다. 어떤 값을 계산해서 리턴하지는 않는다.


3) NULLIF
함수

NULLIF(expr1, expr2) : 표현식 비교하여 동일한 경우 null 반환한다. 동일하지 않을때 첫번째 표현식을 반환한다.


4) COALESCE
함수

첫번째 표현식 null 아닌 경우 해당 표현식을 반환한다. null 경우 나머지 표현식에 대해 COALESCE 함수를 적용한다.


3. 조건
표현식

distinct, order by 정렬, 그룹화 현상을 일으키기 때문에 퍼포먼스상 매우 좋지 않기 때문에 실무에서 쓰지 않는다.

Cf) 스와핑, 페이징.

DECODE함수는 CASE 표현식과 유사함. 성능이 CASE보다 좋음.

함수의 포인트!!! TO_CHAR, NVL, DECODE


4. JOIN

select ename, deptno

from emp, dept;

ename -> 20, deptno -> 8

20 * 8 = 160 : 카티시안 - 조인 조건을 생략한 경우 조인 조건이 부적합하다.

join을 사용하면 퍼포먼스가 떨어진다.

join보다 Sub Query를 사용하는게 퍼포먼스가 좋다.

join조건 쓸때 fk가 설정되어 있는 table이 앞에 나오는 게 빠르다.

1) Equal Join : pk, fk 비교할때, 같은 column이 있을경우 두 테이블에서 비교

column 이름은 36자까지 생성할 수 있다. (스키마에 alias 줄 수 있다. - 인라인뷰)

alias를 사용하면 oracle server는 alias명으로 검색한다.


기본 스키마는 생략가능하다.

alias를 사용하면 메모리 사용이 줄어든다.


alias를 쓸때는 alias를 전부 쓰고, table full name을 쓸 때는 full name을 써야한다.

alias와 table full name을 쓰면 에러난다.


Join table개수는 n-1 (n:join시킬 table수)

Join조건과 where 조건을 쓸 때는 and!! 만 OR!을 쓰면 에러난다.

where 조건과 join 조건 순서는 상관없지만 join조건이 앞에 나오는 것이 퍼포먼스상 좋다.


2) Non Equal Join : Between A and B

동등 연산자가 아닌 연산자를 포함하는 조인 조건, 전혀 다른 Data 값이 존재했을 때 사용한다.


3) Outer Join

Record는 포함하고 있지 않은 쪽에 (+)를 붙여준다.

부족한 쪽에 null 값을 삽입


4) Self Join

하나의 Table을 Alias를 줘서 여러개의 Table인 것처럼 한다.


5. 그룹함수

-> null값을 포함하지 않는다.


count(*)와 count(commission_pct)의 차이를 느낄수 있는 상황


Q) 우리 회사 직원의 commission_pct의 평균을 구해라.

ex1) select avg(commission_pct) from employees;

결과) .2125

ex2) select sum(commission_pct)/20 from employees;

결과) .0425


avg함수를 사용했을때 결과가 ex2)의 결과로 나와야하는데

ex1)에서는 sum(commission_pct)/4로 나눈 결과값이다

암시적으로 avg는 null값을 포함하지 않는다.

=> 해결을 위해,

avg(nvl(commission_pct,0));


SQL문 정리

select distinct * column name alias

from table

where

group by

having

order by


6. SubQuery

SubQuery 알려지지 않은 값을 찾고 싶을 사용하라.

Join문장보다 Subquery 실행하자!

From 절의 SubQuery에서는 order by 절이 사용가능하지만,

Where, having 절의 SubQuery에서는 order by 절이 사용불가능

SubQuery 결과가 개냐에 따라 단일/다중 연산자를 판단한다.

SubQuery null 도출될 위험이 있을 때는 사용하지 마라.

SubQuery에서 not in 피하는게 좋다. Not in null값을 찾을 수가 없다. (거의 no rows selected 가능성이 높다.)

쓰고싶다면, Is null 써라.

Ex) select ename

From emp

Where deptno = (select deptno

                     From dept

                     Where dname=’%a%’);

결과 해석 ) 다른 테이블을 서로 비교하더라도 가능하다. Subquery 내용은 결과값을 도출하여 값을 비교하기 때문에 가능.


Ex) select ename

from emp e, dept d

where e.deptno = d.deptno;

경우에는 join 써서 할수 있지만, SubQuery 퍼포먼스상 좋다~


1) ANY
연산자

<ANY : means less than the maximum. : 최대값보다 작은값(최대값 제외)

>ANY : means more than the minimum : 최소값보다 큰값(최소값 제외)

=ANY : IN연산자와 같은 역할


2) ALL
연산자

>ALL : means more than the maximum : 최대값 이상의

<ALL : means less than the minimum : 최소값 이하의

Ex) data => 9000, 6000, 4000

연산자          결과

In연산자 =>         9000,6000,4000

<ANY   =>  6000, 4000

>ANY   =>  9000, 6000

>ALL    => 9000이상의

<ALL    => 4000이하의


7. iSQL*Plus

  * 치환변수 사용

  임시적으로 값을 저장.

문장 실행할 때마다 값이 바뀔 사용한다.

반복작업을 수행할 편리하다.


  &
변수 : 사용자가 원하는 데이터를 사용할 때마다 입력하고 싶은 경우에 치환변수를 사용.

&&변수 : 한번 입력받은 변수값을 다시 적용할 있음

SQL> SELECT id,name,dept_id
2 FROM s_emp
3 WHERE dept_id = &
부서번호 ;
Enter value for
부서번호: 112
old 3: WHERE dept_id = &
부서번호
new 3: WHERE dept_id = 112


Tag DB SQL
  1. 2007/02/11 18:22 [Edit/Del] [Reply]
    열심이시네요 ^^ 옥에 티가 살짝 있어요~ 날짜가;;

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[Oracle] sql Vi 편집기

Posted at 2007/02/06 19:45// Posted in 나만의 작업/DataBase

sql Vi 편집기

L() : list, sql buffer 있는 내용을 불러들일


1(n
행번호) <- 1행에 위치한 행의 내용을 보여준다.


1(n
행번호) c/*/salary <- 1행에 위치한 * salary 바꿈 (c:change)


Del 3(n
행번호) <- 3번째 행이 지워짐


Save buri.sql

Get buri.sql


! :
현재 세션상태 유지한 상태에서 Home 디렉토리로 이동


1(n
행번호) text : 라인전체가 변경(1행을 text 바꿈)

  1. 2007/02/09 19:12 [Edit/Del] [Reply]
    비밀댓글입니다

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret