00:01 We've come to a pretty exciting part in the course, 00:03 we're going to talk about document design 00:05 and modeling with document databases. 00:08 So let's take a step back and think about relational databases. 00:11 There is in fact a couple of really systematic, well known, 00:15 widely taught ways of modeling with relational databases; 00:20 there's still a bit of an art to it, but basically it comes down to 00:24 third normal form, first normal form, some of these well known ways 00:29 to take your data, break them apart, generate the relationships between them, 00:33 so if we're going to model like a bookstore with publishers 00:36 and users who buy books at the bookstore, 00:38 and they rate books at the bookstore, it might look like this— 00:41 we have a book, the book would have a publisher, 00:44 so there is a one to many relationship from publisher to books, 00:47 you can see the one on the star and the little relationship there, 00:50 and we have some flat properties like title and published 00:52 and publisher id for that relationship, and similarly, 00:55 we have a navigational relationship over to the ratings, 00:58 so a book is rated, so the ratings would have almost normalization table 01:03 or many to many table there has the book id and the user id 01:06 and then the value and we just happen to have a auto increment id there, 01:10 it's not necessarily the way we have to do it, 01:13 we could have a composite key, we've got our user 01:15 and the user can go navigate to the ratings, and things like that. 01:17 Now, of course, this is a very simplified model 01:20 in a real bookstore with real ecommerce happening and all that 01:23 and categories and pictures and all those things, 01:26 this would be way more complicated, 01:28 but the whole idea going forward is going to be pretty similar 01:30 and I think keeping it simple enough that you quickly understand the model 01:34 and don't get lost in the details, is the most important thing here. 01:37 So this more or less follows third normal form here. 01:40 in terms of how we're modeling this in the relational database. 01:44 Could we move this to MongoDB, could we move this to a document database— 01:47 sure, we could have exactly the structure. 01:50 Now those relationships, those are not full on foreign key constraints, 01:52 those would be loosely enforced, not enforced in the database 01:56 but enforced in the app relationships between the what would be collections; 02:00 but certainly, we could do this, is it the best way though? 02:03 The answer is usually not, maybe, but probably not. 02:07 So what we're going to focus on now is how do we take our traditional knowledge 02:12 of modeling databases and relational databases 02:14 and how does that change, what are the trade-offs we have to deal with 02:18 when we get to a document database. 02:20 So the good news is, usually things get simpler in document databases 02:24 in terms of the relationships, you might have 02:27 what would have been four or five separate tables with relationships, 02:31 it might get consumed into a single item, 02:34 a single collection or single document really, 02:36 so here this is how we're going to model our bookstore 02:40 that we just looked at in third normal form, but now in a document database. 02:43 And really, the right choice here comes down to 02:46 how is your app using this data, what type of questions do you usually ask, 02:50 what's the performance implications, things like this. 02:53 So now we have a books, we have a publisher and a user 02:56 and these have similar top level items, 02:58 and we do have some traditional relationships. 03:01 So there's a one to many relationship between publisher and books 03:05 theoretically we can embed the book into the publisher 03:08 but there's many, many books for some publishers 03:10 and that would be really a bad idea; 03:12 so we have this traditional relationship, like you might have in a relational database. 03:15 Now again, not enforced by Mongo, but enforced by your app, so same basic idea. 03:19 Next up, we have the ratings, remember we have that 03:22 like many to many table from users to book ratings, 03:26 now that has actually moved and now we're storing these items 03:30 in an embedded array of objects inside the book table, or the book collection. 03:35 So now each book has a ratings array, it has the number of ratings, 03:39 those are just put right in there, so is this the right design— maybe, 03:43 it's certainly a possible design, and it's the design that we're going to go with 03:47 for our examples, but we'll talk about when it's actually the right design. 03:51 And I'll help you make those trade-offs next.