SlideShare a Scribd company logo
はじめてのCouchDB
                     黒田英二
  http://blog.kuroda.me/eiji/
                10 May 2012




   1
CouchDBとは

Apache CouchDB
NoSQL
JSONを格納

Erlangで書かれてる

http://couchdb.apache.org/

              2
ところでNoSQL
SQLインターフェイスを持たないDB

スキーマレス

モデルの結合(JOIN)が出来ない

トランザクションがない

水平スケーラビリティー(スケールアウト)しやすい

キーバリュー型

  Cassandra, HBase, DynamoDB
ドキュメント指向

  MongoDB, CouchDB

                      3
CouchDBの特徴




4
主だった特徴

ドキュメント指向型

テーブルの概念が無い

プロトコルにHTTPを使う(CRUD)

最新のバージョンは1.20

クエリはMap/Reduceベース

マルチ・マスタのレプリケーション対応
           5
向いてるもの

辞書、図鑑、レシピ、名簿

テーブルの概念が必要ない

オブジェクト間で親子のような関連性が無い

オブジェクトにタグのようなツリー構造を含む

トランザクションの必要性が低い

更新頻度が低い

          6
不向きなもの

操作履歴、業務系データ、SNSのデータ

テーブルの概念が必要

オブジェクト間の関連が複雑

トランザクションが必要

更新頻度が高い

          7
インストール




8
Mac OSX 10.7+

必要な環境

       Xcode4.3+のCommand Line Tools

       ruby 1.9.3
brewでインストール
# 以前にCouchDBをインストールしてたら
brew remove --force openssl erlang couchdb icu4c spidermonkey nspr
# インストール
brew update
brew install erlang --no-docs
brew install couchdb


                                    9
起動方法
    #初めてインストールしたら
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/Cellar/couchdb/1.2.0/Library/LaunchDaemons/org.apache.couchdb.plist 
      ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist
 
#既にインストールしてたら
    launchctl unload -w ~/Library/LaunchAgents/org.apache.couchdb.plist
    cp /usr/local/Cellar/couchdb/1.2.0/Library/LaunchDaemons/org.apache.couchdb.plist 
      ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist
 
#自動起動は下記
    sudo launchctl list org.apache.couchdb >/dev/null 2>&1 && 
      sudo launchctl unload -w /Library/LaunchDaemons/org.apache.couchdb.plist
    sudo cp /usr/local/Cellar/couchdb/1.2.0/Library/LaunchDaemons/org.apache.couchdb.plist 
      /Library/LaunchDaemons/
    sudo launchctl load -w /Library/LaunchDaemons/org.apache.couchdb.plist
 
#もしくは、下記で
    couchdb



                                                10
Futon+基本API




11
Futon

WebベースのDB
管理ツール

デフォルトでイ
ンストールされ
る

全DB操作可能


              12
APIのURL表記について
太字のURLはAPIの例を記述

Method URL [JSON] で記述

URLの次行にJSONがある場合はレスポンスを示す

PUT /members
   curl -X PUT ‘http://localhost:5984/members’
PUT /members {“name”:”eiji”}
   curl -X PUT -d ‘{“name”:”eiji”}’ ‘http://...’


curlでJSONをPOST/PUTする時は次のオプションが必要

   -H 'Content-type:application/json'

                           13
DBを作る

DB名に使える文字

   アルファベットの小文字

   数字

   _,$,(,),+,-,/
            DB名がmembersの
                   場合


PUT /members

                           14
DBの情報取得

テーブルの概念は無い

ドキュメント(レコード)操
作

デザインの操作(後述)
         DB名がmembersの
               場合




GET /members

                        15
ドキュメントID

ドキュメントを一意(※最新という意味で)に表す

この資料内ではDocIDと表記

自動でDocIDが採番 or 手動で設定する
リビジョン番号
  CouchDBのドキュメントは削除されず追加のみ (※1)

  DocID+リビジョン番号(RevID)で一意

  DocIDのみ取得できるドキュメントは、最新のもの(※2)

                       “id”:”eiji”, “name”:”eiji”, “rev”:”1-123”
  新規追加時のDoc

                      “id”:”eiji”, “name”:”test”, “rev”:”2-abc”
   1回目の更新
                                                                    更新や削除では、
                     “id”:”eiji”, “name”:”kuroda”, “rev”:”3-efg”
                                                                   DocID+RevIDを指定
 2回目の更新=最新


