Schema Design

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
962
On Slideshare
670
From Embeds
292
Number of Embeds
7

Actions

Shares
Downloads
26
Comments
0
Likes
2

Embeds 292

http://www.10gen.com 261
http://www.mongodb.com 23
http://drupal1.10gen.cc 3
https://www.mongodb.com 2
http://en.wordpress.com 1
http://10gen.localhost 1
https://www.linkedin.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. MongoDB Miami February 7, 2013Schema DesignJeremy MikolaSoftware Engineer, 10gen
  • 2. Agenda•  Working with documents•  Evolving a Schema•  Queries and Indexes•  Common Patterns Single Table En
  • 3. RDBMS MongoDBDatabase ➜ DatabaseTable ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded DocumentForeign Key ➜ ReferenceTerminology
  • 4. Working with Documents
  • 5. MO N XRays Checkups AllergiesModeling Data
  • 6. DocumentsProvide flexibility andperformance
  • 7. Category ·Name ·URL Article Tag User ·Name ·Name ·Slug ·Name ·Email address ·Publish date ·URL ·Text Comment ·Comment ·Date ·AuthorNormalized Data
  • 8. Article ·Name ·Slug ·Publish date ·Text ·Author User ·Name Comment[] ·Comment ·Email address ·Date ·Author Tag[] ·Value Category[] ·ValueDe-Normalized (embedded) Data
  • 9. Relational Schema DesignFocus on data storage
  • 10. Document Schema DesignFocus on data use
  • 11. Schema Design Considerations•  How do we manipulate the data? –  Dynamic Ad-Hoc Queries –  Atomic Updates –  Map Reduce•  What are the access patterns of the application? –  Read/Write Ratio –  Types of Queries / Updates –  Data life-cycle and growth rate
  • 12. Data Manipulation•  Query Selectors –  Scalar: $ne, $mod, $exists, $type, $lt, $lte, $gt, $gte –  Vector: $in, $nin, $all, $size•  Atomic Update Operators –  Scalar: $inc, $set, $unset –  Vector: $push, $pop, $pull, $pushAll, $pullAll, $addToSet
  • 13. Data Access•  Flexible Schemas•  Ability to embed complex data structures•  Secondary Indexes•  Multi-Key Indexes•  Aggregation Framework –  $project, $match, $limit, $skip, $sort, $group, $unwind•  No Joins
  • 14. Getting Started
  • 15. Library Management Application•  Patrons•  Books•  Authors•  Publishers
  • 16. An ExampleOne to One Relations
  • 17. Modeling Patrons patron = {patron = { _id: "joe", _id: "joe", name: "Joe Bookreader", address: { name: "Joe Bookreader” street: "123 Fake St. ",} city: "Faketon", state: "MA",address = { zip: 12345 patron_id = "joe", } street: "123 Fake St. ", } city: "Faketon", state: "MA", zip: 12345}
  • 18. One to One Relations•  Mostly the same as the relational approach•  Generally good idea to embed “contains” relationships•  Document model provides a holistic representation of objects
  • 19. An ExampleOne To Many Relations
  • 20. Modeling Patronspatron = { _id: "joe", name: "Joe Bookreader", join_date: ISODate("2011-10-15"), addresses: [ {street: "1 Vernon St.", city: "Newton", state: "MA", …}, {street: "52 Main St.", city: "Boston", state: "MA", …} ]}
  • 21. Publishers and Books•  Publishers put out many books•  Books have one publisher
  • 22. BookMongoDB: The Definitive Guide,By Kristina Chodorow and Mike DirolfPublished: 9/24/2010Pages: 216Language: EnglishPublisher: O’Reilly Media, CA
  • 23. Modeling Books – EmbeddedPublisherbook = { 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. Modeling Books & PublisherRelationshippublisher = { name: "O’Reilly Media", founded: "1980", location: "CA"}book = { title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English"}
  • 25. Publisher _id as a Foreign Keypublisher = { _id: "oreilly", name: "O’Reilly Media", founded: "1980", location: "CA"}book = { title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", publisher_id: "oreilly"}
  • 26. Book _id as a Foreign Keypublisher = { name: "O’Reilly Media", founded: "1980", location: "CA" books: [ "123456789", ... ]}book = { _id: "123456789", title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English"}
  • 27. Where Do You Put the Foreign Key?•  Array of books inside of publisher –  Makes sense when many means a handful of items –  Useful when items have bound on potential growth•  Reference to single publisher on books –  Useful when items have unbounded growth (unlimited # of books)•  SQL doesn’t give you a choice, no arrays
  • 28. Another ExampleOne to Many Relations
  • 29. Books and Patrons•  Book can be checked out by one Patron at a time•  Patrons can check out many books (but not 1000’s)
  • 30. Modeling Checkoutspatron = { _id: "joe", name: "Joe Bookreader", join_date: ISODate("2011-10-15"), address: { ... }}book = { _id: "123456789", title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], ...}
  • 31. Modeling Checkoutspatron = { _id: "joe", name: "Joe Bookreader", join_date: ISODate("2011-10-15"), address: { ... }, checked_out: [ { _id: "123456789", checked_out: "2012-10-15" }, { _id: "987654321", checked_out: "2012-09-12" }, ... ]}
  • 32. DenormalizationProvides data locality De-normalize for speed
  • 33. Modeling Checkouts: Denormalizedpatron = { _id: "joe", name: "Joe Bookreader", join_date: ISODate("2011-10-15"), address: { ... }, checked_out: [ { _id: "123456789", title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], checked_out: ISODate("2012-10-15") }, { _id: "987654321" title: "MongoDB: The Scaling Adventure", ... }, ... ]}
  • 34. Referencing vs. Embedding•  Embedding is a bit like pre-joined data•  Document-level ops are easy for server to handle•  Embed when the many objects always appear with (i.e. viewed in the context of) their parent•  Reference when you need more flexibility
  • 35. An ExampleSingle Table Inheritance
  • 36. Single Table Inheritancebook = { title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), kind: "loanable", locations: [ ... ], pages: 216, language: "English", publisher: { name: "O’Reilly Media", founded: "1980", location: "CA" }}
  • 37. An ExampleMany to Many Relations
  • 38. Category ·Name ·URL Article Tag User ·Name ·Name ·Slug ·Name ·Email address ·Publish date ·URL ·Text Comment ·Comment ·Date ·AuthorRelational Approach
  • 39. Books and Authorsbook = { title: "MongoDB: The Definitive Guide", authors = [ { _id: "kchodorow", name: "K-Awesome" }, { _id: "mdirolf", name: "Batman Mike" }, ] published_date: ISODate("2010-09-24"), pages: 216, language: "English"}author = { _id: "kchodorow", name: "Kristina Chodorow", hometown: "New York"}
  • 40. Relation stored on both sidesbook = { _id: 123456789, title: "MongoDB: The Definitive Guide", authors = [ "kchodorow", "mdirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English"}author = { _id: "kchodorow", name: "Kristina Chodorow", hometown: "Cincinnati", books: [ 123456789, ... ]}
  • 41. An ExampleTrees
  • 42. Parent Linksbook = { title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", category: "MongoDB"}category = { _id: MongoDB, parent: "Databases" }category = { _id: Databases, parent: "Programming" }
  • 43. Child Linksbook = { _id: 123456789, title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English"}category = { _id: MongoDB, children: [ 123456789, … ] }category = { _id: Databases, children: ["MongoDB", "Postgres"}category = { _id: Programming, children: ["DB", "Languages"] }
  • 44. Modeling Trees•  Parent Links - Each node is stored as a document - Contains the id of the parent•  Child Links - Each node contains the id’s of the children - Can support graphs (multiple parents / child)
  • 45. Array of Ancestorsbook = { title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", categories: ["Programming", "Databases", "MongoDB” ]}book = { title: "MySQL: The Definitive Guide", authors: [ "Michael Kofler" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", parent: "MongoDB", ancestors: [ "Programming", "Databases", "MongoDB"]}
  • 46. An ExampleQueues
  • 47. Book Documentbook = { _id: 123456789, title: "MongoDB: The Definitive Guide", authors: [ "Kristina Chodorow", "Mike Dirolf" ], published_date: ISODate("2010-09-24"), pages: 216, language: "English", available: 3}db.books.findAndModify({ query: { _id: 123456789, available: { "$gt": 0 } }, update: { $inc: { available: -1 } }})
  • 48. MongoDB Miami, February 7, 2013Thank YouJeremy MikolaSoftware Engineer, 10gen