Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric...

41
Mixin' it Up: Datastore Edition Chris Cahoon Eric Oestrich

Transcript of Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric...

Page 1: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Mixin' it Up: DatastoreEdition

Chris CahoonEric Oestrich

Page 2: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 3: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Using only an object storeon a largeish appand then remembering you can use more than one database in a system

Page 4: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Hierarchical forms & responses

The (Central) Problem

Page 5: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Survey

Question (text)

Question Group

Question (date)

Response

Answer

Answer Group

Answer (date)

Question (phone #) Answer (phone #)

Page 6: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Lots of questionsLots of formsLots of users Lots of responses= Lots of queries

NUMBERS

Page 7: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

"We need an object store!"

Page 8: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

feels like ActiveRecord inside MongoDB

MONGOID!

Page 9: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 10: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

"This form belongs_to user!"

Page 11: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

"Mongoid has helpers for relations?!"

Page 12: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Response Survey

User

Not bad.

Page 13: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

(months pass...)

Page 14: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 15: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Response

SurveyUser

Oh.

Organization

Campaign

(etc.) (very etc.)

Page 16: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 17: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Mongoid works perfectly for those two models

Page 18: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

...but everything else is relational!

Page 19: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 20: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

There are problems with

object stores

Page 21: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

... used like a relational db

(there are things we missed from relational DBs)

Page 22: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Relations

Page 23: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Can only query one collection at

a time

Page 24: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Denormalization

Page 25: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

No foreign keys

Page 26: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

I accidentally the object

Page 27: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

and eat it too?

Can I have my cake?

Page 28: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 29: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Just Mongoid

Page 30: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Querying# 2 queriessurveys = Survey.where(:campaign_id.in =>

@user.campaigns.map(&:id)) survey_ids = surveys.map(&:id) # + 1 queryResponse.where(:survey_id.in => survey_ids,

:complete => true).first.answers

# = 3 total queries for search, not chainable

Page 31: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Interlude

Page 32: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 33: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Mongoid & ActiveRecord

Page 34: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Bridging the gap

Page 35: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 36: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Search with SQL, store with Mongo# 1 queryResponse.

joins(:survey, :campaign).where('complete' => true,

"campaigns.user_id" => @user.id). first.answer_collection

# = 1 total query for search, chainable

Page 37: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 38: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can
Page 39: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Should we gemify this?

Page 40: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

GitHub:

https://github.com/oestrich/mixin_it_up_datastore

(look at the branches)

Page 41: Datastore Edition Mixin' it Up - Oestrich · 2020-02-17 · Datastore Edition Chris Cahoon Eric Oestrich. Using only an object store on a largeish app and then remembering you can

Thanks