SlideShare a Scribd company logo
#MongoDBDays

Schema Design
Craig Wilson
Software Engineer, MongoDB
@craiggwilson
All application development is

Schema Design
Success comes from a

Proper Data Structure
Terminology
RDBMS

MongoDB

Database

➜ Database

Table

➜ Collection

Row

➜ Document

Index

➜ Index

Join

➜ Embedding & Linking
Working with Documents
What is a Document?
	
  
{	
  
	
  	
  	
  	
  _id:	
  “123”,	
  
	
  	
  	
  	
  title:	
  "MongoDB:	
  The	
  Definitive	
  Guide",	
  
	
  	
  	
  	
  authors:	
  [	
  
	
  	
  	
  	
  	
  	
  	
  {	
  _id:	
  "kchodorow",	
  name:	
  "Kristina	
  Chodorow“	
  },	
  
	
  	
  	
  	
  	
  	
  	
  {	
  _id:	
  "mdirold",	
  name:	
  “Mike	
  Dirolf“	
  }	
  
	
  	
  	
  	
  ],	
  
	
  	
  	
  	
  published_date:	
  ISODate("2010-­‐09-­‐24"),	
  
	
  	
  	
  	
  pages:	
  216,	
  
	
  	
  	
  	
  language:	
  "English",	
  
	
  	
  	
  	
  publisher:	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  name:	
  "O’Reilly	
  Media",	
  
	
  	
  	
  	
  	
  	
  	
  	
  founded:	
  "1980",	
  
	
  	
  	
  	
  	
  	
  	
  	
  location:	
  "CA"	
  
	
  	
  	
  	
  }	
  
}	
  
Traditional Schema Design

Focus on Data Storage
Document Schema Design

Focus on Data Usage
Traditional Schema Design

What answers do I have?
Document Schema Design

What questions do I have?
Schema Design By Example
Library Management Application
•  Patrons/Users
•  Books
•  Authors
•  Publishers
Question:

What is a Patron’s Address?
A Patron and their Address
>	
  patron	
  =	
  db.patrons.find({	
  _id	
  :	
  “joe”	
  })	
  
{	
  
	
  	
  	
  	
  _id:	
  "joe“,	
  
	
  	
  	
  	
  name:	
  "Joe	
  Bookreader”	
  
}	
  
	
  
>	
  address	
  =	
  db.addresses.find({	
  _id	
  :	
  “joe”	
  })	
  
{	
  
	
  	
  	
  	
  _id:	
  "joe“,	
  
	
  	
  	
  	
  street:	
  "123	
  Fake	
  St.	
  ",	
  
	
  	
  	
  	
  city:	
  "Faketon",	
  
	
  	
  	
  	
  state:	
  "MA",	
  
	
  	
  	
  	
  zip:	
  12345	
  
}	
  
	
  
A Patron and their Address
>	
  patron	
  =	
  db.patrons.find({	
  _id	
  :	
  “joe”	
  })	
  
{	
  
	
  	
  	
  	
  _id:	
  "joe",	
  
	
  	
  	
  	
  name:	
  "Joe	
  Bookreader",	
  
	
  	
  	
  	
  address:	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  street:	
  "123	
  Fake	
  St.	
  ",	
  
	
  	
  	
  	
  	
  	
  	
  	
  city:	
  "Faketon",	
  
	
  	
  	
  	
  	
  	
  	
  	
  state:	
  "MA",	
  
	
  	
  	
  	
  	
  	
  	
  	
  zip:	
  12345	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
One-to-One Relationships
•  “Belongs to” relationships are often embedded.
•  Holistic representation of entities with their

embedded attributes and relationships.
•  Optimized for read performance
Question:

What are a Patron’s
Addresses?
A Patron and their Addresses
> patron = db.patrons.find({ _id : “bob” })
{
_id: “bob",
name: “Bob Knowitall",
addresses: [
{street: "1 Vernon St.", city: "Newton", …},
{street: "52 Main St.", city: "Boston", …},
]
}
A Patron and their Addresses
> patron = db.patrons.find({ _id : “bob” })
{
_id: “bob",
name: “Bob Knowitall",
addresses: [
{street: "1 Vernon St.", city: "Newton", …},
{street: "52 Main St.", city: "Boston", …},
]
}
> patron = db.patrons.find({ _id : “joe” })
{
_id: "joe",
name: "Joe Bookreader",
address: { street: "123 Fake St. ", city: "Faketon", …}
}
Migration Possibilities
•  Migrate all documents when the schema changes.
•  Migrate On-Demand
–  As we pull up a patron’s document, we make the change.
–  Any patrons that never come into the library never get
updated.
•  Leave it alone
–  As long as the application knows about both types…
Question:

Who is the publisher of this
book?
Book
MongoDB: The Definitive Guide,
By Kristina Chodorow and Mike Dirolf
Published: 9/24/2010
Pages: 216
Language: English

Publisher: O’Reilly Media, CA
Book with embedded Publisher
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
authors: [ "Kristina Chodorow", "Mike Dirolf" ],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English",
publisher: {
name: "O’Reilly Media",
founded: "1980",
location: "CA"
}
}
Book with embedded Publisher
•  Optimized for read performance of Books
•  Other queries become difficult
Question:

