4. When does NOSQL make sense?
★ Your data is stored and retrieved mainly by primary key, without
complex joins.
★ You have a non-trivial amount of data, and the thought of managing
lots of RDBMS shards and replication failure scenarios gives you the fear.
http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/
Wednesday, October 28, 2009
5. Key value stores
Project Voldemort
me ver y cool
Ringo
Scalaris
So space
Kai
ojects in this
Dynomite
MemcacheDB
pr
ThruDB
CouchDB
Cassandra
HBase
Hypertable
Redis
Tokyo Cabinet/Tyrant
http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/
Wednesday, October 28, 2009
7. Tokyo Cabinet: Popular with Rubyists, Big in Japan
★ Lightning fast
★ Works best for at objects
★ Tokyo Tyrant for network access
http://www.igvita.com/2009/02/13/tokyo-cabinet-beyond-key-value-store/
Wednesday, October 28, 2009
10. CouchDB
Apache CouchDB is a distributed, fault-tolerant and
schema-free document-oriented database accessible via
a RESTful HTTP/JSON API.
http://couchdb.apache.org/
Wednesday, October 28, 2009
15. Ruby libraries for CouchDB
CouchRest
Basic model
om t he
RelaxDB
Fr ils talk
on Ra
CouchPotato
CouchFoo A ustin
ActiveCouch
http://www.slideshare.net/brianthecoder/couchdb
Wednesday, October 28, 2009
16. Document stores:
a lmost*
Throw out everything
you learned about DB design
* more on this later
Wednesday, October 28, 2009
17. SQL CouchDB
Prede ned, explicit schema Dynamic, implicit schema
Collection of named documents with varying
Uniform tables of data
structure
Normalized. Objects spread across tables. Denormalized. Docs usually self contained. Data
Duplication reduced. often duplicated.
Must know schema to read/write a complete
Must know only document name
object
Dynamic queries of static schemas Static queries of dynamic schemas
http://damienkatz.net/files/What is CouchDB.pdf
http://damienkatz.net/files/What is CouchDB.pdf
Wednesday, October 28, 2009
18. SQL CouchDB
Prede ned, explicit schema Dynamic, implicit schema
Collection of named documents with varying
Uniform tables of data
structure
Normalized. Objects spread across tables.
Duplication reduced.
TheDenormalized. Docs usually selfdetails
devil'soften duplicated.contained. Data
in the
Must know schema to read/write a complete
Must know only document name
object
Dynamic queries of static schemas Static queries of dynamic schemas
http://damienkatz.net/files/What is CouchDB.pdf
http://damienkatz.net/files/What is CouchDB.pdf
Wednesday, October 28, 2009
24. Let's just skip to here already!
x
Wednesday, October 28, 2009
25. Introducing
★ Built For Speedcan be very fast
★ Dynamic Queries and Indexes
★ Replication and Failover
★ Sharding
★ Map / Reduce
Wednesday, October 28, 2009
26. MongoDB is great for
★ Websites
★ Caching
★ High volume, low value
★ High scalability stash the hash
★ Storage of program objects and JSON
Wednesday, October 28, 2009
27. Not as great for
★ Highly transactional
★ Ad-hoc business intelligence
★ Problems requiring SQL
Wednesday, October 28, 2009
28. Installation
★ mkdir -p /data/db
★ download pre-built for OSX and unzip to /usr/local/
★ cp -R /usr/local/pathtomongo/bin /usr/local/bin
Ruby driver for MongoDB
★ sudo gem install mongo
Native C
★ sudo gem install mongo_ext extensions ( go turbo! )
★ sudo gem install mongo_mapper
Wednesday, October 28, 2009
29. what's in the box?
Contents of mongo/bin
★ mongod - The MongoDB server
★ mongo - the JavaScript interactive shell
★ mongoexport - export data as JSON or csv
★ mongoimport - As advertised
was?
★ mongodump - Like mysqldump why? What did you think it
★ mongorestore - Restore from mongodump les
★ mongos - Auto-sharding module (getting better with every build)
Wednesday, October 28, 2009
31. When I say
database
Wednesday, October 28, 2009
32. When I say think
database database
Wednesday, October 28, 2009
33. When I say think
database database
Well that one isn't new...
Wednesday, October 28, 2009
34. Databases in MongoDB
★ Made up of multiple collections
★ Are created on-the- y when rst referenced
Wednesday, October 28, 2009
35. When I say
collection
Wednesday, October 28, 2009
36. When I say think
collection table
Wednesday, October 28, 2009
37. Collections in MongoDB
★ Schema-less but typed!
★ For grouping documents into smaller query sets (speed)
★ Indexable by one or more key
★ Are created on-the- y when rst referenced
★ Capped collections: Fixed size, older records dropped after limit
reached
Wednesday, October 28, 2009
38. When I say
document
Wednesday, October 28, 2009
39. When I say think
document record or row
Wednesday, October 28, 2009
40. Document
★ Stored in a collection
★ Can have _id key that works like primary keys in MySQL
★ Supports relationships: subdocument or db reference
Wednesday, October 28, 2009
41. Document Storage (BSON)
{ author: 'joe',
created: Date('03-28-2009'),
title: 'Yet another blog post',
text: 'Here is the text...',
tags: [ 'example', 'joe' ],
comments: [ { author: 'jim', comment: 'I disagree' },
{ author: 'nancy', comment: 'Good post' }
]
}
http://www.mongodb.org/display/DOCS/BSON
Wednesday, October 28, 2009
42. Document Storage (BSON)
{ author: 'joe',
created: Date('03-28-2009'),
title: 'Yet another blog post',
text: 'Here is the text...',
tags: [ 'example', 'joe' ],
comments: [ { author: 'jim', comment: 'I disagree' },
{ author: 'nancy', comment: 'Good post' }
]
}
Sure wish JSON did this...
http://www.mongodb.org/display/DOCS/BSON
Wednesday, October 28, 2009
43. Document Storage (BSON) B is for Binary
{ author: 'joe',
created: Date('03-28-2009'),
title: 'Yet another blog post',
text: 'Here is the text...',
tags: [ 'example', 'joe' ],
comments: [ { author: 'jim', comment: 'I disagree' },
{ author: 'nancy', comment: 'Good post' }
]
}
Sure wish JSON did this...
http://www.mongodb.org/display/DOCS/BSON
Wednesday, October 28, 2009
47. Querying
db.collection.find({'first_name': 'John'}) # finds all Johns
db.collection.find({'first_name': /^wynn/i}) # regex
db.collection.find_first({'_id':1}) # finds first with _id of 1
db.collection.find({'age': {'$gte': 21}}) # finds possible drinkers
db.collection.find({'author.first_name':'John'}) # subdocument
db.collection.find({$where:'this.age >= 6 && this.age <= 18'})
Wednesday, October 28, 2009
48. More
Querying
$in, $nin, $all, $ne, $gt, $gte, $lt, $lte, $size, $where
:fields (like :select in active record)
:limit, :offset for pagination
:sort ascending or descending [['foo', 1], ['bar', -1]]
count and group (uses map/reduce)
db.collection.mapReduce(mapfunction,reducefunction[,options]);
Wednesday, October 28, 2009
49. 10 Gen projects on the hub
★ mongo-ruby-driver http://github.com/mongodb/mongo-ruby-
driver
★ mongorecord http://github.com/mongodb/mongo-activerecord-
ruby
Wednesday, October 28, 2009
50. MongoMapper from @jnunemaker
★ Mongo is not MySQL
★ DSL for modeling domain should also teach you Mongo
★ It sounded fun
★ Just released version 0.5.6
Wednesday, October 28, 2009
51. MongoMapper from @jnunemaker
★ Mongo is not MySQL
★ DSL for modeling domain should also teach you Mongo
★ It sounded fun
★ Just released version 0.5.6
I voted for "Nunemapper"
Wednesday, October 28, 2009
52. Features
★ Typecasting
★ Callbacks (ActiveSupport Callbacks)
★ Validations
★ Connection and database can differ per document
★ Create and Update with single or multiple
★ Delete and Destroy and _all counterparts
Be careful. Ordering can be tricky.
★ Find: id, ids, :all, : rst, :last
★ Associations
Wednesday, October 28, 2009
53. Example
class User
include MongoMapper::Document
key :name, String, :required => true, :length => 5..100
key :email, String, :required => true, :index => true
key :age, Integer, :numeric => true
key :active, Boolean, :default => true
one :address
many :articles
end
Included as module, not subclassed
(this may change soon).
class Address
include MongoMapper::Document
key :street, String
key :city, String
key :state, String, :length => 2
key :zip, Integer, :numeric => true, :length => 5
end
Wednesday, October 28, 2009
54. MongoDB fun
★ Capped collections (think memcache, actually used for replication)
★ Upserts db.collection.update({'_id':1}, {'$inc':
{'views':1}})
★ Multikeys (think tagging and full text search)
★ GridFS and auto-sharding
Wednesday, October 28, 2009
55. So, is it ready for Prime Time?
★ Disqus
★ SourceForge
★ TweetCongress, GovTwit -- Floxee.com
★ TweetSaver.com
★ Mozilla Ubiquity Herd
Ask these folks!
Wednesday, October 28, 2009
56. Lessons learned in production the fine print
★ The laws of computing are still in effect
★ Indexes are important no matter what the salesman told ya about
performance
★ Data modeling. Deep or Wide? The answer is yes!
★ MongoDB and MongoMapper are in active development
Very responsive yet very volatile changes!
Wednesday, October 28, 2009
57. How can you help?
★ We need an awesome admin GUI
★ Port some plugins (might get easier with ActiveModel support
coming soon)
★ Build something cool
Wednesday, October 28, 2009
58. Resources an d thanks for having me!
http://mongodb.org
http://www.10gen.com the very cool company behind MongoDB
http://groups.google.com/group/mongomapper
http://groups.google.com/group/mongodb-user
http://squeejee.com
Questions? I'm @pengwynn on Twitter
http://wynnnetherland.com
the very new blog
Wednesday, October 28, 2009