3. Key Features
• Completely dynamic schema
• Key-value store in JSON format with B-
Tree indexing
• Append-only (all or nothing)
• Concurrent reads and writes
• Very reliable (Erlang)
viernes 5 de noviembre de 2010
5. Database interaction
• Data is stored and returned in JSON
format
• Queried via HTTP RESTful API
• Index building language: Javascript
viernes 5 de noviembre de 2010
6. Database interaction
• Data is stored and returned in JSON
format
• Queried via HTTP RESTful API
• Index building language: Javascript
“Django may be built for theWeb, but CouchDB is built of the Web. I’ve never
seen software that so completely embraces the philosophies behind HTTP.“
Creator of Django
viernes 5 de noviembre de 2010
7. When should I use
CouchDB?
• Concurrent Distributed systems
• Systems where data consistency is
important
• Offline by default
viernes 5 de noviembre de 2010
14. JSON data storage
{
"_id": "debd7e7385464f4874dd2a38043f7825",
"_rev": "3-839e43865b653a1ed73c3d21cc17c5dd",
"name": "Homer",
"last_names": ["Simpson", "Duff"],
"phone_numbers": {
"mobile": "555-666-777",
"work": "666-777-555"
},
"interests": ["beer", "donuts", "couches"]
}
viernes 5 de noviembre de 2010
15. HTTP RESTful API
$ curl http://localhost:5984/ypages
HTTP/1.1 404 Object Not Found
{"error":"not_found","reason":"no_db_file"}
viernes 5 de noviembre de 2010
16. Creating the Database
$ curl -X PUT http://localhost:5984/ypages
HTTP/1.1 201 Created
{"ok":true}
viernes 5 de noviembre de 2010
17. Creating a Document
$curl -v -X PUT http://localhost:5984/ypages/homer -d
'{"name": "Homer",
"last_names": ["Simpson", "Duff"],
"phone_numbers": { "mobile": "555-666-777",
"work": "666-777-555"},
"interests": ["beer", "donuts", "couches"]}'
HTTP/1.1 201 Created
Etag: "1-4a9c28dc2e4227cac13872c89a7875d8"
{"ok":true,"id":"homer","rev":"1-4a9c..."}
viernes 5 de noviembre de 2010
18. Getting a Document
$ curl -X GET http://localhost:5984/ypages/homer
HTTP/1.1 200 OK
Etag: "1-4a9c28dc2e4227cac13872c89a7875d8"
{"_id":"homer","_rev":"1-4a9c...","name":"Homer"...}
viernes 5 de noviembre de 2010
19. Updating a Document
$ curl -v -X PUT http://localhost:5984/ypages/homer -d
'{"_rev": "1-4a9c...",
"name": "Marge",
...}'
HTTP/1.1 201 Created
Etag: "2-ca3a39967947f974ac021d9f1bdafd1a"
{"ok":true,"id":"homer","rev":"2-ca3a39..."}
viernes 5 de noviembre de 2010
20. Querying the database
• Views: the way to arrange data to answer
our questions
• Method to build views:
Incremental MapReduce using Javascript
viernes 5 de noviembre de 2010
22. Find by name
$ curl '/ypages/_design/app/_view/by_name'
{"total_rows":4,"offset":0,
"rows":[
{"key":"Bart","value":null},
{"key":"Homer","value":null},
{"key":"Lisa","value":null},
{"key":"Marge","value":null}
]}
viernes 5 de noviembre de 2010
23. Find by name
$curl '.../by_name?key="Homer"&include_docs=true'
{"total_rows":4,"offset":2,
"rows":[
{"id":"homer",
"key":"Homer",
"value":1,
"doc": {"_id":"debd", "_rev":"3-839", "name":"Homer",
"last_names":["Simpson","Duff"],
"phone_numbers":{"mobile":"555-666-777",
"work":"666-777-555"},
"interests":["beer","donuts","couches"]
}
}
]
}
viernes 5 de noviembre de 2010
24. Find by phone type
Map:
function (doc) {
var type;
if (doc.name && doc.phone_numbers) {
for (type in doc.phone_numbers) {
emit(type, 1);
}
}
}
viernes 5 de noviembre de 2010
25. Count by phone type
Reduce:
function (keys, values, rereduce) {
return sum(values);
}
viernes 5 de noviembre de 2010
26. Count by phone type
$ curl '/ypages/_design/app/_view/by_phone'
{"rows":[{"key":null,"value":9}]}
(reduced by default)
viernes 5 de noviembre de 2010
27. Find by phone type
$ curl '.../by_phone?group=true'
{"rows":[
{"key":"home","value":1},
{"key":"mobile","value":4},
{"key":"work","value":4}
]}
viernes 5 de noviembre de 2010
28. Find by phone type
$ curl '.../by_type?key="work"&reduce=false'
{"total_rows":9,"offset":5,"rows":[
{"key":"work","value":1,"id":"..."},
{"key":"work","value":1,"id":"..."},
{"key":"work","value":1,"id":"..."},
{"key":"work","value":1,"id":"..."}
]}
viernes 5 de noviembre de 2010
29. Many more options
• startkey, endkey, order, limit...
• View’s keys can be anything you like.
Ej. birthdate:
{"total_rows":4,"offset":0,
"rows":[
{"key":[2000, 10, 10], "value":"Bart"},
{"key":[1998, 07, 13], "value":"Lisa"},
{"key":[1950, 05, 10], "value":"Homer"},
{"key":[1950, 02, 12], "value":"Marge"}
]}
viernes 5 de noviembre de 2010
31. CouchRest
• A RESTful CouchDB client based on
Heroku's RestClient and Couch.js
• http://github.com/couchrest/couchrest
viernes 5 de noviembre de 2010
40. Where?
• Ubuntu CouchDesktop (Ubuntu 9.10)
• BBC: fault tolerant, scalable, multi-data
center key-value store.
• 32 nodes in two datacenters.
• A terabyte of data/day
• ~ 5 billion of reqs/year. 150 million reqs/day
viernes 5 de noviembre de 2010
41. Our use case
Tracking the activity on a website during a
live-broadcasted twitter-interview.
viernes 5 de noviembre de 2010
42. Video streaming server logs
(Flash media server)
{
"_id": "ffb297816c756289188ca61dc66d61c7",
"_rev": "1-b78bc6ddfbb1f27259c333694d16ba6a",
"type": "streaming",
"datetime": "2010-03-26 18:15:56",
"x-event": "pause",
"c-client-id": "872845283",
...
}
http://www.irekia.euskadi.net
viernes 5 de noviembre de 2010
43. Web server logs (Apache)
{
"_id": "fde06b5ecd70736e0deb6a22effff25a",
"_rev": "1-f496524ccba837b529426e0ad2177524",
"type": "web",
"datetime": "2010-10-29 08:32:01",
"path": "es/web_tv/agentes-sociales-economicos-suscriben-pacto-social-vivienda",
"user-agent": "Mozilla/4.0 ...",
...
}
viernes 5 de noviembre de 2010
44. Questions made by citizens via Twitter
{
"_id": "219d1d871ad0b9a31b5f10302c8ac03e",
"_rev": "1-a4466ffd843164f0f538532aca7d10c6",
"datetime": "2010-10-26 18:24:37",
"text": "#patxilopez Yo queria preguntar sobre un tema de
actualidad q se esta hablando mucho en la calle: Cuando
tendremos Bob Esponja en Euskera?",
"type": "tweet"
...
}
viernes 5 de noviembre de 2010
46. I want more!
• Get it! http://couchdb.apache.org/
• The Definitive Guide:
http://guide.couchdb.org/
• Case studies:
http://www.couchone.com/case-studies
viernes 5 de noviembre de 2010