meet couch db
TRANSCRIPT
Relational DatabasesDocumental Databases
Schema-free Document Oriented Database
viernes 5 de noviembre de 2010
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
Replication
• Bidirectional replication with built in conflict resolution
• Offline by default
• Incremental replication
viernes 5 de noviembre de 2010
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
Database interaction
• Data is stored and returned in JSON format
• Queried via HTTP RESTful API
• Index building language: Javascript“Django may be built for the Web, 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
When should I use CouchDB?
• Concurrent Distributed systems
• Systems where data consistency is important
• Offline by default
viernes 5 de noviembre de 2010
JSON data storage
{ "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
JSON data storage
{ "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
JSON data storage
{ "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
Schema-less
{ "_id": "debd7e7385464f4874dd2a38043f7825", "_rev": "3-839e43865b653a1ed73c3d21cc17c5dd", "name": "Homer", "last_names": ["Simpson", "Duff"], "phone_numbers": { "mobile": "555-666-777", "work": "666-777-555", "bar": "777-666-555" }, "interests": ["beer", "donuts", "couches"]}
viernes 5 de noviembre de 2010
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
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
Creating the Database
$ curl -X PUT http://localhost:5984/ypages
HTTP/1.1 201 Created
{"ok":true}
viernes 5 de noviembre de 2010
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
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
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
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
Find by name
function(doc) { if (doc.name) { emit(doc.name, null); }}
viernes 5 de noviembre de 2010
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
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
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
Count by phone type
Reduce:
function (keys, values, rereduce) { return sum(values);}
viernes 5 de noviembre de 2010
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
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
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
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
CouchRest
• A RESTful CouchDB client based on Heroku's RestClient and Couch.js
• http://github.com/couchrest/couchrest
viernes 5 de noviembre de 2010
CouchRest
• dbr=CouchRest.database("http://localhost:5984/ypages")
• record = dbr.get("homer")
=> {"name"=>"Homer", "_rev"=>"3-b87d", "_id"=>"homer"}
• record['name'] = "Moo"
=> "Moo"
• record.save
=> true
viernes 5 de noviembre de 2010
Couch Potato
• http://github.com/langalex/couch_potato
• ActiveRecord-like syntax
viernes 5 de noviembre de 2010
Couch Potatoclass Contact include CouchPotato::Persistence
property :name property :last_names property :phone_numbers validates_presence_of :name view :all, :key => :name view :by_phone, :map => "function(doc) { var phone_type; if (doc.name && doc.phone_numbers) { for (phone_type in doc.phone_numbers) { emit(phone_type, 1); } } }"
viernes 5 de noviembre de 2010
Couch Potatocontacts = CouchPotato.database.view Contact.by_phone
:key => “work”, :include_docs => true
=> [#<Contact _id: "8f4aa”...>, ...]
contacts.each do |contact|
contact.name = “Dr. #{contact.name}”
CouchPotato.database.save_document contact
end
viernes 5 de noviembre de 2010
Simply Stored
• http://github.com/peritor/simply_stored
• Built on top of Couch Potato
• Associations: has_many, belongs_to
• Sintactic sugar: find_by_name
viernes 5 de noviembre de 2010
CouchRest Model
• http://github.com/couchrest/couchrest_model
• For Rails 3
viernes 5 de noviembre de 2010
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
Our use case
Tracking the activity on a website during a live-broadcasted twitter-interview.
viernes 5 de noviembre de 2010
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
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
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
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