using mongodb and a relational database at mongodb day
DESCRIPTION
Talk given at MongoDB Day in Austin about how to make MongoDB and a relational database work together in your application.TRANSCRIPT
![Page 1: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/1.jpg)
Building Good RelationsUsing MongoDB and a relational database in your apps
![Page 2: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/2.jpg)
Hayes Davis@hayesdavis
CheapTweet.com
![Page 3: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/3.jpg)
If you’ve already got an app
![Page 4: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/4.jpg)
You probably already have a database
![Page 5: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/5.jpg)
It’s probably relational
http://www.mbari.org/ssds/ReferenceDocuments/RDB_ER.gif
![Page 6: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/6.jpg)
It’s probably gotten a little
bit big
http://www.neonlite.ca/archives/images/big%20cat.jpg
![Page 7: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/7.jpg)
Or maybe it’s gotten huge
http://www.fahad.com/pics/liger.jpg
![Page 8: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/8.jpg)
And it’s probably pretty complicated
http://www.mazes.org.uk/i/101005m.gif
![Page 9: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/9.jpg)
Or maybe really
complicated
http://tommilsom.com/wp-content/files/france/maze.jpg
![Page 10: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/10.jpg)
Which makes it harder to change
http://twitter.com/dacort/status/11023722831
![Page 11: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/11.jpg)
But, you’re not going to throw
all that out
http://blog.makezine.com/284163191_6f09179853_o.jpg
![Page 12: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/12.jpg)
So let’s make NoSQL and SQL live in harmony
http://curiousanimals.net/wp-content/uploads/2008/03/cat-and-dog-sleep.jpg
![Page 13: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/13.jpg)
But first...
![Page 14: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/14.jpg)
Do you even need to?
![Page 15: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/15.jpg)
We all want to play with shiny
new toys
http://actionfan.files.wordpress.com/2009/07/voltron_metallic-vinyl-edit.jpg
![Page 16: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/16.jpg)
But sometimes that’s not the
best plan
http://www.pwn3d.us/wp-content/uploads/2006/11/voltron_1.jpg
![Page 17: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/17.jpg)
So, give yourself a test
![Page 18: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/18.jpg)
#1Is my data relational?
![Page 19: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/19.jpg)
#1Are my data relational?
![Page 20: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/20.jpg)
#2 Do my data access
patterns lend themselves to denormaliation?
![Page 21: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/21.jpg)
#3Do I expect a lot of
schema change?
![Page 22: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/22.jpg)
#4Can I drop ACID?
(Atomicity, Consistency, Isolation, Durability)
![Page 23: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/23.jpg)
#5Do I want to support a
new piece of infrastructure?
![Page 24: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/24.jpg)
If you answered yes to any of these questions...
![Page 25: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/25.jpg)
... at least for parts of your app...
![Page 26: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/26.jpg)
... then MongoDB might be
right for you
http://www.rankopedia.com/CandidatePix/25781.gif
![Page 27: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/27.jpg)
Where to start...
![Page 28: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/28.jpg)
Utilities and supporting tools
![Page 29: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/29.jpg)
Logging & analysis
http://sbadrinath.files.wordpress.com/2009/03/different26rqcu3.jpg
![Page 30: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/30.jpg)
We built Parrot
http://filmfanatic.org/reviews/wp-content/uploads/2008/01/anfscd-parrot.png
![Page 31: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/31.jpg)
Isolated subsystems
http://themarkvolta.files.wordpress.com/2009/01/lost-map.jpg
![Page 32: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/32.jpg)
Comments might be a good choice
http://www.readwriteweb.com/archives/facebook_wants_to_be_your_one_true_login.php
![Page 33: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/33.jpg)
Getting practical(in Rails, at least)
![Page 34: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/34.jpg)
Using MongoMapper and ActiveRecord
![Page 35: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/35.jpg)
Getting set up
![Page 36: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/36.jpg)
config/mongodb.yml
development: host: 127.0.0.1
test: host: 127.0.0.1
production: host: mongo-server.local
![Page 37: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/37.jpg)
config/initializers/mongo.rb# Read in the config infomongo_cfg = YAML.load( IO.read("#{RAILS_ROOT}/config/mongodb.yml"))[RAILS_ENV]
# Create the connection from mongodb.ymlargs = [mongo_cfg['host'],mongo_cfg['port']].compactMongoMapper.connection = Mongo::Connection.new(*conn_args)
# Pick the Mongo databasedb_cfg = Rails.configuration.database_configuration[RAILS_ENV]MongoMapper.database = mongo_cfg['database'] || db_cfg['database']
![Page 38: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/38.jpg)
Mixing your MM with your AR
http://i.treehugger.com/images/2007/10/24/frankenstein-jj-001.jpg
![Page 39: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/39.jpg)
app/models/preferences.rb
class Preferences include MongoMapper::Document key :user_id, Integer end
![Page 40: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/40.jpg)
apps/models/user.rb
class User < ActiveRecord::Base after_save :save_prefs def preferences @preferences ||= Preferences.find_or_create_by_user_id(id) end private def save_prefs @preferences.save if @preferences end end
![Page 41: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/41.jpg)
Usage
# Set any preferences you likeuser = User.find_by_login('thatguy')user.preferences[:foreground] = '#FF0000'user.preferences[:foo] = 'bar'user.save
# Later on, you can do thisuser = User.find_by_login('thatguy')user.preferences[:foreground] #returns '#FF0000'
![Page 42: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/42.jpg)
Our general solution
![Page 43: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/43.jpg)
active-expando(very, very alpha)
![Page 44: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/44.jpg)
Any attribute, any time# Grab a useruser = User.find(1)# Now set an attribute that didn't exist beforeuser.expandos.foreground = '#FF0000'# foreground is saved in Mongouser.save
# Find any users with a red foreground colorusers = User.expando_all( :conditions=>{:foreground=>'#FF0000'})
![Page 45: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/45.jpg)
Skip expandos, use delegate
class Post < ActiveRecord::Base expando_config do delegate :tags endend
p = Post.find(1)p.tags = ['foo','bar']p.save
# Find any Post with the tag "foo"Post.expando_all(:conditions=>{'tags'=>'foo'})
![Page 46: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/46.jpg)
It’s a rails plugin
![Page 47: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/47.jpg)
It’s on GitHub(http://github.com/hayesdavis/active-expando)
![Page 48: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/48.jpg)
Other issues
![Page 49: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/49.jpg)
Where we’re going we don’t need migrations
(or do we?)http://www.gordtep.com/files/2009/08/bttf2.jpg
![Page 50: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/50.jpg)
Flexibility is great(until it bites you)
![Page 51: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/51.jpg)
A general word of caution
![Page 52: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/52.jpg)
MongoDB is a moving target
![Page 53: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/53.jpg)
So are the tools
![Page 54: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/54.jpg)
There will be bugs
http://nitishkrishna.files.wordpress.com/2009/07/2007_there_will_be_blood_013.jpg
![Page 55: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/55.jpg)
So, be ready to upgrade
![Page 56: Using MongoDB and a Relational Database at MongoDB Day](https://reader034.vdocuments.site/reader034/viewer/2022051412/54c74e944a795959108b457e/html5/thumbnails/56.jpg)
Questions?