SlideShare a Scribd company logo
MYSQL TO
MONGO (FTW)
Thinking Differently About Schema Design
@AJSHARP

Alex Sharp
Lead Developer, OptimisCorp

alexjsharp.com

github.com/ajsharp
CVBEAST
Mongo has many cool
features such as schema-
free, aggregation w
map/reduce and many
others
                           Side project


interested more in
domain modeling more
than performance and
scaling benefits of
Mongo




EMBEDDED OBJECTS
CVBEAST

 App to represent people’s curriculum vitae, but not in an
                    academic sense
CVBEAST

 Focus on “micro” experiences not suitable for a typical CV
           (definitely not suitable for a resumé)
CVBEAST

Simple object model, centered around highlighting attributes
                        of a person
CVBEAST

   Started out building with MySQL, b/c it’s familiar
OBJECT MODEL
                 Person

                 has a

                   CV

                has many

            Experience

                 has many

          ...       ...     ...
OBJECT MODEL
                           Person

                           has a

                             CV

 links, tags, and         has many
  other arbitrary
    properties        Experience

                           has many

                    ...       ...     ...
RELATIONAL SCHEMA
         people
           - id
           - name
           - ...

         cvs
           - id
           - person_id
           - ...

         experiences
           - id
           - cv_id
           - ...
RELATIONAL SCHEMA


       Lots of pointless JOINs
RELATIONAL SCHEMA
         people
           - id
           - name
           - ...

         cvs
           - id
           - person_id
           - ...

         experiences
           - id
           - cv_id
           - ...
RELATIONAL SCHEMA
         people
           - id
           - name
           - ...

         cvs             tags
                           - id
           - id            - name
           - person_id     - ...
           - ...
                         links
         experiences       - id
                           - name
           - id            - ...
           - cv_id
           - ...
not b/c of premature
optimization




                       this bothers me
It misrepresents the object model
        at the storage layer
It also became difficult to work with
 despite my familiarity with MySQL
It makes sense to store object relationships in
     first-class entities/documents/tables
But true object properties should be
        stored as properties
Not relationships.
Especially when properties have no practical
        meaning without the parent
CAVEAT


                              This is not always the case.

                                                    ;-)
if you need to:
* store LOTS of embedded objects (i.e. papermill)
EXAMPLE
Experience Links
EXPERIENCE.LINKS = [...]

     Dead-simple collection of links attached to
                  an experience
Mysql to mongo
RUBY MODEL CODE
 class Person
   include Mongoid::Document

   field :keywords, :type => Array

   index :keywords
   index 'cv.experiences.tags'
 end
class Experience
  include Mongoid::Document

  embeds_many :links
end

class Link
  include Mongoid::Document

  field :url
  field :title
  embedded_in :experience, :inverse_of => :links
end
class Experience
  include Mongoid::Document

  embeds_many :links
end                    Both models are embedded in the
                              person collection
class Link
  include Mongoid::Document

  field :url
  field :title
  embedded_in :experience, :inverse_of => :links
end
EXPERIENCE.LINKS = [...]

      A link is only relevant inside the
      context of an experience object.
EXPERIENCE.LINKS = [...]

      In other words, it is a property,
            not a relationship.
EXPERIENCE.LINKS = [...]

   Mongo brings the storage layer closer to
             the object model
EXPERIENCE.LINKS = [...]
{
    "title": "Presented at MongoLA",
    "links": [
      { "title": "Event Site",
        "url": "http://www.10gen.com/conferences/mongola2011"},
      { "title": "Slides",
        "url": "http://alexjsharp.com/posts/mongola-2010-slides"}
    ]
}
EXAMPLE
Embedded Search
Mysql to mongo
MYSQL
An exercise in masochism
The difficulty in MySQL came in working with
            properties of a person
These properties are represented as tables
And tables must be joined
SIMPLE SEARCH QUERY
select * from people
  inner join cvs on cvs.person_id = people.id
  inner join experiences on experiences.cv_id = cvs.id
  inner join tags on tags.experience_id = experiences.id
  where tags.name = 'ruby';
INDEXES NEEDED
 -   tags.experience_id
 -   tags.name
 -   experiences.cv_id
 -   cvs.person_id
Seems extremely unnecessary for such a
         simple object model
