아직은 제가 원하는 수준은 아니지만, 일단 우측이라도 like 검색이 되는 것을 확인하니, 무료로 사용할 수 있는 범위가 얼마나 될까 하는 생각이 갑자기 들었습니다.

Cloudant 가격 정책

클라우드 DB 시장에서 IBM은 분명히 후발주자가 맞습니다. 그래도 자원봉사가 아닌 이상 무료로 50GB를 무조건 주겠습니까? 절대 아닙니다. "제한없이" 이용이 가능하다는 문구가 제 논리센서?를 혼란 시켜 여기까지 왔지만, 더이상 속을 수는 없습니다~!!!

[링크] IBM Cloudant 50GB 무료사용 페이지 

일단 사용량을 확인합니다. 어? $0.09 사용이 눈에 들어옵니다. 머지? 이제 사용방법 확인 중인데 무슨 금액이지?? 무료는 무슨 말?? ㅎㅎ For period ending Apr 30 하단에 Learn about Cloudant pricing 링크를 즉시 클릭해 봅니다. 이러다 또 털리나 싶어서... [링크] Cloudant 과금 정책

위 이미지로 보면 23회의 heavy requests 가 있었는데.. 이러면 $0.015 인거 같은데 왜 $0.09 일까요? 무려 6배를 뻥친 이유가 멀까요? 증말 궁금합니다. =_=;;

일단 링크로 들어간 과금 정책 페이지를 보고 요약한 내용은 일단 1개월은 무료이고, 30일이 지나면 혹시 모르니 신용카드를 등록해서 과금 결제가 될 수 있도록 해 주시고~~ (이런 말은 아니긴 합니다. ^^) 과금은 아래와 같이 하겠다네요.

UsageCost

Quota 

Data volume 
in GBs / month
$1.00 per GB / month

이론상 API를 사용하지 않으면 50GB가 무료 맞네.
아무것도 하지 않으면... =_=;;

"Heavy" API requests * 
PUTs, POSTs, DELETEs
$0.015 per 100

 GET이 있으니 POST는 등록만 사용하도록

"Light" API requests * 
GETs, HEADs
$0.015 per 500

$1 = 33333 (약 3만번 호출시)
$10 = 33만번 정도

  • No charge if your monthly usage is under $50.00 USD

[링크] Cloudant 가격 정책 함고

POST는 대체로 등록에 사용하고, GET은 조회를 위해 사용을 합니다. $1 당 3만번의 테스트가 가능하니 그리 나쁘진 않아 보이는데, 저 API 사용료가 누적인지는 궁금합니다. 1개월 단위로 리셋이 된다면 얼마나 좋을 까요.. O_O;;

다음 번에는 nodejs에서 데이터를 등록하는 방법과 실제 서비스를 위해서 정교한 테이블 설계를 해볼 생각입니다. 그 와중에 좌측 like 검색이 가능할 수 있는 지도 찾아봐야 겠습니다.

신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

받은 트랙백이 없고 , 댓글이 없습니다.
secret


오늘은 Cloudant의 핵심인, 그리고 제가 그토록 알고 싶은 like 검색 방법에 대한 고민을 해 보려고 합니다. 그리고 만족 스럽진 않지만 반쪽짜리 검색을 찾았습니다.

일단 복사한 animaldb의 구성을 잠시 살펴 보도록 하겠습니다. 오해의 소지가 발생할 수도 있을 것 같고, 저의 무식함이 드러나겠지만, 그래도 이해하는 선에서 열심히 떠들어 보겠습니다.

animaldb 구성

animaldb





















All Documents : 데이터인 도큐먼트 외에도 Indexes, Views 등 사용자가 등록한 모든 정보를 보여 주는 것으로 보입니다.

Query : 쿼리 실행을 테스트할 수 있는 페이지입니다. 처음 기웃거릴때는 저녀석을 활용하려고 무척 노력을 했는데... 결과적으로 이제 저에게는 별로 의미 없는 페이지였습니다.

Permissions :  API 접근 사용자 권한을 설정하는 페이지입니다. 현재 어드민 계정과 "Everybody Else" 두 계정에 대한 권한 설정이 나옵니다. 어차피 제 계정으로 앱을 설정할 거니, 디폴트 유지~!

