Let's say I am building a discussion forum using Node.js, and mongoose. A user can have multiple forums, and a forum can have multiple comments. A user can also invite other users to join a forum too. Thus, my question is about the model design either using reference or embedded document !
If I go with embedded document, It would look like:
var Comment = new Schema({ ... });
var Forum = new Schema({
title: {type: String},
content: {type: String},
comments: [Comment],
attendees: [User]
});
var User = new Schema({
name: {type: String},
email: {type: String},
forums: [Forum]
});
var Account = mongoose.model('Account', User);
Using the above design, I struggled with: when a user adds a comment to a forum, and that forum is in my forums, I don't think I would be able to get update of a new comment in my forum list. Do I ? Do you know how to get the embedded document to work in this case?
Thus, I was thinking of using reference in mongoose. In this case, I will have two collections: Account, and Forum. Adding a new comment to a forum is not a problem in this case. Am I right?
Would reference be better than embedded document for this app?
Thanks in advance,
It depends mostly on how you're gonna query and update your data. Consistency and document size is also important in this case. Here's a good summary on when referencing or embedding documents:
Embedding:
- Small subdocuments
- Data that does not change regularly
- Eventual consistency is acceptable
- Document that grow by a small amout
- Data that you will often need to perform a second query to fetch
- Fast reads
Referencing:
- Large subdocuments
- Volatile data
- Immediate consistency is necessary
- Document that grow a large amount
- Data that you will often exclude from results
- Fast writes
This is an exctract from a book on mongo I read. These are just general rules but from my experience, using them makes it very clear wether to reference or embed most of the times.
I would rather reference Forum in this case. But please consider all your requirements. For example if you reference Forum from User and you need to query all User of a particular Forum the query might be slow in this case. If I were you I would compose a list of everything I need and then using general rules would find a balance between pros and cons of embeding and referencing.
Hope it helps!
Personally I like to do references in situations like yours. In this way I can get a comment from a user, a user from a forum, a forum from a comment, a forum from a user, etc. without worrying about doing complicated embedded document queries. I don't even bother storing embedded reference documents. If there is a one to many relationship between a forum and comments then I would store a forum reference on the comment and no comment reference on the forum because when you add/remove comments from the comments collection you then also have to go remove the embedded reference document from the comments collection on the forum.
I can query for a forum from a comment using the forum reference and I can get all comments for a forum by querying the comments collection for that forum reference (which is just an ID number until mongoose populates it behind the scenes for you).