MONGO
An exercise in ... not masochism
Embedded objects make this query easy.
MONGO DOCUMENT “SCHEMA”
{"name": "Alex Sharp",
   "cv": {
     "experiences": [
       { "title": "spoke at MongoLA",
          "date" : "Thu Jan 13 2011",
          "tags" : ["mongodb", "speaking"]
       },
       {"title": "..."}
     ]
   }
}
MONGO DOCUMENT “SCHEMA”
{"name": "Alex Sharp",
   "cv": {
     "experiences": [
       { "title": "spoke at MongoLA",
          "date" : "Thu Jan 13 2011",
          "tags" : ["mongodb", "speaking"]
       },
       {"title": "..."}
     ]
   }
}
   we want to search for these
RUBY MODEL CODE
 class Person
   include Mongoid::Document

   field :keywords, :type => Array

   index :keywords
   index 'cv.experiences.tags'
 end
RUBY MODEL CODE
class Cv
  include Mongoid::Document

  embeds_many :experiences
end

class Experience
  include Mongoid::Document

  field :tags,       :type => Array, :default => []

  embedded_in :cv, :inverse_of => :experiences
  embeds_many :links

  after_save lambda { |exp| exp.cv.person.update_keywords }
end
RUBY MODEL CODE
class Cv
  include Mongoid::Document
                                      simple property
  embeds_many :experiences
end                                  (not relationship)
class Experience
  include Mongoid::Document

  field :tags,       :type => Array, :default => []

  embedded_in :cv, :inverse_of => :experiences
  embeds_many :links

  after_save lambda { |exp| exp.cv.person.update_keywords }
end
RUBY SEARCH CODE
class Person

  # i.e. db.people.find({"cv.experiences.tags": "ruby"})
  def self.search_by_tag(term)
    collection.find('cv.experiences.tags' => 'ruby')
  end

end
COMPARISON
select * from people
  inner join cvs on cvs.person_id = people.id
  inner join experiences on experiences.cv_id = cvs.id
  inner join tags on tags.experience_id = experiences.id
  where tags.name = 'ruby';


                       vs
db.people.find('cv.experiences.tags' => 'ruby')
WINS: IMPEDENCE MIS-MATCH

   Object persistence format is closer to
         application usage format
WINS: F(X)-ALITY

    Plus, we don’t lose any functionality.
WINS: FAMILIARITY

  Indexing principles are extremely familiar to
           relational database users.
WINS: FAMILIARITY

          Only simpler ;)
WINS: SIMPLICITY

        Query syntax is simple.
WINS: SIMPLICITY

    Dot notation > JOIN semantics filth
SUMMARY

     Mongo is perfectly suited for
        an app like CVBeast.
SUMMARY

   Where a relational DB forces storing
    object properties as relationships
SUMMARY

 Mongo narrows this mismatch considerably
SUMMARY

      A CV is a document...
SUMMARY

   So a document-oriented datastore
          seems appropriate.
SUMMARY

    Many object models have this
        tree-like structure.
SUMMARY

 Be willing to step outside of your comfort zone
SUMMARY

   And use Mongo when it’s practical.

More Related Content

What's hot (20)

PDF
An introduction to MongoDB
César Trigo
 
PPTX
Top 10 frameworks of node js
HabileLabs
 
KEY
Practical Ruby Projects With Mongo Db
Alex Sharp
 
PPTX
Mongodb basics and architecture
Bishal Khanal
 
KEY
MongoDB Strange Loop 2009
Mike Dirolf
 
PDF
MongoDB for Coder Training (Coding Serbia 2013)
Uwe Printz
 
KEY
Introduction to MongoDB (from Austin Code Camp)
Chris Edwards
 
KEY
MongoDB Java Development - MongoBoston 2010
Eliot Horowitz
 
PPTX
Mongo db workshop # 02
FarhatParveen10
 
PDF
Building Apps with MongoDB
Nate Abele
 
PPTX
Mongo db operations_v2
Thanabalan Sathneeganandan
 
PPTX
Mongo db – document oriented database
Wojciech Sznapka
 
PDF
An introduction to MongoDB
Universidade de São Paulo
 
PPTX
Mongo DB: Fundamentals & Basics/ An Overview of MongoDB/ Mongo DB tutorials
SpringPeople
 
PDF
Building your first app with mongo db
MongoDB
 
PPTX
Webinar: Back to Basics: Thinking in Documents
MongoDB
 
KEY
MongoDB
Steven Francia
 
