Conhecendo o




Henrique Gogó - www.gogs.com.br
Henrique Gogó?
#fail


Professor de violão

Músico

Publicitário

Licenciatura em Letras
#win
Fortaleza/Ce

HTML + CSS

Ruby

Front-end developer
(jQuery e tal)

Node.js

CouchDB
Simbó!
Por que CouchDB?
Escalabilidade
Replicação
Master/Master
MVCC (Multiversion concurrency control)
Schema free
HTTP / RESTful
JavaScript
Controle de usuário

    Validação

    CouchApp

      Nuvem
Futon
Quem usa?
Como eles usam?
Nuvem e serviços
Característica de bancos NoSQL




http://www.mongodb.org/display/DOCS/MongoDB,+CouchDB,
                +MySQL+Compare+Grid
Erlang
      Linguagem funcional criada
desenvolvimento de sistema distribuídos.

   Flexível e de fácil escalabilidade e
             extensibilidade.
É ACID!
Em disco, nunca sobrescreve dados.

Leitura e escrita nunca interfere em outros
clientes (MVCC).

B-tree sempre incremental (append only).

Crash-only conception. (Deu pau? Esquece).
How does
                           concurrency work




“    MongoDB uses a read/write



                                                   ”
  lock for many operations.


http://www.mongodb.org/display/DOCS/How+does+concurrency+work
MVCC
          Multiversion concurrency control




“    Database readers are never
locked out and never have to wait



                                        ”
on writers or other readers.


            http://couchdb.apache.org/docs/overview.html
O teorema CAP
Consistency
Todos os clientes do banco de dados devem ver o
mesmos dados, mesmo com atualizações
simultâneas.

Availability
Todos os clientes do banco de dados podem
acessar uma versão dos dados.

Partition tolerance
O banco pode ser dividido em vários servidores.
Se disponibilidade é prioridade, podemos
escrever um node no banco de dados sem
 esperar outros nodes estarem prontos.

 Se o banco souber como conciliar essas
operações entre os nodes, alcançamos a
“consistência eventual” em troca da alta
            disponibilidade.
Replicação
API RESTful
JSON
GET http://localhost:5984/
{"couchdb":"Welcome","version":"1.0.1"}
Criar banco de dados


PUT http://localhost:5984/database

            {"ok":true}
Deletar banco de dados

DELETE http://localhost:5984/database

             {"ok":true}
Criar documento

 PUT http://localhost:5984/database/doc
-d '{"nome":"Henrique","apelido":"Gogó"}'

    {"ok":true,"id":"doc","rev":"1-
446a0c701e94053b4c3baaa5ef3fe68c"}
Criar documento gerando
  o id automaticamente
  POST http://localhost:5984/database/
  -d '{"site":"http://www.gogs.com.br"}'
   -H "Content-Type: application/json"

{"ok":true,"id":"468df12f72c2629fd9319b6
            dfd0009dd","rev":"1-
  0a48dec3e05fc52dae8b2943a4a55864"}
Ver documento

 GET http://localhost:5984/database/doc

         {"_id":"doc","_rev":"1-
446a0c701e94053b4c3baaa5ef3fe68c","no
 me":"Henrique","apelido":"Gogu00f3"}
Atualizar documento
PUT http://localhost:5984/database/doc
-d '{"_rev":"1-446a0c701e94053b4c3baaa5ef3fe68c",
                  "apelido":"Gogs"}'

     {"ok":true,"id":"doc","rev":"2-
191182436ca9a532ec1124aa91b5a8da"}
Deletar documento
                  DELETE
http://localhost:5984/database/doc?rev=2-
  191182436ca9a532ec1124aa91b5a8da

      {"ok":true,"id":"doc","rev":"3-
 4c1033574d7d38e57fe92a1b51fc667d"}
Map
Reduce
Map
function(doc) {
  if (doc.city == "Fortaleza")
  emit(doc.title,
        doc.month+"/"+doc.year);
}
Map
Map
Reduce

function(keys, values) {
  return values;
}
Reduce
Reduce
validate_doc_update
function(newDoc, oldDoc, userCtx) {
 function require(field, message) {
   message = message || "Precisa do campo " + field;
   if (!newDoc[field]) throw({forbidden : message});
 };

    if (newDoc.type == "post") {
      require("title");
    }
}
validate_doc_update

POST http://localhost:5984/database -d
'{"type": "post"}' -H "Content-type:
application/json"

{"error":"forbidden","reason":"Documen
t must have a title"}
_changes
GET http://localhost:5984/database/_changes?
               feed=continuous
Para as linguagens

           CouchRest (Ruby)

     Biblioteca CouchDB (Python)

Cradle (JavaScript server-side – node.js)

jquery.couch.js (JavaScript client-side)
import couchdb

couch = couchdb.Server('http://example.com:5984/')

db = couch['mydb']

doc = {'foo': 'bar'}
db.save(doc)
Perguntas?



             @henriquegogo

             www.gogs.com.br

Conhecendo o CouchDB - TDC2011