<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bradley Holt &#187; CouchDB</title>
	<atom:link href="http://bradley-holt.com/tag/couchdb/feed/" rel="self" type="application/rss+xml" />
	<link>http://bradley-holt.com</link>
	<description></description>
	<lastBuildDate>Thu, 17 May 2012 01:04:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Entity Relationships in a Document Database</title>
		<link>http://bradley-holt.com/2012/05/entity-relationships-in-a-document-database/</link>
		<comments>http://bradley-holt.com/2012/05/entity-relationships-in-a-document-database/#comments</comments>
		<pubDate>Thu, 17 May 2012 01:04:35 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Boston]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchConf]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1546</guid>
		<description><![CDATA[This week I attended and presented at CouchConf Boston. I&#8217;d like to thank Couchbase for inviting me to speak—it was a great opportunity to meet other CouchDB and Couchbase users. I&#8217;ve posted the slides from my Entity Relationships in a Document Database talk to Speaker Deck (and SlideShare, if you prefer): The presentation covered four [...]]]></description>
			<content:encoded><![CDATA[<p>This week I attended and presented at CouchConf Boston. I&#8217;d like to thank <a href="http://www.couchbase.com/">Couchbase</a> for inviting me to speak—it was a great opportunity to meet other CouchDB and Couchbase users. I&#8217;ve posted the slides from my <a href="https://speakerdeck.com/u/bradleyholt/p/entity-relationships-in-a-document-database-at-couchconf-boston">Entity Relationships in a Document Database talk to Speaker Deck</a> (and <a href="http://www.slideshare.net/bradley.holt/entity-relationships-in-a-document-database-at-couchconf-boston">SlideShare</a>, if you prefer):<br />
<script async class="speakerdeck-embed" data-id="4fb26ea25a67ef03a500dc41" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"></script><br />
The presentation covered four patterns for modeling entity relationships in document databases such as CouchDB and Couchbase:</p>
<ul>
<li>Embedded Entities</li>
<li>Related Documents</li>
<li>List of Keys</li>
<li>Relationship Documents</li>
</ul>
<p>See the presentation for more details. This topic is also covered in the <em>MapReduce Views for SQL Users</em> chapter in the second edition of <a href="http://shop.oreilly.com/product/0636920018247.do">Writing and Querying MapReduce Views in CouchDB</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2012/05/entity-relationships-in-a-document-database/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Day Against DRM</title>
		<link>http://bradley-holt.com/2012/05/day-against-drm/</link>
		<comments>http://bradley-holt.com/2012/05/day-against-drm/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:00:01 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Day Against DRM]]></category>
		<category><![CDATA[DRM]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1532</guid>
		<description><![CDATA[Today is the Free Software Foundation&#8217;s (FSF) International Day Against Digital Restrictions Management (DRM). This being done as part of the FSF&#8217;s Defective by Design anti-DRM campaign. To celebrate Day Against DRM O&#8217;Reilly Media is having a sale of 50% off all of its ebooks (which are all DRM-free) including Writing and Querying MapReduce Views [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://dayagainstdrm.org"><img class="alignright" src="http://static.fsf.org/nosvn/dbd/2012/day-against-drm/vertical.png" alt="Day Against DRM vertical banner" /></a>Today is the Free Software Foundation&#8217;s (FSF) <a href="http://www.defectivebydesign.org/dayagainstdrm/">International Day Against Digital Restrictions Management</a> (DRM). This being done as part of the FSF&#8217;s <a href="http://www.defectivebydesign.org/">Defective by Design</a> anti-DRM campaign. To celebrate Day Against DRM O&#8217;Reilly Media is having a sale of 50% off all of its ebooks (which are all DRM-free) including <a href="http://shop.oreilly.com/product/0636920018247.do">Writing and Querying MapReduce Views in CouchDB</a> and <a href="http://shop.oreilly.com/product/0636920018407.do">Scaling CouchDB</a>. From O&#8217;Reilly Media:</p>
<blockquote><p>In Celebration of *Day Against DRM*<br />
Save 50% on ALL Ebooks &amp; Videos</p>
<p>Having the ability to download files at your convenience, store them on all your devices, or share them with a friend or colleague as you would a print book, is liberating, and is how it should be. If you haven&#8217;t tried a DRM-free ebook or video, we encourage you to do so now. And if you&#8217;re already a fan, take advantage of our sale and add to your library.</p>
<p>For one day only, you can save 50% on all O&#8217;Reilly, No Starch, and Rocky Nook ebooks and videos. Use code: DRMFREE</p>
<p>Ebooks from <a href="http://oreilly.com">oreilly.com</a> are DRM-free. You get free lifetime access, multiple file formats, free updates. Deal expires May 4, 2012 at 11:59pm PT and cannot be combined with other offers.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2012/05/day-against-drm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speaking at CouchConf Boston</title>
		<link>http://bradley-holt.com/2012/04/speaking-at-couchconf-boston/</link>
		<comments>http://bradley-holt.com/2012/04/speaking-at-couchconf-boston/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 18:40:38 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Boston]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchConf]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1527</guid>
		<description><![CDATA[I will be giving a presentation on Entity Relationships in a Document Database at CouchConf Boston on May 15th. The talk description: Unlike relational databases, document databases like CouchDB and Couchbase do not directly support entity relationships. This talk will explore patterns of modeling one-to-many and many-to-many entity relationships in a document database. These patterns [...]]]></description>
			<content:encoded><![CDATA[<p>I will be giving a presentation on <em>Entity Relationships in a Document Database</em> at <a href="http://www.couchbase.com/couchconf-boston">CouchConf Boston</a> on May 15<sup>th</sup>. The talk description:</p>
<blockquote><p>Unlike relational databases, document databases like CouchDB and Couchbase do not directly support entity relationships. This talk will explore patterns of modeling one-to-many and many-to-many entity relationships in a document database. These patterns include using an embedded JSON array, relating documents using identifiers, using a list of keys, and using relationship documents.</p></blockquote>
<p>Additionally, this talk will address how each entity relationship pattern equates to its equivalent in a relational database. I&#8217;ll be discussing the relevant differences between document databases and relational databases such as:</p>
<ul>
<li>Document databases do not have tables</li>
<li>Each document can have its own schema</li>
<li>There is no built-in concept of relationships between documents</li>
<li>Views/indexes are queried directly instead of being used to optimize more generalized queries</li>
<li>A column within a result set can contain a mix of logical data types</li>
<li>There is typically no support for transactions across document boundaries</li>
</ul>
<p>This talk is based on the <em>MapReduce Views for SQL Users</em> chapter that I&#8217;ve added to the second edition of <a href="http://shop.oreilly.com/product/0636920018247.do">Writing and Querying MapReduce Views in CouchDB</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2012/04/speaking-at-couchconf-boston/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Future of CouchDB and Couchbase Server</title>
		<link>http://bradley-holt.com/2012/01/the-future-of-couchdb-and-couchbase-server/</link>
		<comments>http://bradley-holt.com/2012/01/the-future-of-couchdb-and-couchbase-server/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 19:42:03 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1491</guid>
		<description><![CDATA[&#8220;What&#8217;s the future of CouchDB? It&#8217;s Couchbase.&#8221; —Damien Katz &#8220;The future of CouchDB is CouchDB.&#8221; —Noah Slater First of all, don&#8217;t panic. The Apache CouchDB project is thriving. There are plenty of core contributors who are dedicated to the project. If you&#8217;re using CouchDB, you&#8217;re fine. If you&#8217;re considering using CouchDB, you&#8217;ll be fine. CouchDB [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;<a href="http://damienkatz.net/2012/01/the_future_of_couchdb.html">What&#8217;s the future of CouchDB? It&#8217;s Couchbase.</a>&#8221; —Damien Katz</p></blockquote>
<blockquote><p>&#8220;<a href="https://twitter.com/nslater/status/154938284647260160">The future of CouchDB is CouchDB.</a>&#8221; —Noah Slater</p></blockquote>
<p>First of all, don&#8217;t panic. The Apache CouchDB project is thriving. There are plenty of core contributors who are dedicated to the project. If you&#8217;re using CouchDB, you&#8217;re fine. If you&#8217;re considering using CouchDB, you&#8217;ll be fine. CouchDB has a bright future ahead of it. Couchbase has repeatedly said that they&#8217;re not the CouchDB company, so this shouldn&#8217;t be a surprise to anyone.</p>
<p>My interpretation of this announcement is that CouchDB is forking. Going forward, you&#8217;ll have two choices, either Apache CouchDB or Couchbase Server. The <a href="https://issues.apache.org/jira/browse/COUCHDB?report=com.atlassian.jira.plugin.system.project:roadmap-panel">road map for Apache CouchDB</a> will continue to be determined by community consensus. The road map for Couchbase Server will be determined by Couchbase, the company.</p>
<p>CouchDB has two futures: CouchDB and Couchbase Server. Traditionally, forking a project in this manner has been considered a Bad Thing. From The Jargon File entry for <a href="http://catb.org/jargon/html/F/forked.html">forked</a>:</p>
<blockquote><p>An open-source software project is said to have forked or be forked when the project group fissions into two or more parts pursuing separate lines of development (or, less commonly, when a third party unconnected to the project group begins its own line of development).  Forking is considered a <a href="http://catb.org/jargon/html/B/Bad-Thing.html"><em>Bad Thing</em></a> — not merely because it implies a lot of wasted effort in the future, but because forks tend to be accompanied by a great deal of strife and acrimony between the successor groups over issues of legitimacy, succession, and design direction.  There is serious social pressure against forking.  As a result, major forks (such as the Gnu-Emacs/XEmacs split, the fissionings of the 386BSD group into three daughter projects, and the short-lived GCC/EGCS split) are rare enough that they are remembered individually in hacker folklore.</p></blockquote>
<p>In my humble opinion, forking should no longer be considered a Bad Thing. Distributed revision control systems, such as Git, have made it much easier to merge changes back-and-forth between forked projects. If an individual or organization wants to take a project in a different direction, great! It sounds like Couchbase Server will be designed to meet a set of needs that are not being met by CouchDB. If so, a fork is perfectly appropriate as now both sets of needs can be met.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2012/01/the-future-of-couchdb-and-couchbase-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top Five Posts of 2011</title>
		<link>http://bradley-holt.com/2011/12/top-five-posts-of-2011/</link>
		<comments>http://bradley-holt.com/2011/12/top-five-posts-of-2011/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 17:15:32 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AMQP]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[Domain-Driven Design]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Open Standards]]></category>
		<category><![CDATA[OSCON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP-QAT]]></category>
		<category><![CDATA[Quality Assurance]]></category>
		<category><![CDATA[RabbitMQ]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1480</guid>
		<description><![CDATA[Continuing a trend started by Cal Evans and then followed by Chris Cornutt, Matthew Turland, and Joe Devon; here are the top five most viewed posts from my blog in 2011. 5. CouchDB and Domain-Driven Design This post covered two topics that are of great interest to me. Document databases like CouchDB have much potential [...]]]></description>
			<content:encoded><![CDATA[<p>Continuing a trend started by <a href="http://blog.calevans.com/2011/12/29/top-three-posts-of-2011/">Cal Evans</a> and then followed by <a href="http://blog.phpdeveloper.org/?p=425">Chris Cornutt</a>, <a href="http://matthewturland.com/2011/12/29/top-10-posts-of-2011/">Matthew Turland</a>, and <a href="http://mysqltalk.wordpress.com/2011/12/30/top-posts-of-2011/">Joe Devon</a>; here are the top five most viewed posts from my blog in 2011.</p>
<h3>5. <a href="http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/">CouchDB and Domain-Driven Design</a></h3>
<p>This post covered two topics that are of great interest to me. Document databases like CouchDB have much potential when it comes to domain-driven design. The post outlined some techniques for serializing domain objects into CouchDB documents.</p>
<h3>4. <a href="http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/">Addressing the NoSQL Criticism</a></h3>
<p>I heard a lot of NoSQL bashing this year at OSCON. As a result, I decided to write a rebuttal to many of the criticisms that I heard. This post inspired a lively <a href="http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/#comments">comment thread</a>.</p>
<h3>3. <a href="http://bradley-holt.com/2011/07/testing-php-5-4/">Testing PHP 5.4</a></h3>
<p>This was a short post on how to help the <a href="http://qa.php.net/">PHP Quality Assurance Team</a> by running the tests for the latest development version of PHP 5.4. It covered downloading, compiling, and running the tests. Most importantly, it also covered reporting your test results.</p>
<h3>2. <a href="http://bradley-holt.com/2011/07/exploring-rabbitmq-and-php/">Exploring RabbitMQ and PHP</a></h3>
<p>I was exploring the possibility of using RabbitMQ for an upcoming project. I decided to post some notes on my experience getting started with RabbitMQ and integrating it with PHP. I haven&#8217;t ended up using RabbitMQ in production yet, but I&#8217;m confident that I&#8217;ll end up using it at some point.</p>
<h3>1. <a href="http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/">CouchDB jQuery Plugin Reference</a></h3>
<p>I had been frustrated by the lack of documentation for the CouchDB jQuery plugin—so decided to write my own. After I wrote the blog post, <a href="http://www.maxogden.com/">Max Ogden</a> pointed me to <a href="http://arandomurl.com/">Dale Harvey</a>‘s <a href="https://github.com/daleharvey/jquery.couch.js-docs">documentation generator for jquery.couch.js</a> and a copy of the generated <a href="http://daleharvey.github.com/jquery.couch.js-docs/symbols/index.html">jQuery CouchDB documentation</a>. Max and Dale are also working on a more flexible jquery.couch2.js.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/12/top-five-posts-of-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchApps at CouchConf NYC</title>
		<link>http://bradley-holt.com/2011/10/couchapps-at-couchconf-nyc/</link>
		<comments>http://bradley-holt.com/2011/10/couchapps-at-couchconf-nyc/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 20:05:52 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1413</guid>
		<description><![CDATA[Here are the slides from Monday&#8217;s CouchConf NYC session on CouchApps with CouchDB, JavaScript and HTML5: CouchConf NYC CouchApps View more presentations from Bradley Holt]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from Monday&#8217;s CouchConf NYC session on CouchApps with CouchDB, JavaScript and HTML5:</p>
<div style="width:425px" id="__ss_9862348"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/bradley.holt/couchconf-nyc-couchapps-9862348" title="CouchConf NYC CouchApps" target="_blank">CouchConf NYC CouchApps</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9862348" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/10/couchapps-at-couchconf-nyc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learning CouchDB at ZendCon 2011</title>
		<link>http://bradley-holt.com/2011/10/learning-couchdb-at-zendcon-2011/</link>
		<comments>http://bradley-holt.com/2011/10/learning-couchdb-at-zendcon-2011/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:10:03 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[ZendCon]]></category>
		<category><![CDATA[ZendCon11]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1378</guid>
		<description><![CDATA[Here are the slides from today’s ZendCon tutorial on Learning CouchDB: ZendCon 2011 Learning CouchDB View more presentations from Bradley Holt You can instead download the PDF version, if you&#8217;d prefer. If you were in this session, please give me feedback on Joind.in.]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from today’s ZendCon tutorial on Learning CouchDB:</p>
<div style="width:425px" id="__ss_9726170"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/bradley.holt/zendcon-2011-learning-couchdb" title="ZendCon 2011 Learning CouchDB" target="_blank">ZendCon 2011 Learning CouchDB</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9726170" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a> </div>
</p></div>
<p>You can instead <a href="http://bradley-holt.com/wp-content/uploads/2011/10/zendcon-2011-learning-couchdb.pdf">download the PDF version</a>, if you&#8217;d prefer.</p>
<p>If you were in this session, please <a href="http://joind.in/talk/view/3763">give me feedback on Joind.in</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/10/learning-couchdb-at-zendcon-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchApps at jQuery Conference Boston 2011</title>
		<link>http://bradley-holt.com/2011/10/couchapps-at-jquery-conference-boston-2011/</link>
		<comments>http://bradley-holt.com/2011/10/couchapps-at-jquery-conference-boston-2011/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 17:15:51 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQCon]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1359</guid>
		<description><![CDATA[Here are the slides from today’s jQuery Conference presentation on CouchApps with CouchDB &#38; jQuery: jQuery Conference Boston 2011 CouchApps View more presentations from Bradley Holt If you were in this talk, please give me feedback on SpeakerRate. Related links: Offline Apps HTML5 Web Storage Local Storage &#8220;Native&#8221; Mobile Web Apps jQuery Mobile PhoneGap Building [...]]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from today’s jQuery Conference presentation on CouchApps with CouchDB &amp; jQuery:</p>
<div style="width:425px" id="__ss_9504563"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/bradley.holt/jquery-conference-boston-2011-couchapps" title="jQuery Conference Boston 2011 CouchApps" target="_blank">jQuery Conference Boston 2011 CouchApps</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9504563" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a> </div>
</p></div>
<p>If you were in this talk, please give me <a href="http://speakerrate.com/talks/8512-couchapps-with-couchdb-jquery">feedback on SpeakerRate</a>.</p>
<p>Related links:</p>
<ul>
<li> Offline Apps
<ul>
<li> <a href="http://diveintohtml5.org/offline.html">HTML5 Web Storage</a></li>
<li> <a href="http://diveintohtml5.org/storage.html">Local Storage</a></li>
</ul>
</li>
<li> &#8220;Native&#8221; Mobile Web Apps
<ul>
<li> <a href="http://jquerymobile.com/">jQuery Mobile</a></li>
<li> <a href="http://www.phonegap.com/">PhoneGap</a></li>
<li> <a href="http://shop.oreilly.com/product/9780596805791.do">Building iPhone Apps with HTML, CSS, and JavaScript</a></li>
<li> <a href="http://shop.oreilly.com/product/0636920010067.do">Building Android Apps with HTML, CSS, and JavaScript</a></li>
</ul>
</li>
<li> CouchDB and Couchbase
<ul>
<li> <a href="http://couchdb.apache.org/">CouchDB</a></li>
<li> <a href="http://www.couchbase.com/products-and-services/overview">Couchbase</a></li>
<li> <a href="http://googlecode.blogspot.com/2009/09/chris-anderson-couchdb-relaxing-offline.html">&#8220;Ground Computing&#8221;</a></li>
</ul>
</li>
<li> CouchApp Examples
<ul>
<li> Grocery Sync
<ul>
<li> <a href="https://github.com/couchbaselabs/GrocerySync-CouchApp">Couchapp code</a></li>
<li> <a href="https://github.com/couchbaselabs/iOS-Couchbase-Demo">iOS code</a></li>
<li> <a href="https://github.com/couchbaselabs/AndroidGrocerySync">Android code</a></li>
<li> <a href="http://blog.couchbase.com/couchbase-mobile-see-the-video">Presentation about Couchbase Mobile</a></li>
</ul>
</li>
<li> Monocles
<ul>
<li> <a href="http://monocl.es/">Demo</a></li>
<li> <a href="https://github.com/maxogden/monocles">Code</a></li>
<li> ReadWriteHack Interview with Max Ogden: <a href="http://www.readwriteweb.com/hack/2011/02/hacker-chat-max-ogden.php">Part 1</a>, <a href="http://www.readwriteweb.com/hack/2011/02/max-pt-2.php">Part 2</a></li>
</ul>
</li>
<li> CatMapper
<ul>
<li> <a href="http://catmapper.com/">Demo</a></li>
<li> <a href="https://github.com/maxogden/catmapper">Code</a></li>
</ul>
</li>
</ul>
</li>
<li> CouchDB jQuery Plugin
<ul>
<li> <a href="http://www.w3.org/Security/wiki/Same_Origin_Policy">Same-Origin Policy</a></li>
<li> <a href="http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/">CouchDB jQuery Plugin Reference</a></li>
<li> <a href="http://daleharvey.github.com/jquery.couch.js-docs/symbols/index.html">jQuery CouchDB jsDoc Reference</a></li>
</ul>
</li>
<li> <a href="http://couchapp.org/page/couchapp-python">couchapp command line tool</a></li>
<li> CouchApp Building Blocks
<ul>
<li> <a href="http://couchapp.org/page/evently">Evently</a></li>
<li> <a href="http://mustache.github.com/">Mustache</a></li>
<li> <a href="http://couchapp.couchone.com/docs/_design/docs/index.html#/topic/pathbinder">Pathbinder</a></li>
</ul>
</li>
<li> Alternative CouchApp Tools
<ul>
<li> <a href="https://github.com/mikeal/node.couchapp.js">node.couchapp.js</a></li>
<li> <a href="http://kansojs.org/">Kanso Framework</a></li>
<li> <a href="https://github.com/quirkey/soca">soca</a></li>
<li> <a href="http://reupholster.iriscouch.com/reupholster/_design/app/index.html">Reupholster</a></li>
</ul>
</li>
<li> Hosting
<ul>
<li> <a href="http://www.iriscouch.com/">Iris Couch</a></li>
<li> <a href="https://cloudant.com/">Cloudant</a></li>
</ul>
</li>
<li> CouchDB &amp; CouchApp Resources
<ul>
<li> <a href="http://couchapp.org/">CouchApp Wiki</a></li>
<li> <a href="http://wiki.apache.org/couchdb/">CouchDB Wiki</a></li>
<li> <a href="http://oreilly.com/catalog/9780596155896/">CouchDB: The Definitive Guide</a></li>
<li> <a href="http://oreilly.com/catalog/9781449303129/">Writing and Querying MapReduce Views in CouchDB</a></li>
<li> <a href="http://oreilly.com/catalog/9781449303433/">Scaling CouchDB</a></li>
<li> <a href="http://www.apress.com/9781430272373">Beginning CouchDB</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/10/couchapps-at-jquery-conference-boston-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speaking at CouchConf NYC</title>
		<link>http://bradley-holt.com/2011/09/speaking-at-couchconf-nyc/</link>
		<comments>http://bradley-holt.com/2011/09/speaking-at-couchconf-nyc/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 16:33:58 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchConf]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NYC]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1352</guid>
		<description><![CDATA[I&#8217;m pleased to announce that I&#8217;ll be speaking at CouchConf New York City on October 24, 2011. This event is part of the CouchConf World Tour presented by Couchbase. My talk will be on CouchApps with CouchDB, JavaScript and HTML5. From the talk description: In this talk we&#8217;ll see how to build CouchApps using CouchDB, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce that I&#8217;ll be speaking at <a href="http://www.couchbase.com/couchconf-nyc">CouchConf New York City</a> on October 24, 2011. This event is part of the <a href="http://www.couchbase.com/couchconf-world-tour">CouchConf World Tour</a> presented by Couchbase. My talk will be on CouchApps with CouchDB, JavaScript and HTML5. From the talk description:</p>
<blockquote><p>In this talk we&#8217;ll see how to build CouchApps using CouchDB, Javascript, and HTML5. We&#8217;ll look at related tools such as the couchapp command ine tool, the Evently jQuery plugin, the CouchDB API jQuery plugin, the CouchApp Loader, Pathbinder, and the Mustache templating framework.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/09/speaking-at-couchconf-nyc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchDB and Domain-Driven Design</title>
		<link>http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/</link>
		<comments>http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 15:30:27 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Domain-Driven Design]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1251</guid>
		<description><![CDATA[I&#8217;ve found CouchDB to be a great fit for domain-driven design (DDD). Specifically, CouchDB fits very well with the building block patterns and practices found within DDD. Two of these building blocks include Entities and Value Objects. Entities are objects defined by a thread of continuity and identity. A Value Object &#8220;is an object that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve found CouchDB to be a great fit for <a href="http://en.wikipedia.org/wiki/Domain-driven_design">domain-driven design</a> (DDD). Specifically, CouchDB fits very well with the building block patterns and practices found within DDD. Two of these building blocks include <em><a href="http://domaindrivendesign.org/node/109">Entities</a></em> and <em><a href="http://domaindrivendesign.org/node/135">Value Objects</a></em>. Entities are objects defined by a thread of continuity and identity. A Value Object &#8220;is an object that describes some characteristic or attribute but carries no concept of identity.&#8221; Value objects should be treated as immutable.</p>
<p><em><a href="http://domaindrivendesign.org/node/88">Aggregates</a></em> are groupings of associated Entities and Value Objects. Within an Aggregate, one member is designated as the <em>Aggregate Root</em>. External references are limited to only the Aggregate Root. Aggregates should follow transaction, distribution, and concurrency boundaries. Guess what else is defined by transaction, distribution, and concurrency boundaries? That&#8217;s right, JSON documents in CouchDB.</p>
<p>Let&#8217;s take a look at an example Aggregate, that representing a blog entry and related metadata. Note that the following UML diagrams are for classes in PHP, but it should be easy enough to translate these examples to any object-oriented programming language. We&#8217;ll start with the <code>Entry</code> Entity, which will serve as our Aggregate Root:</p>
<pre>-----------------------------------------
|                 Entry                 |
-----------------------------------------
|+ id : string                          |
|+ rev : string                         |
|+ title : Text                         |
|+ updated : Date                       |
|+ authors : Person[*]                  |
|+ content : Text                       |
-----------------------------------------
|+ __construct(entry : array) : void    |
|+ toArray() : array                    |
-----------------------------------------</pre>
<p>The <code>Text</code> Value Object:</p>
<pre>----------------------------------------------
|                    Text                    |
----------------------------------------------
|- type : string                             |
|- text : string                             |
----------------------------------------------
|+ __construct(type : string, text : string) |
|+ toArray() : array                         |
----------------------------------------------</pre>
<p>The <code>Date</code> Value Object:</p>
<pre>--------------------------------------
|                Date                |
--------------------------------------
|- timestamp : integer               |
--------------------------------------
|+ __construct(timestamp : integer)  |
|+ __toString() : string             |
--------------------------------------</pre>
<p>The <code>Person</code> Value Object:</p>
<pre>-------------------------------------------------------------
|                           Person                          |
-------------------------------------------------------------
|- name : string                                            |
|- uri : string                                             |
|- email : string                                           |
-------------------------------------------------------------
|+ __construct(name : string, uri : string, email : string) |
|+ toArray() : array                                        |
-------------------------------------------------------------</pre>
<p>I recommend serializing each Aggregate, starting with the Aggregate  Root, into a JSON document. Control access to Aggregate Roots  through a <em><a href="http://domaindrivendesign.org/node/123">Repository</a></em>. The <code>toArray()</code> methods above return an associative array representation of each object. The Repository can then transform the array into JSON for storage in CouchDB. Let&#8217;s take a look at the <code>EntryRepository</code>:</p>
<pre>---------------------------------
|        EntryRepository        |
---------------------------------
|                               |
---------------------------------
|+ get(id : string) : Entry     |
|+ post(entry : Entry) : void   |
|+ put(entry : Entry) : void    |
|+ delete(entry : Entry) : void |
---------------------------------</pre>
<p>Here&#8217;s an example of what the Aggregate&#8217;s object graph might look like, serialized as a JSON document:</p>
<pre><code class="javascript">{
    "_id": "http://bradley-holt.com/?p=1251",
    "title": {
        "type": "text",
        "text": "CouchDB and Domain-Driven Design"
    },
    "updated": "2011-08-02T15:30:00+00:00",
    "authors": [
        {
             "name": "Bradley Holt",
             "uri": "http://bradley-holt.com/",
             "email": "bradley.holt@foundline.com"
        }
    ],
    "content": {
        "type": "html",
        "text": "&lt;p&gt;I've found CouchDB to be a great fit for…&lt;/p&gt;"
    }
}</code></pre>
<p>You can also provide access to CouchDB views through Repositories. In the above example, this could be through the addition of an <code>index(skip : integer, limit : integer) : Entry[*]</code> method to the the <code>EntryRepository</code> (note that this is a naive pagination implementation, especially on large data sets—but that&#8217;s beyond the scope of this blog post). For more complex views, you may want to create a separate Repository for each CouchDB view.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