PPTX
Webinar: Schema Design
MongoDB
 
PDF
The Fine Art of Schema Design in MongoDB: Dos and Don'ts
Matias Cascallares
 
An introduction to MongoDB
César Trigo
 
Top 10 frameworks of node js
HabileLabs
 
Practical Ruby Projects With Mongo Db
Alex Sharp
 
Mongodb basics and architecture
Bishal Khanal
 
MongoDB Strange Loop 2009
Mike Dirolf
 
MongoDB for Coder Training (Coding Serbia 2013)
Uwe Printz
 
Introduction to MongoDB (from Austin Code Camp)
Chris Edwards
 
MongoDB Java Development - MongoBoston 2010
Eliot Horowitz
 
Mongo db workshop # 02
FarhatParveen10
 
Building Apps with MongoDB
Nate Abele
 
Mongo db operations_v2
Thanabalan Sathneeganandan
 
Mongo db – document oriented database
Wojciech Sznapka
 
An introduction to MongoDB
Universidade de São Paulo
 
Mongo DB: Fundamentals & Basics/ An Overview of MongoDB/ Mongo DB tutorials
SpringPeople
 
Building your first app with mongo db
MongoDB
 
Webinar: Back to Basics: Thinking in Documents
MongoDB
 
Webinar: Schema Design
MongoDB
 
The Fine Art of Schema Design in MongoDB: Dos and Don'ts
Matias Cascallares
 

Similar to Mysql to mongo (20)

KEY
mongoDB at Visibiz
Mike Brocious
 
PDF
ORM in Django
Hoang Nguyen
 
PDF
CMF: a pain in the F @ PHPDay 05-14-2011
Alessandro Nadalin
 
PDF
Tame Accidental Complexity with Ruby and MongoMapper
Giordano Scalzo
 
PDF
20141216 graph database prototyping ams meetup
Rik Van Bruggen
 
PDF
Awesome Tools 2017
Noel De Martin Fernandez
 
PPTX
Back to Basics 1: Thinking in documents
MongoDB
 
PDF
Navigating the Transition from relational to NoSQL - CloudCon Expo 2012
Dipti Borkar
 
PDF
Transition from relational to NoSQL Philly DAMA Day
Dipti Borkar
 
PDF
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
NoSQLmatters
 
PPTX
Intro to RavenDB
Alonso Robles
 
PDF
NoSQL @ CodeMash 2010
Ben Scofield
 
KEY
Test-driven development: a case study
Maciej Pasternacki
 
PDF
Relationships are hard
ColdFusionConference
 
PDF
2012-08-29 - NoSQL Bootcamp (Redis, RavenDB & MongoDB für .NET Entwickler)
Johannes Hoppe
 
PDF
Introduction to NoSQL and Couchbase
Dipti Borkar
 
PDF
NoSQL overview #phptostart turin 11.07.2011
David Funaro
 
KEY
MongoDB - Ruby document store that doesn't rhyme with ouch
Wynn Netherland
 
PDF
Stream Execution with Clojure and Fork/join
Alex Miller
 
PDF
Concurrent Stream Processing
Alex Miller
 
mongoDB at Visibiz
Mike Brocious
 
ORM in Django
Hoang Nguyen
 
CMF: a pain in the F @ PHPDay 05-14-2011
Alessandro Nadalin
 
Tame Accidental Complexity with Ruby and MongoMapper
Giordano Scalzo
 
20141216 graph database prototyping ams meetup
Rik Van Bruggen
 
Awesome Tools 2017
Noel De Martin Fernandez
 
Back to Basics 1: Thinking in documents
MongoDB
 
Navigating the Transition from relational to NoSQL - CloudCon Expo 2012
Dipti Borkar
 
Transition from relational to NoSQL Philly DAMA Day
Dipti Borkar
 
Max Neunhöffer – Joins and aggregations in a distributed NoSQL DB - NoSQL mat...
NoSQLmatters
 
Intro to RavenDB
Alonso Robles
 
NoSQL @ CodeMash 2010
Ben Scofield
 
Test-driven development: a case study
Maciej Pasternacki
 
Relationships are hard
ColdFusionConference
 
2012-08-29 - NoSQL Bootcamp (Redis, RavenDB & MongoDB für .NET Entwickler)
Johannes Hoppe
 
Introduction to NoSQL and Couchbase
Dipti Borkar
 
