using mongodb and a relational database at mongodb day

56
Building Good Relations Using MongoDB and a relational database in your apps

Upload: hayesdavis

Post on 27-Jan-2015

119 views

Category:

Technology


1 download

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

Building Good RelationsUsing MongoDB and a relational database in your apps

Page 2: Using MongoDB and a Relational Database at MongoDB Day

Hayes Davis@hayesdavis

CheapTweet.com

Page 3: Using MongoDB and a Relational Database at MongoDB Day

If you’ve already got an app

Page 4: Using MongoDB and a Relational Database at MongoDB Day

You probably already have a database

Page 5: Using MongoDB and a Relational Database at MongoDB Day

It’s probably relational

http://www.mbari.org/ssds/ReferenceDocuments/RDB_ER.gif

Page 6: Using MongoDB and a Relational Database at MongoDB Day

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

Or maybe it’s gotten huge

http://www.fahad.com/pics/liger.jpg

Page 8: Using MongoDB and a Relational Database at MongoDB Day

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

Or maybe really

complicated

http://tommilsom.com/wp-content/files/france/maze.jpg

Page 10: Using MongoDB and a Relational Database at MongoDB Day

Which makes it harder to change

http://twitter.com/dacort/status/11023722831

Page 11: Using MongoDB and a Relational Database at MongoDB Day

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

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

But first...

Page 14: Using MongoDB and a Relational Database at MongoDB Day

Do you even need to?

Page 15: Using MongoDB and a Relational Database at MongoDB Day

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

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

So, give yourself a test

Page 18: Using MongoDB and a Relational Database at MongoDB Day

#1Is my data relational?

Page 19: Using MongoDB and a Relational Database at MongoDB Day

#1Are my data relational?

Page 20: Using MongoDB and a Relational Database at MongoDB Day

#2 Do my data access

patterns lend themselves to denormaliation?

Page 21: Using MongoDB and a Relational Database at MongoDB Day

#3Do I expect a lot of

schema change?

Page 22: Using MongoDB and a Relational Database at MongoDB Day

#4Can I drop ACID?

(Atomicity, Consistency, Isolation, Durability)

Page 23: Using MongoDB and a Relational Database at MongoDB Day

#5Do I want to support a

new piece of infrastructure?

Page 24: Using MongoDB and a Relational Database at MongoDB Day

If you answered yes to any of these questions...

Page 25: Using MongoDB and a Relational Database at MongoDB Day

... at least for parts of your app...

Page 26: Using MongoDB and a Relational Database at MongoDB Day

... 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

Where to start...

Page 28: Using MongoDB and a Relational Database at MongoDB Day

Utilities and supporting tools

Page 29: Using MongoDB and a Relational Database at MongoDB Day

Logging & analysis

http://sbadrinath.files.wordpress.com/2009/03/different26rqcu3.jpg

Page 30: Using MongoDB and a Relational Database at MongoDB Day

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

Isolated subsystems

http://themarkvolta.files.wordpress.com/2009/01/lost-map.jpg

Page 32: Using MongoDB and a Relational Database at MongoDB Day

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

Getting practical(in Rails, at least)

Page 34: Using MongoDB and a Relational Database at MongoDB Day

Using MongoMapper and ActiveRecord

Page 35: Using MongoDB and a Relational Database at MongoDB Day

Getting set up

Page 36: Using MongoDB and a Relational Database at MongoDB Day

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

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

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

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

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

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

Our general solution

Page 43: Using MongoDB and a Relational Database at MongoDB Day

active-expando(very, very alpha)

Page 44: Using MongoDB and a Relational Database at MongoDB Day

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

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

It’s a rails plugin

Page 47: Using MongoDB and a Relational Database at MongoDB Day

It’s on GitHub(http://github.com/hayesdavis/active-expando)

Page 48: Using MongoDB and a Relational Database at MongoDB Day

Other issues

Page 49: Using MongoDB and a Relational Database at MongoDB Day

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

Flexibility is great(until it bites you)

Page 51: Using MongoDB and a Relational Database at MongoDB Day

A general word of caution

Page 52: Using MongoDB and a Relational Database at MongoDB Day

MongoDB is a moving target

Page 53: Using MongoDB and a Relational Database at MongoDB Day

So are the tools

Page 54: Using MongoDB and a Relational Database at MongoDB Day

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

So, be ready to upgrade

Page 56: Using MongoDB and a Relational Database at MongoDB Day

Questions?