intro to couch db

37
Introduction to using CouchDB with PHP By Shahahr Evron Zend Technologies

Upload: shahar-evron

Post on 22-Apr-2015

19.697 views

Category:

Technology


0 download

DESCRIPTION

An introductory presentation to Document oriented databases, CouchDB, and using CouchDB from within PHP

TRANSCRIPT

Page 1: Intro To Couch Db

Introduction to using CouchDB with PHP

By Shahahr EvronZend Technologies

Page 2: Intro To Couch Db

2

Welcome!

I am:▶ A PHP programmer since 2002▶ At Zend since 2005▶ Technical Product Manager for Zend Server

Yes, I have a difficult name (at least for English speakers)

▶ Shachar (German, Dutch)

▶ Shajar (Spanish)

▶ Шахар (Russian)

▶ (Arabic) شخر

▶ (Hebrew) שחר

Page 3: Intro To Couch Db

3

Agenda▶ What is CouchDB?

● What is a Document-Oriented Database?

▶ Basic Concepts & the REST API● Databases

● Documents

▶ Views● Map/Reduce functions● Understanding the view collation

▶ Where to go next?

Page 4: Intro To Couch Db

4

What is Apache CouchDB?

Page 5: Intro To Couch Db

5

CouchDB Is...▶ An Open-Source document-oriented database▶ An Apache project

▶ HTTP based API, uses JSON for data representation▶ Built-in replication / synchronization support▶ Written in Erlang

▶ Started in 2005 by Damien Katz▶ Became an Apache project in 2008▶ Currently in version 0.10▶ API is still changing!

Page 6: Intro To Couch Db

6

A Document Oriented DatabaseData is stored in “documents”

...and not in “relations” like in an RDBMS

Page 7: Intro To Couch Db

7

Relational Storage

ID Name Region Owner

001 Reynholm Industries UK Bob

002 Dunder Mifflin Inc. US Sally

003 MomCorp NNY Sally

ID Account ID Name Email

001 001 Dwight Schrute [email protected]

002 001 Michael Scott [email protected]

003 002 Maurice Moss [email protected]

ID Account ID From Subject Body

001 001 001 Defending from bear attack [CLOB]

002 002 003 FIRE! [CLOB]

Page 8: Intro To Couch Db

8

Document Oriented Storage

{ "Name": "Reynholm Industries" "Region": "UK" "Owner": "Bob" "Contacts": [

{ "Name": "Maurice Moss" "Email": "[email protected]"}{ "Name": "Denholm Reynholm" "Email": "[email protected]"}]

}