Changes : 수정된 로그를 남기는 것 같은데... 무지하지만 시간상 해당 내용에 아직 확인할 기회는 없었습니다.

Design Documents : 오늘 확인할 녀석입니다. 기존 자료에는 Secondary Index와 Search Indexes 얘기를 하는데, 중간에 Views 가 하나 더 있습니다. 이녀석들을 어떻게 이해하는 것이 관건으로 보입니다. 다만 제가 짧은 시간 이래 저리 부딪히면서 유추하게된? 내용을 정리해 보겠습니다.

Secondary Index와 Search Indexes

문서 상의 내용은, 검색을 강화하기 위해서 추가해야할 필수적인 요소라고 합니다. 제가 이해한 RDBMS와 비슷한 것은 말 그대로 index 입니다. 테이블 필드를 조합하고 해당 필드에 대한 정렬 조건 등을 설정한 후에 정보 목록 확인이 가능합니다.

Secondary Index는 이런 index의 모음이고 Views라고 되어 있는 것은 index 들을 의미하는 것으로 보입니다. 그래도 조금 다른 것은 Map/Reduce 옵션에 따라 데이터 카운트 등의 통계용도 Views에 추가할 수 있습니다.

Search Indexes는 단어처럼 검색을 위한 index 입니다. 검색 필드를 지정해서 해당 필드만을 검색하여 결과를 뿌려주도록 하는 것 같습니다. 여기에서 like 검색을 하고 싶었습니다. 검색, 검색, 검색.. ^^ 검색이 되어야 서비스를 할 수 있으니...

검색을 위해서는 Search Indexes를 알아야 합니다. index function 내용을 전체 알 필요는 없지만, 꼭 알아야 할 것들만 잠시 설명을, 저도 잘은 모르지만, 해 보겠습니다.

function (doc) {
  index("default", doc.id);  

  if (doc.latin_name) {
    index("latin_name", doc.latin_name, { "store": true });
  }
}