※1 空間最適化のために、DB別に古いリビジョンを物理削除するコマンドがある
※2 コンフリクトが発生してない場合
                                        17
ドキュメント追加
POSTはDocID自動採番

PUTはDocID指定



POST /members {“name”:”Eiji Kuroda”,”age”:40}
{"ok":true,"id":"7544d...", "rev":"1-1e60813a..."}

                          リビジョン番号はも
   DocIDが自動採番
                                 採番
                                                     DocIDを”eiji”に指定


PUT /members/eiji {“name”:”Eiji Kuroda”,”age”:40}
{"ok":true,"id":"eiji","rev":"1-1e60813a..."}


                                                18
一覧取得
futon上はDBの初期画面

DocID,key,valueが返る

valueはリビジョン番号

                                       _all_docsは予約語


GET /members/_all_docs
{"total_rows":2,"offset":0,"rows":[
{"id":"7544...","key":"7544...","value"{"rev":"1-1e60813c6ca45903.."}},
{"id":"eiji","key":"eiji","value":{"rev":"1-96277b971e..."}}
]}

ソート順を逆にしたり、取得件数を指定するオプションあり



                                            19
1件取得

Key値をクリックする

futonでは
フィールド別とJSON形式
の2種類の画面がある
            DocIDが”eiji”のドキュメント取
                        得



GET /members/eiji
{"_id":"eiji","_rev":"3-33c49f...","name":"Eiji Kuroda","age":40}

以前のバージョン(リビジョン)で取得できるオプションあり


                                      20
更新
詳細画面でSourceをクリック

仮に1フィールドだけ更新でも
ドキュメント全体を再設定

リクエストにはリビジョン番号の指定が必須

リビジョン番号が更新される

futonでは1フィールドずつ追加も可能
                                                        リビジョンは必須、無ければ新規とみなされる



PUT /members/eiji {“_rev”:”123ABC”,“name”:”Eiji Kuroda”,”age”:18}
{"_id":"eiji","_rev":"4-33c49f...","name":"Eiji Kuroda","age":18}


                     リ
      ビジョン番号が更新される                                21
削除

詳細画面で削除を選択

リクエストには
リビジョン番号の指定が必須

削除にもリビジョン番号が設定される

                                            リビジョンは必須、無いとエラー



DELETE /members/eiji?rev=123ABC
{"ok":true,"id":"eiji","rev":"5-49c6c.."}          リビジョン番号が付く



                                      22
バルクAPI




23
バルク取得

複数のドキュメントを1回のリクエストで取得

_all_docs に POST で DocIDs を配列で投げる

戻ってくるJSON形式は_all_docsと同じ