Who are all the publishers
in the system?
All Publishers
> publishers = db.publishers.find()
{
_id: “oreilly”,
name: "O’Reilly Media",
founded: "1980",
location: "CA"
}
{
_id: “penguin”,
name: “Penguin”,
founded: “1983”,
location: “CA”
}
Book with linked Publisher
> book = db.books.find({ _id: “123” })
{
_id: “123”,
publisher_id: “oreilly”,
title: "MongoDB: The Definitive Guide",
authors: [ "Kristina Chodorow", "Mike Dirolf" ],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English"
}
> db.publishers.find({ _id : book.publisher_id })
{
_id: “oreilly”,
name: "O’Reilly Media",
founded: "1980",
location: "CA"
}
Question:

What are all the books a
publisher has published?
Publisher with linked Books
> publisher = db.publishers.find({ _id : “oreilly” })
{
_id: “oreilly”,
name: "O’Reilly Media",
founded: "1980",
location: "CA“,
books: [“123”,…]
}

> books = db.books.find({ _id: { $in : publisher.books } })
Question:

Who are the authors of a
given book?
Books with linked Authors
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English“,
authors: [“kchodorow”, “mdirolf”]
}
> authors = db.authors.find({ _id : { $in : book.authors } })
{ _id: "kchodorow", name: "Kristina Chodorow”, hometown: … }
{ _id: “mdirolf", name: “Mike Dirolf“, hometown: … }
Books with linked Authors
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English“,
authors = [
{ id: "kchodorow", name: "Kristina Chodorow” },
{ id: "mdirolf", name: "Mike Dirolf” }
]
}
Question:

What are all the books an
author has written?
Authors with linked Books
> authors = db.authors.find({ _id : “kchodorow” })
{
_id: "kchodorow",
name: "Kristina Chodorow",
hometown: "Cincinnati",
books: [ {id: “123”, title : "MongoDB: The Definitive Guide“ } ]
}
Links on both Authors and Books
> authors = db.authors.find({ _id : “kchodorow” })
{
_id: "kchodorow",
name: "Kristina Chodorow",
hometown: "Cincinnati",
books: [ {id: “123”, title : "MongoDB: The Definitive Guide“ } ]
}
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
authors = [
{ id: "kchodorow", name: "Kristina Chodorow” },
{ id: "mdirolf", name: "Mike Dirolf” }
]
}
Linking vs. Embedding
•  Embedding
–  Great for read performance
–  Writes can be slow
–  Data integrity needs to be managed
•  Linking
–  Flexible
–  Data integrity is built-in
–  Work is done during reads
Question:

What are all the books
about databases?
Categories as Documents
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
category: “MongoDB”
}
> categories = db.categories.find({ _id: “MongoDB” })
{
_id: “MongoDB”,
parent: “Databases”
}
Categories as an Array
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
categories: [“MongoDB”, “Databases”, “Programming”]
}
> db.books.find({ categories: “Databases” })
Categories as a Path
> book = db.books.find({ _id : “123” })
{
_id: “123”,
title: "MongoDB: The Definitive Guide",
category: “Programming/Databases/MongoDB”
}
> db.books.find({ category: ^Programming/Databases/* })
Conclusion
•  Schema design is different in MongoDB
•  Basic data design principals stay the same
•  Focus on how an application accesses/manipulates

data
•  Evolve the schema to meet requirements as they

change
#MongoDBDays

Schema Design
Craig Wilson
Software Engineer, 10gen
@craiggwilson

More Related Content

PDF
Schema Design
PPTX
Schema Design
PPTX
Schema design mongo_boston
PPTX
Dev Jumpstart: Schema Design Best Practices
PPTX
Schema Design
PPT
MongoDB Schema Design
PDF
Schema Design
PPTX
Jumpstart: Schema Design
Schema Design
Schema Design
Schema design mongo_boston
Dev Jumpstart: Schema Design Best Practices
Schema Design
MongoDB Schema Design
Schema Design
Jumpstart: Schema Design

What's hot (19)

PDF
Mongo DB schema design patterns
PDF
Schema Design
KEY
Schema Design by Example ~ MongoSF 2012
PPTX
Schema Design
PPTX
Webinar: Schema Design
PDF
Schema & Design
PDF
Schema Design
PPTX
Schema Design
PPTX
Back to Basics 1: Thinking in documents
PDF
MongoDB Schema Design
PPTX
Webinar: Schema Design
PPTX
MongoDB Schema Design: Four Real-World Examples
PPTX
MongoDB San Francisco 2013: Schema design presented by Jason Zucchetto, Consu...
PDF
Agile Schema Design: An introduction to MongoDB
PPT
Building web applications with mongo db presentation
PPTX
Building Your First App with MongoDB
KEY
Schema Design with MongoDB
PPTX
Webinar: Back to Basics: Thinking in Documents
PPTX
Data Modeling for the Real World
Mongo DB schema design patterns
Schema Design
Schema Design by Example ~ MongoSF 2012
Schema Design
Webinar: Schema Design
Schema & Design
Schema Design
Schema Design
Back to Basics 1: Thinking in documents
MongoDB Schema Design
Webinar: Schema Design
MongoDB Schema Design: Four Real-World Examples
MongoDB San Francisco 2013: Schema design presented by Jason Zucchetto, Consu...
Agile Schema Design: An introduction to MongoDB
Building web applications with mongo db presentation
Building Your First App with MongoDB
Schema Design with MongoDB
Webinar: Back to Basics: Thinking in Documents
Data Modeling for the Real World
Ad

Similar to Schema Design (20)

PDF
MongoDB Schema Design
PDF
Schema Design
PDF
Schema Design
PDF
Schema Design in MongoDB - TriMug Meetup North Carolina
PPTX
Schema Design
PDF
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
PDF
The Fine Art of Schema Design in MongoDB: Dos and Don'ts
KEY
Modeling Data in MongoDB
PPTX
lecture_34e.pptx
PDF
Building your first app with mongo db
PDF
Building Your First App: An Introduction to MongoDB
PPTX
Modeling JSON data for NoSQL document databases
PPT
Building Your First App with MongoDB
PDF
MongoDB and Schema Design
PPTX
Schema Design
KEY
Schema Design
PPTX
Conceptos básicos. seminario web 3 : Diseño de esquema pensado para documentos
PDF
buildyourfirstmongodbappberlin2013thomas-130313104259-phpapp02.pdf
PPTX
Webinar: General Technical Overview of MongoDB for Dev Teams
MongoDB Schema Design
Schema Design
Schema Design
Schema Design in MongoDB - TriMug Meetup North Carolina
Schema Design
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
The Fine Art of Schema Design in MongoDB: Dos and Don'ts
Modeling Data in MongoDB
lecture_34e.pptx
Building your first app with mongo db
Building Your First App: An Introduction to MongoDB
Modeling JSON data for NoSQL document databases
Building Your First App with MongoDB
MongoDB and Schema Design
Schema Design
Schema Design
Conceptos básicos. seminario web 3 : Diseño de esquema pensado para documentos
buildyourfirstmongodbappberlin2013thomas-130313104259-phpapp02.pdf
Webinar: General Technical Overview of MongoDB for Dev Teams
Ad

More from MongoDB (20)

PDF
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
PDF
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
PDF
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
PDF
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
PDF
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
PDF
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
PDF
MongoDB SoCal 2020: MongoDB Atlas Jump Start
PDF
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
PDF
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
PDF
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
PDF
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
PDF
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
PDF
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
PDF
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
PDF
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
PDF
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
PDF
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
PDF
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
PDF
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
PDF
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...

Recently uploaded (20)

PPTX
Belch_12e_PPT_Ch18_Accessible_university.pptx
PPTX
Amazon (Business Studies) management studies
DOCX
unit 1 COST ACCOUNTING AND COST SHEET
PDF
Training And Development of Employee .pdf
PPT
340036916-American-Literature-Literary-Period-Overview.ppt
PDF
kom-180-proposal-for-a-directive-amending-directive-2014-45-eu-and-directive-...
PDF
DOC-20250806-WA0002._20250806_112011_0000.pdf
PPTX
Business Ethics - An introduction and its overview.pptx
PDF
Power and position in leadershipDOC-20250808-WA0011..pdf
PPTX
Probability Distribution, binomial distribution, poisson distribution
PDF
Ôn tập tiếng anh trong kinh doanh nâng cao
PDF
BsN 7th Sem Course GridNNNNNNNN CCN.pdf
PPT
Chapter four Project-Preparation material
DOCX
Business Management - unit 1 and 2
PDF
pdfcoffee.com-opt-b1plus-sb-answers.pdfvi
PPTX
HR Introduction Slide (1).pptx on hr intro
PPTX
New Microsoft PowerPoint Presentation - Copy.pptx
PDF
SIMNET Inc – 2023’s Most Trusted IT Services & Solution Provider
PPT
Data mining for business intelligence ch04 sharda
PDF
Elevate Cleaning Efficiency Using Tallfly Hair Remover Roller Factory Expertise
Belch_12e_PPT_Ch18_Accessible_university.pptx
Amazon (Business Studies) management studies
unit 1 COST ACCOUNTING AND COST SHEET
Training And Development of Employee .pdf
340036916-American-Literature-Literary-Period-Overview.ppt
kom-180-proposal-for-a-directive-amending-directive-2014-45-eu-and-directive-...
DOC-20250806-WA0002._20250806_112011_0000.pdf
Business Ethics - An introduction and its overview.pptx
Power and position in leadershipDOC-20250808-WA0011..pdf
Probability Distribution, binomial distribution, poisson distribution
Ôn tập tiếng anh trong kinh doanh nâng cao
BsN 7th Sem Course GridNNNNNNNN CCN.pdf
Chapter four Project-Preparation material
Business Management - unit 1 and 2
pdfcoffee.com-opt-b1plus-sb-answers.pdfvi
HR Introduction Slide (1).pptx on hr intro
New Microsoft PowerPoint Presentation - Copy.pptx
SIMNET Inc – 2023’s Most Trusted IT Services & Solution Provider
Data mining for business intelligence ch04 sharda
Elevate Cleaning Efficiency Using Tallfly Hair Remover Roller Factory Expertise

Schema Design

  • 1. #MongoDBDays Schema Design Craig Wilson Software Engineer, MongoDB @craiggwilson
  • 2. All application development is Schema Design
  • 3. Success comes from a Proper Data Structure
  • 4. Terminology RDBMS MongoDB Database ➜ Database Table ➜ Collection Row ➜ Document Index ➜ Index Join ➜ Embedding & Linking
  • 6. What is a Document?   {          _id:  “123”,          title:  "MongoDB:  The  Definitive  Guide",          authors:  [                {  _id:  "kchodorow",  name:  "Kristina  Chodorow“  },                {  _id:  "mdirold",  name:  “Mike  Dirolf“  }          ],          published_date:  ISODate("2010-­‐09-­‐24"),          pages:  216,          language:  "English",          publisher:  {                  name:  "O’Reilly  Media",                  founded:  "1980",                  location:  "CA"          }   }  
  • 9. Traditional Schema Design What answers do I have?
  • 10. Document Schema Design What questions do I have?
  • 11. Schema Design By Example
  • 12. Library Management Application •  Patrons/Users •  Books •  Authors •  Publishers
  • 13. Question: What is a Patron’s Address?
  • 14. A Patron and their Address >  patron  =  db.patrons.find({  _id  :  “joe”  })   {          _id:  "joe“,          name:  "Joe  Bookreader”   }     >  address  =  db.addresses.find({  _id  :  “joe”  })   {          _id:  "joe“,          street:  "123  Fake  St.  ",          city:  "Faketon",          state:  "MA",          zip:  12345   }    
  • 15. A Patron and their Address >  patron  =  db.patrons.find({  _id  :  “joe”  })   {          _id:  "joe",          name:  "Joe  Bookreader",          address:  {                  street:  "123  Fake  St.  ",                  city:  "Faketon",                  state:  "MA",                  zip:  12345          }   }    
  • 16. One-to-One Relationships •  “Belongs to” relationships are often embedded. •  Holistic representation of entities with their embedded attributes and relationships. •  Optimized for read performance
  • 17. Question: What are a Patron’s Addresses?
  • 18. A Patron and their Addresses > patron = db.patrons.find({ _id : “bob” }) { _id: “bob", name: “Bob Knowitall", addresses: [ {street: "1 Vernon St.", city: "Newton", …}, {street: "52 Main St.", city: "Boston", …}, ] }
  • 19. A Patron and their Addresses > patron = db.patrons.find({ _id : “bob” }) { _id: “bob", name: “Bob Knowitall", addresses: [ {street: "1 Vernon St.", city: "Newton", …}, {street: "52 Main St.", city: "Boston", …}, ] } > patron = db.patrons.find({ _id : “joe” }) { _id: "joe", name: "Joe Bookreader", address: { street: "123 Fake St. ", city: "Faketon", …} }
  • 20. Migration Possibilities •  Migrate all documents when the schema changes. •  Migrate On-Demand –  As we pull up a patron’s document, we make the change. –  Any patrons that never come into the library never get updated. •  Leave it alone –  As long as the application knows about both types…
  • 21. Question: Who is the publisher of this book?
  • 22. Book MongoDB: The Definitive Guide, By Kristina Chodorow and Mike Dirolf Published: 9/24/2010 Pages: 216 Language: English Publisher: O’Reilly Media, CA
  • 23. Book with embedded Publisher > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", publisher: { name: "O’Reilly Media", founded: "1980", location: "CA" } }
  • 24. Book with embedded Publisher •  Optimized for read performance of Books •  Other queries become difficult
  • 25. Question: Who are all the publishers in the system?
  • 26. All Publishers > publishers = db.publishers.find() { _id: “oreilly”, name: "O’Reilly Media", founded: "1980", location: "CA" } { _id: “penguin”, name: “Penguin”, founded: “1983”, location: “CA” }
  • 27. Book with linked Publisher > book = db.books.find({ _id: “123” }) { _id: “123”, publisher_id: “oreilly”, title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English" } > db.publishers.find({ _id : book.publisher_id }) { _id: “oreilly”, name: "O’Reilly Media", founded: "1980", location: "CA" }
  • 28. Question: What are all the books a publisher has published?
  • 29. Publisher with linked Books > publisher = db.publishers.find({ _id : “oreilly” }) { _id: “oreilly”, name: "O’Reilly Media", founded: "1980", location: "CA“, books: [“123”,…] } > books = db.books.find({ _id: { $in : publisher.books } })
  • 30. Question: Who are the authors of a given book?
  • 31. Books with linked Authors > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", published_date: ISODate("2010-09-24"), pages: 216, language: "English“, authors: [“kchodorow”, “mdirolf”] } > authors = db.authors.find({ _id : { $in : book.authors } }) { _id: "kchodorow", name: "Kristina Chodorow”, hometown: … } { _id: “mdirolf", name: “Mike Dirolf“, hometown: … }
  • 32. Books with linked Authors > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", published_date: ISODate("2010-09-24"), pages: 216, language: "English“, authors = [ { id: "kchodorow", name: "Kristina Chodorow” }, { id: "mdirolf", name: "Mike Dirolf” } ] }
  • 33. Question: What are all the books an author has written?
  • 34. Authors with linked Books > authors = db.authors.find({ _id : “kchodorow” }) { _id: "kchodorow", name: "Kristina Chodorow", hometown: "Cincinnati", books: [ {id: “123”, title : "MongoDB: The Definitive Guide“ } ] }
  • 35. Links on both Authors and Books > authors = db.authors.find({ _id : “kchodorow” }) { _id: "kchodorow", name: "Kristina Chodorow", hometown: "Cincinnati", books: [ {id: “123”, title : "MongoDB: The Definitive Guide“ } ] } > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", authors = [ { id: "kchodorow", name: "Kristina Chodorow” }, { id: "mdirolf", name: "Mike Dirolf” } ] }
  • 36. Linking vs. Embedding •  Embedding –  Great for read performance –  Writes can be slow –  Data integrity needs to be managed •  Linking –  Flexible –  Data integrity is built-in –  Work is done during reads
  • 37. Question: What are all the books about databases?
  • 38. Categories as Documents > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", category: “MongoDB” } > categories = db.categories.find({ _id: “MongoDB” }) { _id: “MongoDB”, parent: “Databases” }
  • 39. Categories as an Array > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", categories: [“MongoDB”, “Databases”, “Programming”] } > db.books.find({ categories: “Databases” })
  • 40. Categories as a Path > book = db.books.find({ _id : “123” }) { _id: “123”, title: "MongoDB: The Definitive Guide", category: “Programming/Databases/MongoDB” } > db.books.find({ category: ^Programming/Databases/* })
  • 41. Conclusion •  Schema design is different in MongoDB •  Basic data design principals stay the same •  Focus on how an application accesses/manipulates data •  Evolve the schema to meet requirements as they change
  • 42. #MongoDBDays Schema Design Craig Wilson Software Engineer, 10gen @craiggwilson