위 내용은 도큐먼트(테이블)의 검색 필드를 지정하는 것으로 doc.id, doc.latin_name을 검색어로 사용한다는 것입니다. 그런데 아직 확인하지 못한 것이 index("latin_name" << "latin_name"의 용도입니다. api에서 제공되는 검색 변수명은 q 하나 밖에 안보입니다.

?q= 검색은 가능하지만 ?latin_name= 검색은 오류가 납니다. 아직은 이 이상은 모르겠네요. =_=;;; 그래서 저는 저 "latin_name" 대신에 "default"로 바꾸었습니다. 이렇게 하면 q 파람 정보를 대입해 주는 것으로 보입니다.

그리고 like 검색은 "검색어*" 이렇게 검색어 뒤에 *를 추가하면 됩니다. 하지만 이것도 오른쪽만 가능하지 왼쪽에 붙이면 오류가 납니다. 제가 원하는 내용은 아닙니다만 일단 아쉬운 데로... =_=;; 테스트 사용 방법은 아래와 같습니다. search indexes의 animals를 선택하면 쿼리 실행 창이 나옵니다.

Search Indexes test

검색이 정상적으로 되었다면 해당 내용을 외부에서 테스트하기 위해서 API를 복사합니다.

Copy API URL

해당 내용을 저는 Postman 이라는 크롬 확장 프로그램에서 테스트를 했습니다. Method = GET, Authorization = Basic (아이디 비번 추가) 후 Send를 하시면 아래와 같이 나옵니다.

Postman test

누군가 검색어 왼쪽에 *를 붙일 수 있는 방법을 알려 주신다면 너무 너무 감사하겠습니다. ^^;;

다음은 50GB가 정말 무료인지, 서비스를 하려는 입장에서 다시 한번 과금 정책을 확인하고 지나가야할 것으로 보입니다. 실망스러울 것으로 보이긴 하지만.. 그래도 확인은 해봐야죠~~ ^^;; 잘못하면 털립니다. 서비스가 좋다면 모를까...

신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

받은 트랙백이 없고 , 댓글이 없습니다.
secret

일단 이전 포스팅을 보셨다면 Cloudant 계정은 하나쯤은 가지고 있을 것으로 보입니다. 것도 무려 50기가 정도나~~~!!!

무식하면 용감하다고, Cloudant를 무슨 RDBMS 정도로만 알고, 결국은 나의 무지로, 시작된 이 프로젝트가 얼마나 성공을 거둘지는 일단 미지수 입니다.

일단 다시 링크 하나 공유 합니다. 한국 클라우던트 유저그룹이 있었네요.  [링크] 클라우던트 한국 유저 그룹

Cloudant 사이트를 자주 들어가야 하는데 용어들이 기존 RDBMS와 헤깔리니 잠깐 확인하고 가겠습니다. NoSQL 관련 구조를 원래 잘 생각하지 않고 썼던 문외한인지라, RDBMS에 익숙한 무식한 개발자인 저를 포함해서, 용어정리가 도움이 되었으면 합니다.

관계형 데이터베이스Cloudant(CouchDB)비고 

Database

계정

기존 RDBMS 와 비슷하게 하고 싶어서 그냥 넣어 봤습니다.
DB를 추가하고 싶다면?? 네 계정을 추가 생성하시면 됩니다!!

TableDatabase

저장 공간 구분 단위, 테이블의 개념

Recode or RowDocument

기본 자료 단위

ColumnAttribute

key = value  형태 값 

용어가 무척 혼선이 되겠지만 Nosql Cloudant 입장에서 용어를 선별해서 사용 하도록 하겠습니다. ^^

데이터 베이스 생성 방법

데이터베이스 생성은 생각보다 쉽습니다. 로그인 후 첫페이지가 Databases 입니다.

Cloudant Dashboard

해당 페이지 우측 상단 Database name 영역에 데이터베이스 이름을 넣고 생성하시면 됩니다.

Create Database

^ 여기에 데이터베이스 이름을 적고 Create!!

샘플 데이터베이스 가져오기

데이터베이스를 생성하고 데이터 등록하고 하는 일련의 작업을 하면서 정리하려면 시간이 좀 걸릴 것으로 보여서 Cloudant에서 제공하는 샘플 데이터베이스를 기준으로 정리해보겠습니다.

[링크] 샘플 데이터 베이스 페이지

Replicate the sample database

로그인 전이라면 "Replicate..." 버튼 대신에 로그인 창이 나올 겁니다. 로그인 후에는 "Replicate... " 버튼이 보일 겁니다.

버튼을 클릭하면 잠시 프로그레스바가 나오고, "Success. You're all set ..." 메시지가 나옵니다. 이제 복사는 일단 완료~!!

데이터베이스 구성 확인

복사된 데이터베이스를 확인해 보겠습니다.

우선 로그인 후 첫페이지인 Databases 메뉴에서 맨 하단 animaldb가 보일 거고, 해당 데이터베이스를 클릭하면 아래와 같이 나타날 겁니다.

All Documents는 전체 데이터인데, id "_design/views101"이라는 것도 보입니다. 즉 document는 아무래도 실제 데이터(Record 혹은 Row)만 의미하는 것이 아니고 query, index, view 등 데이터 외의 모든 내용도 포함이 되는 건 아닌가 싶습니다. (역시 무식함.. ㅠ,.ㅠ)

Sample animaldb

Design Documents를 클릭하면 views101이라는 "view"가 보입니다. 이녀석이 중요한 녀석으로 보이는데, 다음엔 이녀석을 분석해보도록 하겠습니다.




신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

받은 트랙백이 없고 , 댓글이 없습니다.
secret


IBM Cloudant DB? [링크]

솔직히 잘 모릅니다. 그냥 50기가 무료로 준다는 Nosql 디비라는 거... Json 기반이고, API로 제공이 가능하다는 거... 머 그렇기 때문에 이런 프로젝트를 시작하는 거니까요.

고수님들이 편하고 좋다.. 라고 말하는데.. 빅데이터를 다뤄본 적이 없기 때문에, 통계용으로 쓴다는 말이 와 닿지는 않는다. 그래도 50기가 라니... 하는 생각에 이리 저리 파보기 시작했습니다. 시간도 없는 마당에 이런 잉여짓을 내가 해보네요~

솔직히 처음에는 그냥 DB라는 개념으로 접근을 했습니다. 와 IBM이 약먹었나 디비를 공짜로? 그것도 50기가나 공짜로??? 혹~ 하며 접근을 했는데, Nosql이라고 하니 Redis 정도로만 생각을 했는데... 머 이렇게 안되는 것이 많아? 쓰뤠기네~~ 하며 이리 저리 뒤져 보니 빅데이터용이고, 통계용으로 적합하다는 얘기... 머 그런 얘기들이 즐비하면서... 역시 고수들이 많아~~ 하는... 제길... 머, 그렇다 치고...

50기가가 아깝다는 생각에 이리 저리 머리를 굴려보기 시작을 했습니다. 진짜 디비로 쓸 수는 없을까? 진짜? 진짜??? =_=;;

일단 50기가를 신청하고 열심히 DB 디자인을 해보기로 했습니다.

[링크] 무료 계정 등록 방법 (유튜브)

짧게는 며칠, 길어도 한달 이내에 정리를 해보고 안되면 나와야지.. 하는 심정으로... ^^

그 헤딩하는 내용을 여기에 남겨보도록 할 것입니다. 잘 되면 좋겠다는 심정으로... =_=;;
위에 적은 내용을 보면 알겠지만, 개념에 대한 설명은 저도 모르니 할 수가 없어서 못하겠습니다. 그냥 필드에서 구르는 데로 얻어지는 지식을 공유하도록 노력을 하겠습니다. 나의 무식함을 욕하지는 말아줬으면 좋겠네요. ㅠ,.ㅠ;;

혹시 아이디어가 있다면 많은 도움 답글을 요청드리겠습니다~ ^^;;

신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

받은 트랙백이 없고 , 댓글이 없습니다.
secret

하둡에 대한 이야기가 조금씩 수그러 드는 경향도 있지만, 뒤늦게 라도 기술적인 부분 이해를 위해서 하나 들춰보는 재미를 가지려고 합니다. ^^

http://www.slideshare.net/madvirus/ss-28761748

귀한 자료 제공에 감사드립니다.

읽은 후에 되도록 아래에 평을 남기겠습니다. ^^;;

신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

받은 트랙백이 없고 , 댓글이 없습니다.
secret
테이블 작업을 하다 보면,
여러 테이블의 데이터를 조인해서 가져오도록 설계를 많이 합니다.

그러다 보면 데이터가 기본 1:1 혹은 1:N개로 존재를 해야 하는데,
그렇지 않을 경우 즉, 1:0으로 된 데이터를 가져와야 할 경우도 있습니다.

보통의 테이블 조인을 INNER JOIN이라 말을 하고,
저런 데이터가 없는 경우에도 가져와야 하는 JOIN을 OUTER JOIN 이라고 합니다.

아래와 같은 테이블이 있습니다.

select * from table1;

field1         field2       field3

200901  1   40

200901  2   40

200901  3   40

200901  4   40

200901  5   40

200901  6   40

200901  7   40

200901  8   40

 

select * from table2;

field1         field2       field3

200901  1   50

200901  2   60

200901  3   70

200901  4   80


INNER JION의 경우, 평소에 하던 대로 하면 됩니다.
SELECT a.*, b.*
FROM table1 a, table2 b
WHERE a.field1 = a.field1
  AND a.field2 = b.field2
굳이 다른 방식으로 이해하려 하지 않아도 됩니다.

위 테이블 두개를 묶어서 관련된 데이터 b.field3값도 확인하고 싶습니다. 이때, 없는 레코드의 경우도 보여주고 싶을 때는 OUTER JOIN을 사용하게 됩니다.

OUTER JOIN의 경우는 좀 복잡합니다. 물론 INNER JOIN 의 정확한 것을 배워도 되지만,
일단 FM은 아래와 같습니다.
SELECT a.*, b.field3
FROM table1 a OUTER JOIN table2 b ON a.field2 = b.field2
WHERE a.field1 = '200901'
JOIN 부분은 없어도 NULL 값으로 연결을 해주고,
WHERE 이하 구문은 INNER JOIN 형태로 연결을 해줍니다.

현재도 *= 문법을 지원을 하고 있으나,
몇가지 버그 등의 문제로 추천하는 문법은 아닙니다.
신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

트랙백  18 , 댓글  4개가 달렸습니다.
  1. 둘은 너무나도 사랑해서 서로 섞이고 싶어했지만 서로 섞이고 싶어 할수록 둘은 멀어질 수밖에 없었습니다.
  2. 삶의 목표는 너무 많은 아니라, 계속 한 것은, 투자 관심과 열정을 찾아, 당신은 성공합니다.
  3. http://www,Topics related articles:


    http://www.haewon.name/55 复件 (19) 韩

    .lisseurghdle.com/ http://www,Topics related articles:


    http://peterhan.kr/category/?page=45 复件 (16) 韩

    .hairstraightenerls,Topics related articles:


    http://enerhythm.com/108 复件 (16) 韩

    .com/
  4. 당신은 내가사랑할 만한 사람이 아니예요,사랑하지 않으면 안될 사람이예요.
secret
짬짬히 이런 저런 작업을 하면서 글을 쓰기 때문에,
실제 사용하는 것만 올립니다. 덕분에 글이 짧네요.

MSSQL에서 날짜 연산 방법입니다.

예. 어제 일자를 알고 싶다.
select getdate(), dateadd(d, -1, getdate())
쉽죠? ^^;;

연산 날짜 부분(datepart) 인지는 몇개 없습니다.

yy : 년
mm : 월
dy, y : dayofyear (먼지 잘 모르겠음)
d : 일
wk : 주
hh : 시
mi, n : 분
s : 초
ms : 밀리세컨드
신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

트랙백  49 , 댓글이 없습니다.
secret
현재 실행중인 DB 프로세스 확인 방법은?

postgres=# select * from pg_stat_activity;

현재 실행중인 쿼리, 접속 후 대기 중인(IDLE) IP 등이 출력됩니다.

-------+----------+---------+----------+----------+---------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+-----------------+-------------
datid | datname  | procpid | usesysid | usename  |          current_query          | waiting |          xact_start           |          query_start          |         backend_start         |   client_addr   | client_port
-------+----------+---------+----------+----------+---------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+-----------------+-------------
16386 | shop     |    7933 |    16384 | shopcafe | <IDLE>                          | f       |                               | 2009-01-13 16:58:25.424858+09 | 2009-01-13 16:58:25.354049+09 | 118.219.233.56  |       39856
16386 | shop     |    7811 |    16384 | shopcafe |
    SELECT * from members where id='test'
                                   | f       | 2009-01-13 16:58:25.874498+09 | 2009-01-13 16:58:25.874498+09 | 2009-01-13


신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

트랙백  51 , 댓글이 없습니다.
secret
DB 작업을 하다 보면 때로,
서로 다른 데이터가 있는 테이블에서 합쳐서 보여줘야 하는 경우가 간혹 생깁니다.
INNER JOIN 이나 OUTER JOIN 등으로 할 수 없는 상황입니다.

이런 경우 필요한 것이 바로 UNION 입니다.

UNION은 MySQL에서도 지원하는 것으로 알고 있습니다.

UNION에서 주의할 점은 두 테이블을 하나로 합치는 것이기 때문에
추출하는 테이블의 필드 이름, 타입, 그리고 필드 갯수가 일치해야 합니다.
select f1, f2, f3, f4, "1" as f5
from table1
where f1='aaa'
UNION
select a as f1, b as f2, c as f3, d as f4, "2" as f5
from table2
where a='bbb'
테이블명은 alias를 해서 맞춰 주면 되고, 형변환은... 알아서.. ^^;;

팁으로, 해당 데이터가 어느 테이블에서 왔는지 알고 싶은데,
데이터 값만으로는 구분하기 힘든 경우에는
"1", "2" 이런 식이나 기타 구분이 가능한 방식으로 고정값을 추가해서
그것으로 확인하면 됩니다.

다른 모든 조건은 기존 SELECT 문법을 따르고 있으니,
그것을 참조하시면 됩니다.
신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

트랙백  38 , 댓글이 없습니다.
secret
MySQL 처럼 show databases;가 PostgreSQL에는 없을까?

있다!

pgsql> select datname from pg_datebase;

이렇게 하면 등록된 모든 DB목록이 나온다.

신고

WRITTEN BY
비트센스
뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

트랙백  55 , 댓글 하나 달렸습니다.
  1. 스펠링 틀렸다
    pg_datebase 가 아니고 pg_database 이다
secret