POST /members/_all_docs {“keys”:[“eiji”,”hoge”]}
{"total_rows":2,"offset":0,
  "rows":[
    {"id":"eiji","key":"eiji","value":{"rev":"abc123"},
    {"id":"hoge","key":"hoge","value":{"rev":"efg987”}
  ]
}


                                     24
バルク追加、更新、削除
複数のドキュメントの追加、更新、削除を1回のリクエストで可能

更新、削除は各ドキュメントのリビジョン番号を指定

次のようなファイル(data.json)があるとして
                                                  追加
{"docs":[
  {"_id":"hoge", "name":"hoge"},                              更新
  {"_id":"eiji", "_rev":"abc123", "name":"eiji"},
  {"_id":"kuroda", "_rev":"efg987", “_deleted”:true},
]}
                                                              削除
POST /members/_bulk_docs @data.json
[
    {"ok":true,"id":"hoge","rev":"1-c1b7ada1c9b31..."},
    {"ok":true,"id":"eiji","rev":"2-c1b7ada1c9b31..."},
    {"ok":true,"id":"kuroda","rev":"2-a84c9f34a74285a2..."}
]



                                             25
バルクAPI注意点
デフォルトの動きでは、複数ドキュメントを追加した場合に、その中の
1つがエラーになっていても他のドキュメントは正常に保存される

上記ケースで1つも保存したくない場合は、
all_or_nothingオプションを利用する

all_or_nothingオプションはIDのコンフリクトチェックをしない

同じIDで違う内容のドキュメントが登録できる→コンフリクト状態

ただし、ドキュメントの内容が同じ場合はコンフリクト状態にならない




                     26
コンフリクト状態
first.json                                    second.json                               “id”:”abc”は
{"docs":[                                    {"all_or_nothing":true,"docs":[       中身が違うドキュメン
  {"_id":"abc", "name":"abc"},                 {"_id":"abc", "name":"ABC"},                ト
  {"_id":"def", "name":"def"}                  {"_id":"def", "name":"def"}
]}                                           ]}

POST /members/_balk_docs @first.json                                      コンフリクトが発生したが
[ {"ok":true,"id":"abc","rev":"1-123xxx"},
                                                                           レスポンスは全件OK
 {"ok":true,"id":"def","rev":"1-123yyy"}]
                                                                         しかも、全部保存されてる
POST /members/_balk_docs @second.jso
[ {"ok":true,"id":"abc","rev":"1-123zzz"},
  {"ok":true,"id":"def","rev":"1-123yyy"}]                                        conflicts=trueは
                                                     普通に取得可能                   コンフリクトしてるかどうかを
GET /members/abc
{"_id":"abc","_rev":"1-123xxx","name":"abc"}                                   属性に含めて返すオプション

GET /members/abc?conflicts=true
{"_id":"abc","_rev":"1-123xxx","name":"abc","_conflicts":["1-123zzz"]}
GET /members/def?conflicts=true                                                 コンフリクトしてる
{"_id":"def","_rev":"1-123yyy","name":"def"}
                                                         コンフリクトしてない



                                                    27
viewの概念




28
viewとは
クエリを発行したり、レポートを作ったりするのに使う機能

1つのview属性は1つのmapを持ち、オプションで1つのreduceを持てる

いくつかのview属性が1つのデザイン・ドキュメントに格納される

デザイン・ドキュメントも、他のドキュメントと同様の操作ができる

                          デザイン・ドキュメントの名        view属性の名前
実行時のURLは以下のようになる

   “/{dbName}/_design/{デザイン名}/_view/{view名}”

   ”_design/{デザイン名}” でひとつのドキュメントID
デザイン・ドキュメント

    _design/people                                 “people”というデザイン名
                                                 “_design/people”というDocID


“all”:         “map”:”function(doc){..}”
                                                      “all”というview名



“over20”:      “map”:”function(doc){..}”




               “map”:”function(doc){..}”                   実際に表示する際のURL
“total_age”:                                    GET /{dbname}/_design/people/_view/total_age

               “reduce”:”function(keys,.




                                           30
ところでMap&Reduce
大量のデータを分散して処理する仕組
み
                  map         reduce
“バナナ”, 300円    “りんご”, 400円    400円+300円

               “おにぎり”, 150円
“りんご”, 400円
                              150円+700円
“ぶどう”, 700円

“おにぎり”, 150円   “バナナ”, 300円

               “ぶどう”, 700円

                                1550円




                       31
viewを作る




32
Futonで操作

API上は、普通のドキュメントと同じ操作

テストのためにTemporaryビューを使う

Futon上は右上のプルダウンか
ら”temporary_view...”を選択
買い物リストでサンプル作成

 date   category        item   price

 5/10     果物            バナナ    300

 5/10      魚             鯛     1000

 5/11     果物            みかん    400

 5/11     果物            バナナ    250

 5/12      魚             鯛     900

                   34
最も単純なmap

                                                                               emitで指定したkey
map                                                 結果
function(doc){                                         key      id      date   category   item   price
  emit(null, doc)
}                                                      null   123xx    5/10      果物       バナナ    300
                                                       null   234xx    5/10       魚          鯛   1000
                                                       null   345xx    5/11      果物       みかん    400
•mapにドキュメントがパラメータとして来る
                        null                                  456xx    5/11      果物       バナナ    250
•reduceに渡すのはemitメソッド    null                                  567xx    5/12       魚          鯛   900
•検索結果の行数(total_rows)も出力
•結果はJSONで返る                                                   mapしたドキュメントのdocID


{"total_rows":5,"offset":0,"rows":[
{"id":"123xx","key":null,
  "value":{
    "_id":"123xx","_rev":"1-123xx","date":"5/10", "category":"果物","item":"バナナ","price":300
  }
},....
                                                  35
値段の順にソート

map                               結果
function(doc){                        key     id     date   category   item   price
  emit(doc.price, doc);
}                                     250    456xx   5/11     果物       バナナ    250
                                      300    123xx   5/10     果物       バナナ    300
                                      400    345xx   5/11     果物       みかん    400
                                      900    567xx   5/12      魚        鯛     900
                                      1000   234xx   5/10      魚        鯛     1000
•key+idの降順
•逆順にする場合は descending=true

例) GET /items/_design/items/_view/by_price?descending=true




                                 36
果物だけ抽出

map                            結果
function(doc){                     key     id     date   category   item   price
 if(doc.category == ”果物”)
                                   null   123xx   5/10     果物       バナナ    300
    emit(null, doc);
}
                                   null   345xx   5/11     果物       みかん    400

                                   null   456xx   5/11     果物       バナナ    250




                              37
値段を合計する

map                            結果
function(doc){                             key                           value
  emit(null, doc.price);
                                           null                          2850
}

                               {"rows":[
                                 {"key":null, value:2850}
reduce                         ]}

function(keys, values){        keysには次のような値が入る
  return sum(values);
                               [[null, “123xx”], [null, “234xxx”], ..]
}
                               valuesには次のような値が入る
   sumは数値の配列を合計するメソッド          [300, 1000, 400, 250, 900]
    returnで1つの値を返すように作る




                              38
日付毎に値段を合計

map                                     結果
function(doc){                                     key                        value
  emit(doc.date, doc.price);
}                                                 5/10                        300

                                                  5/11                        1650

reduce                                            5/12                        900


function(keys, values){                 次のように3回に分けて reduce が呼ばれる
  return sum(values);
}                                       keys [[“5/10”, “123xxx”]]
                                        values [300]

普通に呼び出すと合計の2850だけが戻る                    keys [[“5/11”, “123xx”], [“5/11”, “234xxx”], ..]
key値毎の塊をグループと言う。                        values [250, 400, 1000]

グループ毎に出力するには、次のように呼び出す。                 keys [[“5/12”, “123xx”]]
                                        values [900]
GET /.../_view/daily_cost?group=true

                                       39
日付+カテゴリ毎に値段を合

map                                             結果
function(doc){                                          key         value
  emit([doc.date, doc.category], doc.price);
                                                    [“5/10”,”果物”]   300
}
                                                    [“5/11”,”果物”]   650
                                                    [“5/11”,”魚”]    1000
reduce                                              [“5/12”,”魚”]    900
function(keys, values){
  return sum(values);
}


グループに深さができる。
1階層目は日付ごと、2階層目は日付+カテゴリ毎

GET /.../_view/dail_cat_cost?group=true #日付+カテゴリ毎
GET /.../_view/dail_cat_cost?group=true&group_level=2 #日付+カテゴリ
毎
GET /.../_view/dail_cat_cost?group=true&group_level=1 #日付毎
                                               40
カテゴリ毎の件数を調べる

map                         結果
function(doc){                         key                        value
  emit(doc.category, 1);
}                                     果物                             3

                                       魚                             2
reduce
function(keys, values){     次のようにreduceが呼ばれる
  return sum(values);
}                           keys [[“果物”, “123xxx”], [“果物”,...]]
                            values [1,1,1]

                            keys [[“魚”, “123xx”], [“魚”, “234xxx”]]
                            values [1,1]




                           41
rereduce




42
reduceの再帰呼び出し
Hadoopではcombine

同一グループの件数が多いとreduceの再帰呼び出しで高速化

function(keys, values, rereduce)

rereduceがfalseの時

   valuesはemitで渡した値の配列

rereduceがtrueの時

   valuesには、計算途中の配列が入る
失敗するcount
    下記の処理でも件数が求まるように思えるが
    実際には想定通り動かない場合がある。
map                                               reduce
function(doc){                                    function(keys, values, rereduce){
  emit(doc.category, 1);                            return values.length;
}                                                 }




                                                  再帰呼び出しの際に
5個のりんごが2個とカウントされてしま
                                                  reduceの戻り値の配列がvaluseに入る
う
keys [[“りんご”]...] values [1,1,1] rereduce false
                                                                         rereduce処理
 values.length -> 3
                                                   keys null values [3,2] rereduce true
keys [[“りんご”]...] values [1,1] rereduce false
 values.length -> 2
                                                     values.length ->   2
成功するcount①

map                                               reduce
function(doc){                                    function(keys, values, rereduce){
  emit(doc.category, 1);                            return sum(values);
}                                                 }




keys [[“りんご”]...] values [1,1,1] rereduce false                          rereduce処理
 sum(values) -> 3
                                                   keys null values [3,2] rereduce true
keys [[“りんご”]...] values [1,1] rereduce false
 sum(values) -> 2
                                                     sum(values) ->    5
成功するcount②

map                                               reduce
function(doc){                                    function(keys, values, rereduce){
  emit(doc.category, 1);                            if(rereduce)
}                                                     return sum(values);
                                                    else
                                                      return values.length;
                                                  }




keys [[“りんご”]...] values [1,1,1] rereduce false                          rereduce処理
 values.length -> 3
                                                   keys null values [3,2] rereduce true
keys [[“りんご”]...] values [1,1] rereduce false
 values.length -> 2
                                                     sum(values) ->    5
viewについて補足
sum,countには組込のメソッド           {“map”:”function(doc){emmit(doc,1)}”
                             “reduce”:”_count”},
がある                          {“map”:”function(doc){emmit(doc,doc.price)}”
                             “reduce”:”_sum”}

デバッグ用にlogメソッドがあ
                             function(keys, values, rereduce){
る。ログファイルに出力される。                log(values);
                               return sum(values);
                             }
Validationが設定できる
Document Update Validation

一括Updateの方法がある
Document Update Handler
レプリケーション




48
レプリケーションの仕様
Target(Slave)のサーバにSource(Master)を設定

データベース単位でレプリケーションを設定

Sourceに流れたPUT,POST,DELETEのクエリがTargetにも流れる

レプリケーションを設定する前のデータは同期しない

コンフリクトが起きてもエラーにはならない

1.10からレプリケーション設定の仕様が変更
マルチマスタも実装可能

http://localhost:5984/some_db/_all_docs


                                  nginxなどをProxyとして使う

                         proxy




          couchdb       couchdb       couchdb


                                           相互にクエリを投げ合う
パフォーマンス




51
速くない...

正直、MySQLの方が速い気がする。

10万件のINSERT

   MySQL 3.7秒

   CouchDB 30秒

SELECT系もMySQLの勝利だった

今度 mongo dbのベンチマークするので詳細はそこで。
おしまい




53

More Related Content

What's hot

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
豊明 尾古
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
Yuki Morishita
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
Kentaro Yoshida
 
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
 
Hadoopの概念と基本的知識
Hadoopの概念と基本的知識Hadoopの概念と基本的知識
Hadoopの概念と基本的知識
Ken SASAKI
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイド
Takahiro Itagaki
 
CloudFront経由でのCORS利用
CloudFront経由でのCORS利用CloudFront経由でのCORS利用
CloudFront経由でのCORS利用
Yuta Imai
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSSYahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo!デベロッパーネットワーク
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
NTT DATA OSS Professional Services
 
Apache NiFi の紹介 #streamctjp
Apache NiFi の紹介  #streamctjpApache NiFi の紹介  #streamctjp
Apache NiFi の紹介 #streamctjp
Yahoo!デベロッパーネットワーク
 
V$SQLとその周辺でER図を描いてみよう!
V$SQLとその周辺でER図を描いてみよう!V$SQLとその周辺でER図を描いてみよう!
V$SQLとその周辺でER図を描いてみよう!
歩 柴田
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 

What's hot (20)

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
Hadoopの概念と基本的知識
Hadoopの概念と基本的知識Hadoopの概念と基本的知識
Hadoopの概念と基本的知識
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイド
 
CloudFront経由でのCORS利用
CloudFront経由でのCORS利用CloudFront経由でのCORS利用
CloudFront経由でのCORS利用
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSSYahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
Apache NiFi の紹介 #streamctjp
Apache NiFi の紹介  #streamctjpApache NiFi の紹介  #streamctjp
Apache NiFi の紹介 #streamctjp
 
V$SQLとその周辺でER図を描いてみよう!
V$SQLとその周辺でER図を描いてみよう!V$SQLとその周辺でER図を描いてみよう!
V$SQLとその周辺でER図を描いてみよう!
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 

Viewers also liked

CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__
Tatsuro Hisamori
 
プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~
Eiji Kuroda
 
JS開発環境を晒す。
JS開発環境を晒す。JS開発環境を晒す。
JS開発環境を晒す。
Eiji Kuroda
 
HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。
Eiji Kuroda
 
新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜
Eiji Kuroda
 
Html5j 8
Html5j 8Html5j 8
Hotサービスの傾向
Hotサービスの傾向Hotサービスの傾向
Hotサービスの傾向
Eiji Kuroda
 
いまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐいまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐ
Eiji Kuroda
 
SmartPhone と AdTechの世界
SmartPhone と AdTechの世界SmartPhone と AdTechの世界
SmartPhone と AdTechの世界
Eiji Kuroda
 
YAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきましたYAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきましたTatsuro Hisamori
 
YAPCEurope2014-myfinder
YAPCEurope2014-myfinderYAPCEurope2014-myfinder
YAPCEurope2014-myfinder
Tatsuro Hisamori
 
DynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみたDynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみた
伊藤 祐策
 
今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ
Tatsuro Hisamori
 
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用Tatsuro Hisamori
 
アドテク勉強会0819
アドテク勉強会0819アドテク勉強会0819
アドテク勉強会0819
Hideya Kato
 
AdServerの仕組み
AdServerの仕組みAdServerの仕組み
AdServerの仕組みEiji Kuroda
 
CGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレス
Tatsuro Hisamori
 

Viewers also liked (20)

CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
20120409 aws meister-reloaded-dynamo-db
20120409 aws meister-reloaded-dynamo-db20120409 aws meister-reloaded-dynamo-db
20120409 aws meister-reloaded-dynamo-db
 
My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__
 
プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~
 
JS開発環境を晒す。
JS開発環境を晒す。JS開発環境を晒す。
JS開発環境を晒す。
 
HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。
 
新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜
 
Riakmeetup2forupload
Riakmeetup2foruploadRiakmeetup2forupload
Riakmeetup2forupload
 
Html5j 8
Html5j 8Html5j 8
Html5j 8
 
Hotサービスの傾向
Hotサービスの傾向Hotサービスの傾向
Hotサービスの傾向
 
いまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐいまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐ
 
SmartPhone と AdTechの世界
SmartPhone と AdTechの世界SmartPhone と AdTechの世界
SmartPhone と AdTechの世界
 
YAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきましたYAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきました
 
YAPCEurope2014-myfinder
YAPCEurope2014-myfinderYAPCEurope2014-myfinder
YAPCEurope2014-myfinder
 
DynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみたDynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみた
 
今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ
 
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
 
アドテク勉強会0819
アドテク勉強会0819アドテク勉強会0819
アドテク勉強会0819
 
AdServerの仕組み
AdServerの仕組みAdServerの仕組み
AdServerの仕組み
 
CGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレス
 

Similar to はじめてのCouch db

Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
MongoDB2.2の新機能
MongoDB2.2の新機能MongoDB2.2の新機能
MongoDB2.2の新機能
Shoken Fujisaki
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
Kiyoshi Sawada
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenote
kitsugi
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
Keiji Kamebuchi
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
junichi anno
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
Toru Yamaguchi
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
泰 増田
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
Kuninobu SaSaki
 
オンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてオンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用について
YASUKAZU NAGATOMI
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
Yohei Sasaki
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
Sho A
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
dcubeio
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Michio Koyama
 
Teclab3
Teclab3Teclab3
初めての Data api
初めての Data api初めての Data api
初めての Data api
Yuji Takayama
 

Similar to はじめてのCouch db (20)

Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
MongoDB2.2の新機能
MongoDB2.2の新機能MongoDB2.2の新機能
MongoDB2.2の新機能
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
d3sparql.js
d3sparql.js d3sparql.js
d3sparql.js
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenote
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
オンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてオンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用について
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
 
Teclab3
Teclab3Teclab3
Teclab3
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 

はじめてのCouch db

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n