NoSQL overview #phptostart turin 11.07.2011
David Funaro
 
MongoDB - Ruby document store that doesn't rhyme with ouch
Wynn Netherland
 
Stream Execution with Clojure and Fork/join
Alex Miller
 
Concurrent Stream Processing
Alex Miller
 
Ad

More from Alex Sharp (9)

PDF
Bldr: A Minimalist JSON Templating DSL
Alex Sharp
 
PDF
Bldr - Rubyconf 2011 Lightning Talk
Alex Sharp
 
PDF
Refactoring in Practice - Sunnyconf 2010
Alex Sharp
 
PDF
Refactoring in Practice - Ruby Hoedown 2010
Alex Sharp
 
PDF
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
Alex Sharp
 
PDF
Practical Ruby Projects with MongoDB - Ruby Midwest
Alex Sharp
 
KEY
Practical Ruby Projects with MongoDB - MongoSF
Alex Sharp
 
KEY
Getting Comfortable with BDD
Alex Sharp
 
KEY
Testing Has Many Purposes
Alex Sharp
 
Bldr: A Minimalist JSON Templating DSL
Alex Sharp
 
Bldr - Rubyconf 2011 Lightning Talk
Alex Sharp
 
Refactoring in Practice - Sunnyconf 2010
Alex Sharp
 
Refactoring in Practice - Ruby Hoedown 2010
Alex Sharp
 
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
Alex Sharp
 
Practical Ruby Projects with MongoDB - Ruby Midwest
Alex Sharp
 
Practical Ruby Projects with MongoDB - MongoSF
Alex Sharp
 
Getting Comfortable with BDD
Alex Sharp
 
Testing Has Many Purposes
Alex Sharp
 
Ad

Recently uploaded (20)

PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PPTX
Digital Circuits, important subject in CS
contactparinay1
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Digital Circuits, important subject in CS
contactparinay1
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 

