Schema Design

1,685 views

Published on

Published in: Business, Education
1 Comment
10 Likes
Statistics
Notes
No Downloads
Views
Total views
1,685
On SlideShare
0
From Embeds
0
Number of Embeds
726
Actions
Shares
0
Downloads
64
Comments
1
Likes
10
Embeds 0
No embeds

No notes for slide

Schema Design

  1. 1. Schema Design Software Engineer, MongoDB Jeremy Mikola #MongoDB
  2. 2. Agenda •  Working with documents •  Evolving a Schema •  Queries and Indexes •  Common Patterns
  3. 3. TerminologyRDBMS MongoDB Database ➜ Database Table ➜ Collection Row ➜ Document Index ➜ Index Join ➜ Embedded Document Foreign Key ➜ Reference
  4. 4. Working with Documents
  5. 5. Modeling Data M O N XRays Checkups Allergies
  6. 6. Documents Provide flexibility and performance
  7. 7. User ·Name ·Email address Category ·Name ·URL Comment ·Comment ·Date ·Author Article ·Name ·Slug ·Publish date ·Text Tag ·Name ·URL Normalized Data
  8. 8. User ·Name ·Email address Article ·Name ·Slug ·Publish date ·Text ·Author Comment[] ·Comment ·Date ·Author Tag[] ·Value Category[] ·Value De-Normalized (embedded) Data
  9. 9. Relational Schema Design Focus on data storage
  10. 10. Document Schema Design Focus on data use
  11. 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. 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. 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. 14. Getting Started
  15. 15. Library Management Application Patrons Books Authors Publishers
  16. 16. An Example One to One Relations
  17. 17. patron = { _id: "joe", name: "Joe Bookreader” } address = { patron_id = "joe", street: "123 Fake St. ", city: "Faketon", state: "MA", zip: 12345 } Modeling Patrons patron = { _id: "joe", name: "Joe Bookreader", address: { street: "123 Fake St.", city: "Faketon", state: "MA", zip: 12345 } }
  18. 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. 19. An Example One To Many Relations
  20. 20. patron = { _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", …} ] } Modeling Patrons
  21. 21. Publishers and Books •  Publishers put out many books •  Books have one publisher
  22. 22. MongoDB: The Definitive Guide, By Kristina Chodorow and Mike Dirolf Published: 9/24/2010 Pages: 216 Language: English Publisher: O’Reilly Media, CA Book
  23. 23. book = { 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" } } Modeling Books – Embedded Publisher
  24. 24. publisher = { 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" } Modeling Books & Publisher Relationship
  25. 25. publisher = { _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" } Publisher _id as a Foreign Key
  26. 26. publisher = { 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" } Book _id as a Foreign Key
  27. 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. 28. Another Example One to Many Relations
  29. 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. 30. patron = { _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" ], ... } Modeling Checkouts
  31. 31. patron = { _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" }, ... ] } Modeling Checkouts
  32. 32. Denormalization Provides data locality
  33. 33. patron = { _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", ... }, ... ] } Modeling Checkouts: Denormalized
  34. 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. 35. An Example Single Table Inheritance
  36. 36. book = { 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" } } Single Table Inheritance
  37. 37. An Example Many to Many Relations
  38. 38. Category Name URL Article Name Slug Publish date Text User Name Email address Tag Name URL Comment Comment Date Author Relational Approach
  39. 39. book = { 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" } Books and Authors
  40. 40. book = { _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, ... ] } Relation stored on both sides
  41. 41. An Example Trees
  42. 42. book = { 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" } Parent Links
  43. 43. book = { _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"] } Child Links
  44. 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. 45. book = { 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"] } Array of Ancestors
  46. 46. An Example Queues
  47. 47. book = { _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 } } }) Book Document
  48. 48. Thank You Software Engineer, MongoDB Jeremy Mikola #MongoDB

×