{ "From": "Maurice Moss" "Subject": "FIRE!" "Message": "Dear Sir / Madam,

....

...."}

Page 9: Intro To Couch Db

9

Data is indexed with Map/Reduce functionsNo SQL!

▶ Querying is done using “views”▶ Views are defined using map/reduce functions▶ Data is indexed using these views as it is stored in the DB

Map/Reduce functions are:▶ Map functions emit (key, value) interpretation of the data▶ Reduce functions aggregate data emitted by map functions

Map/Reduce functions are written in JavaScript

Page 10: Intro To Couch Db

10

What is it good for?You should use it for...

▶ Storing documents – or any data which is document-like▶ Hosting entire applications!

Why?▶ Very easy to program with – no SQL, no schema, no ORM▶ Schema-less means very easy to deploy changes▶ Easy to administer, backup, replicate, can work offline

You should not use it for...▶ Storing data which is relational in nature▶ Be careful with data that needs to have unique values

Page 11: Intro To Couch Db

11

Hello, CouchDBtime to relax!

Page 12: Intro To Couch Db

12

Accessing CouchDB from PHPCouchDB is accessed using an HTTP based API

▶ You can use any good HTTP client from PHP to access CouchDB● PHP HTTP stream, cURL, pecl_http, Zend_Http_Client … ● We will use Zend_Http_Client in our examples (sorry, I'm biased!)

▶ You can create or use an existing dedicated client library● Wraps the HTTP calls with CouchDB-specific API

Data sent to / from CouchDB is serialized using JSON▶ You can use PHP's ext/json to easily work with it▶ You can use ZF's Zend_Json if you need a portable solution

Page 13: Intro To Couch Db

13

Server APICheck the server status:

echo $client->setUri('http://localhost:5984/') ->request('GET') ->getBody();

{"couchdb":"Welcome","version":"0.9.1"}

Get list of all databases:

echo $client->setUri('http://localhost:5984/_all_dbs') ->request('GET') ->getBody();

["my_db","stoa","test_suite_db","test_suite_db_a"]

Page 14: Intro To Couch Db

14

Database APICreate a new database:

$resp = $client->setUri('http://localhost:5984/mydb') ->request('PUT'); echo $resp->getStatus();

// Expected status is 201

Delete an existing database:$resp = $client->setUri('http://localhost:5984/mydb') ->request('DELETE'); echo $resp->getStatus();

// Expected status is 200

Page 15: Intro To Couch Db

15

Creating DocumentsCreating a new document with a server-generated ID:

$doc = json_encode(array( 'title' => 'Speaking at ZendCon09!', 'tags' => array('speaking', 'php', 'zendcon', 'zend'), 'created_at' => 1255977324, 'published' => true, 'content' => "Yey! I'm speaking at ZendCon!" ));

$resp = $client->setUri('http://localhost:5984/mydb') ->setRawData($doc, 'text/json') ->request('POST');

// Response code should be 201

echo $resp->getBody();

// {"ok":true,"id":"b82d17579b9c901f6911727167a39987","rev":"1-190672822"}

Page 16: Intro To Couch Db

16

The Futon Administration Interface

Page 17: Intro To Couch Db

17

Creating DocumentsCreating a new document with a user defined ID:

$doc = json_encode(array( 'title' => 'Speaking at ZendCon09!', 'tags' => array('speaking', 'php', 'zendcon', 'zend'), 'created_at' => 1255977324, 'published' => true, 'content' => "Yey! I'm speaking at ZendCon!" ));

$resp = $client->setUri('http://localhost:5984/mydb/speaking-at-zendcon') ->setRawData($doc, 'text/json') ->request('PUT');

// Response code should be 201

echo $resp->getBody();

// {"ok":true,"id":"speaking-at-zendcon","rev":"1-2035733428"}

Page 18: Intro To Couch Db

18

Accessing DocumentsAccess the current revision of a document:$docId = 'speaking-at-zendcon'; $resp = $client->setUri('http://localhost:5984/mydb/' . urlencode($docId)) ->request('GET'); var_export(json_decode($resp->getBody(), true));

▶ Expected output:array ( '_id' => 'speaking-at-zendcon', '_rev' => '1-2035733428', 'title' => 'Speaking at ZendCon09!', 'tags' => array ('speaking', 'php', 'zendcon', 'zend'), 'created_at' => 1255977324, 'published' => true, 'content' => 'Yey! I\'m speaking at ZendCon!', );

▶ You can access older revisions of the same document:'http://localhost:5984/mydb/speaking-at-zendcon?rev=' . $rev

Page 19: Intro To Couch Db

19

Updating DocumentsDocuments are updated as a whole

▶ You can't “update” a single value inside the document▶ You must specify the current revision number when updating

$doc = json_encode(array( '_rev' => '1-2035733428', 'title' => 'Speaking at ZendCon!', 'tags' => array('speaking', 'php', 'zendcon', 'zend'), 'created_at' => 1255977324, 'published' => false, 'content' => "Yey! I'm speaking at ZendCon!" ));

$resp = $client->setUri('http://localhost:5984/mydb/speaking-at-zendcon') ->setRawData($doc, 'text/json') ->request('PUT'); // Expected code is 201, 409 means revision conflict // Expected body: {"ok":true,"id":"speaking-at-zendcon","rev":"2-2571024485"}

Page 20: Intro To Couch Db

20

Deleting DocumentsDeleting is easy!

▶ Again, you must specify the revision number

$docId = 'speaking-at-zendcon';$rev = '1-2035733428';$url = "http://localhost:5984/mydb/$docId?rev=$rev";$resp = $client->setUri($url) ->request('DELETE');

echo $resp->getStatus();

// Expected status is 200

Page 21: Intro To Couch Db

21

Introducing the Sopha client library...http://github.com/shevron/sopha

Page 22: Intro To Couch Db

22

Sopha is...A CouchDB Client Library (being) written in PHP 5.2

▶ …except for the ViewServer component which is 5.3

Wraps the HTTP/JSON work in a simple API▶ Sopha_Http▶ Sopha_Json

Provides access to main CouchDB features▶ Sopha_Db▶ Sopha_Document▶ Sopha_View

Page 23: Intro To Couch Db

23

Some Sopha API:

Sopha_Db::createDb('mydb', 'localhost', Sopha_Db::COUCH_PORT); $db = new Sopha_Db('mydb'); // when opening an existing DB

$doc = $db->retrieve($docId, 'MyDocumentClass', $revision); $doc->myparam = 'some new value'; $doc->save();

$doc->delete();

$phpValue = array( 'kak' => 'dila', 'ma' => 'nishma' ); $doc = $db->create($phpValue, 'myDocuemtnId');

Page 24: Intro To Couch Db

24

Introducing the Stoa sample applicationhttp://github.com/shevron/stoa

Page 25: Intro To Couch Db

25

Views and Map/Reduce Functions

Page 26: Intro To Couch Db

26

What are views?A convenient way to query your documents

▶ Provide a way to access data based on more than the doc ID▶ Provide a way to aggregate data from several docs

Views are defined in design documents▶ Special URL: /<dbname>/_design/<viewname>▶ Each design document can define several views▶ Each view defines a map function, and can define a reduce

function▶ Documents inserted or updated are indexed using these functions

Page 27: Intro To Couch Db

27

Creating a design document

$mapFunc = 'function(doc) { emit(doc.from, doc); }'; $designDoc = json_encode(array( 'language' => 'javascript', 'views' => array( 'bycontact' => array( 'map' => $mapFunc ) ) ));

$resp = $client->setUri('http://localhost:5984/mydb/_design/email') ->setRawData($designDoc, 'text/json') ->request('PUT');

Creating a design document is like creating a regular document, with special content and URL:

Page 28: Intro To Couch Db

28

Map FunctionsMap functions emit interpretations of documents passed through them

▶ Can emit the entire document or a part of it▶ Can emit multiple results for a single document

Each emitted document has a key▶ The key can be any valid JSON value▶ Key is used for sorting and limiting the query scope

● You can query a view, and specify a single key or a key range

Page 29: Intro To Couch Db

29

Understanding View CollationView results are ordered by key, according to the view collection

View collation order:▶ null▶ Booleans: false, true▶ Numbers▶ Strings, case sensitive (lower case, upper case)▶ Arrays

● Internal sorting by values

▶ Objects● Internal sorting by keys

Page 30: Intro To Couch Db

30

Reduce FunctionsReduce functions reduce mapped values down to a single aggregated value

▶ Reduce is optional – a view can have a map function only▶ Reduce functions receive a set of keys and values

● Can be a set of values emitted by the map function● Can be an already-reduced value returned by a previous run of the

reduce function (rereduce)

▶ Reduce functions can group results according to their key● When not grouped, reduce will return a single value● Example: show count of all contacts vs. count of all contacts per

account

Page 31: Intro To Couch Db

31

Calling views

$url = "_design/post/_view/by-tag";$resp = $client->setUri("http://localhost:5984/$url") ->request('GET');

Views are accessed like regular documents, with a special URL:

{"total_rows":6,"offset":0,"rows":[{"id":"e0a21a071103585d1c2e3e168b2cfe6b",

"key":["buzz",1256058429],"value":{...}},{"id":"f03ddef93502092218cb39c25be47937",

"key":["buzz",1256058469],"value":{...}},{"id":"e0a21a071103585d1c2e3e168b2cfe6b",

"key":["leveraging",1256058429],"value":{...}},{"id":"f03ddef93502092218cb39c25be47937",

"key":["meta",1256058469],"value":"value":{...}},{"id":"f03ddef93502092218cb39c25be47937",

"key":["post",1256058469],"value":"value":{...}},{"id":"e0a21a071103585d1c2e3e168b2cfe6b",

"key":["stuff",1256058429],"value":"value":{...}},]}

Page 32: Intro To Couch Db

32

Query ParametersYou can add the following parameters to the query when calling a view:

▶ key=keyvalue▶ startkey=keyvalue▶ endkey=keyvalue▶ limit=...▶ descending=true▶ skip=...▶ group=true (when calling a reduce view)▶ grouplevel=... (when calling a reduce view)

Page 33: Intro To Couch Db

33

Epilogue

Page 34: Intro To Couch Db

34

Last Advice...

▶ Forget what you know about relational databases!

▶ …but don't try to force data that should not be in CouchDB in to it – you can use both an RDBMS and a document DB!

▶ Understand Map/Reduce

▶ Understand the view collation, and use it creatively

▶ Ask questions!

Page 35: Intro To Couch Db

35

Some things not covered here...But you should probably know about:

▶ Bulk queries

▶ Document attachments

▶ Authentication & access control model

▶ Utilizing HTTP-level caching

▶ Replication model & conflict resolution

▶ In-DB applications

▶ Lucene Integration

▶ Replacing the view server (yes, you can use PHP!)

Page 36: Intro To Couch Db

36

Want to learn more?

Google: http://www.google.com ;)

Docs & Wiki: http://couchdb.apache.org

IRC: #couchdb @ FreeNode

Mailing List : [email protected]

Upcoming Book: http://books.couchdb.org/relax/

Page 37: Intro To Couch Db

37

Thank You!Feedback: [email protected], http://joind.in/890, @shevronSlides will be available at http://arr.gr/

This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.