Mysql to mongo

  • 1. MYSQL TO MONGO (FTW) Thinking Differently About Schema Design
  • 2. @AJSHARP Alex Sharp Lead Developer, OptimisCorp alexjsharp.com github.com/ajsharp
  • 3. CVBEAST Mongo has many cool features such as schema- free, aggregation w map/reduce and many others Side project interested more in domain modeling more than performance and scaling benefits of Mongo EMBEDDED OBJECTS
  • 4. CVBEAST App to represent people’s curriculum vitae, but not in an academic sense
  • 5. CVBEAST Focus on “micro” experiences not suitable for a typical CV (definitely not suitable for a resumé)
  • 6. CVBEAST Simple object model, centered around highlighting attributes of a person
  • 7. CVBEAST Started out building with MySQL, b/c it’s familiar
  • 8. OBJECT MODEL Person has a CV has many Experience has many ... ... ...
  • 9. OBJECT MODEL Person has a CV links, tags, and has many other arbitrary properties Experience has many ... ... ...
  • 10. RELATIONAL SCHEMA people - id - name - ... cvs - id - person_id - ... experiences - id - cv_id - ...
  • 11. RELATIONAL SCHEMA Lots of pointless JOINs
  • 12. RELATIONAL SCHEMA people - id - name - ... cvs - id - person_id - ... experiences - id - cv_id - ...
  • 13. RELATIONAL SCHEMA people - id - name - ... cvs tags - id - id - name - person_id - ... - ... links experiences - id - name - id - ... - cv_id - ...
  • 14. not b/c of premature optimization this bothers me
  • 15. It misrepresents the object model at the storage layer
  • 16. It also became difficult to work with despite my familiarity with MySQL
  • 17. It makes sense to store object relationships in first-class entities/documents/tables
  • 18. But true object properties should be stored as properties
  • 20. Especially when properties have no practical meaning without the parent
  • 21. CAVEAT This is not always the case. ;-) if you need to: * store LOTS of embedded objects (i.e. papermill)
  • 23. EXPERIENCE.LINKS = [...] Dead-simple collection of links attached to an experience
  • 25. RUBY MODEL CODE class Person include Mongoid::Document field :keywords, :type => Array index :keywords index 'cv.experiences.tags' end
  • 26. class Experience include Mongoid::Document embeds_many :links end class Link include Mongoid::Document field :url field :title embedded_in :experience, :inverse_of => :links end
  • 27. class Experience include Mongoid::Document embeds_many :links end Both models are embedded in the person collection class Link include Mongoid::Document field :url field :title embedded_in :experience, :inverse_of => :links end
  • 28. EXPERIENCE.LINKS = [...] A link is only relevant inside the context of an experience object.
  • 29. EXPERIENCE.LINKS = [...] In other words, it is a property, not a relationship.
  • 30. EXPERIENCE.LINKS = [...] Mongo brings the storage layer closer to the object model
  • 31. EXPERIENCE.LINKS = [...] { "title": "Presented at MongoLA", "links": [ { "title": "Event Site", "url": "http://www.10gen.com/conferences/mongola2011"}, { "title": "Slides", "url": "http://alexjsharp.com/posts/mongola-2010-slides"} ] }
  • 34. MYSQL An exercise in masochism
  • 35. The difficulty in MySQL came in working with properties of a person
  • 36. These properties are represented as tables
  • 37. And tables must be joined
  • 38. SIMPLE SEARCH QUERY select * from people inner join cvs on cvs.person_id = people.id inner join experiences on experiences.cv_id = cvs.id inner join tags on tags.experience_id = experiences.id where tags.name = 'ruby';
  • 39. INDEXES NEEDED - tags.experience_id - tags.name - experiences.cv_id - cvs.person_id
  • 40. Seems extremely unnecessary for such a simple object model
  • 41. MONGO An exercise in ... not masochism
  • 42. Embedded objects make this query easy.
  • 43. MONGO DOCUMENT “SCHEMA” {"name": "Alex Sharp", "cv": { "experiences": [ { "title": "spoke at MongoLA", "date" : "Thu Jan 13 2011", "tags" : ["mongodb", "speaking"] }, {"title": "..."} ] } }
  • 44. MONGO DOCUMENT “SCHEMA” {"name": "Alex Sharp", "cv": { "experiences": [ { "title": "spoke at MongoLA", "date" : "Thu Jan 13 2011", "tags" : ["mongodb", "speaking"] }, {"title": "..."} ] } } we want to search for these
  • 45. RUBY MODEL CODE class Person include Mongoid::Document field :keywords, :type => Array index :keywords index 'cv.experiences.tags' end
  • 46. RUBY MODEL CODE class Cv include Mongoid::Document embeds_many :experiences end class Experience include Mongoid::Document field :tags, :type => Array, :default => [] embedded_in :cv, :inverse_of => :experiences embeds_many :links after_save lambda { |exp| exp.cv.person.update_keywords } end
  • 47. RUBY MODEL CODE class Cv include Mongoid::Document simple property embeds_many :experiences end (not relationship) class Experience include Mongoid::Document field :tags, :type => Array, :default => [] embedded_in :cv, :inverse_of => :experiences embeds_many :links after_save lambda { |exp| exp.cv.person.update_keywords } end
  • 48. RUBY SEARCH CODE class Person # i.e. db.people.find({"cv.experiences.tags": "ruby"}) def self.search_by_tag(term) collection.find('cv.experiences.tags' => 'ruby') end end
  • 49. COMPARISON select * from people inner join cvs on cvs.person_id = people.id inner join experiences on experiences.cv_id = cvs.id inner join tags on tags.experience_id = experiences.id where tags.name = 'ruby'; vs db.people.find('cv.experiences.tags' => 'ruby')
  • 50. WINS: IMPEDENCE MIS-MATCH Object persistence format is closer to application usage format
  • 51. WINS: F(X)-ALITY Plus, we don’t lose any functionality.
  • 52. WINS: FAMILIARITY Indexing principles are extremely familiar to relational database users.
  • 53. WINS: FAMILIARITY Only simpler ;)
  • 54. WINS: SIMPLICITY Query syntax is simple.
  • 55. WINS: SIMPLICITY Dot notation > JOIN semantics filth
  • 56. SUMMARY Mongo is perfectly suited for an app like CVBeast.
  • 57. SUMMARY Where a relational DB forces storing object properties as relationships
  • 58. SUMMARY Mongo narrows this mismatch considerably
  • 59. SUMMARY A CV is a document...
  • 60. SUMMARY So a document-oriented datastore seems appropriate.
  • 61. SUMMARY Many object models have this tree-like structure.
  • 62. SUMMARY Be willing to step outside of your comfort zone
  • 63. SUMMARY And use Mongo when it’s practical.