principlesqlModerate
MongoDB Manual References vs DBREF
Viewed 0 times
referencesmongodbmanualdbref
Problem
I've been researching MongoDB and trying to see if it would be a fit for my company's product catalog.
I came across database references: http://docs.mongodb.org/manual/reference/database-references/ and had some questions about how exactly to link documents together.
Assume we have two
I have a "category" field in
Do I need to use DBREFs?
Below is a brief example of my data...
Document in
Document in
Any help, suggestions and advice is welcome and greatly appreciated.
Darius
I came across database references: http://docs.mongodb.org/manual/reference/database-references/ and had some questions about how exactly to link documents together.
Assume we have two
db.categories and db.products collections... I have documents in db.products that need to link to their categories in db.categories. I have a "category" field in
db.products that I will store the objectID of the category document in. However, I do not see a way to specify that this objectID references the db.categories collection. Do I need to use DBREFs?
Below is a brief example of my data...
Document in
db.categories:{
"_id" : ObjectId("546b72a47ea1d03593000158"),
"name" : "Category1",
"type" : "type1 of category1",
"spec_columns" : [
{
"field" : "capacity",
"display" : "Capacity (tons)"
},
{
"field" : "weight",
"display" : "Weight (lbs)"
}
]
}Document in
db.products:{
"_id" : ObjectId("546a575f7ea1d03593000154"),
"model" : "NER003H",
"category" : ObjectId("546b72a47ea1d03593000158"),
"capacity" : "1/2",
"weight" : 10
}Any help, suggestions and advice is welcome and greatly appreciated.
Darius
Solution
Short version: use a manual reference, not a
Explanation:
There is no particular benefit to the use of a
If that were not the case, let's say you had references to documents in a slew of databases and collections and it was difficult or cumbersome application side to keep track of which one each document resided in, then it may be a benefit to use
That (referencing multiple collections from a single source collection) is not a terribly common pattern though and not what you have outlined above, and so unless you have such a compelling reason to use them, manual references are recommended instead.
Some of the drivers have helper methods which may save a few lines of code versus a manual reference, but not all drivers do, and it may make the code harder to understand (without some nice comments/documentation to explain it). As well as that, the DBREF approach is more fixed than a manual implementation - what if you want to reference a field other than
Finally, in terms of product catalog design, I would highly recommend reading these two excellent and detailed blog posts from Antoine Girbal:
There were also three presentations given at MongoDB World 2014 on this very topic, so I would recommend reviewing those also as you progress:
Catalog
Recommendations, Personalization)
DBRef.Explanation:
There is no particular benefit to the use of a
DBRef beyond giving you the collection and database that the referenced document resides in. If you know the reference is only between categories and products, then that is not particularly useful. A DBRef simply contains the _id of the referenced document, the collection name and optionally the database name. You will usually have all that information in your application (i.e. you have the _id and you know that db/collection it resides in already). If that were not the case, let's say you had references to documents in a slew of databases and collections and it was difficult or cumbersome application side to keep track of which one each document resided in, then it may be a benefit to use
DBRefs. After all, the easiest way to do a manual reference in that case would be to store the database and collection that you are referencing in the document too, and that is what DBRefs do for you in any case. That (referencing multiple collections from a single source collection) is not a terribly common pattern though and not what you have outlined above, and so unless you have such a compelling reason to use them, manual references are recommended instead.
Some of the drivers have helper methods which may save a few lines of code versus a manual reference, but not all drivers do, and it may make the code harder to understand (without some nice comments/documentation to explain it). As well as that, the DBREF approach is more fixed than a manual implementation - what if you want to reference a field other than
_id for example.Finally, in terms of product catalog design, I would highly recommend reading these two excellent and detailed blog posts from Antoine Girbal:
- Part 1 - Schema Design
- Part 2 - Product Search
There were also three presentations given at MongoDB World 2014 on this very topic, so I would recommend reviewing those also as you progress:
- Presentation 1: Flexible, Searchable, Low Latency Product
Catalog
- Presentation 2: Real-time, Geo-Distributed Inventory
- Presentation 3: Scalable Insight Component (User History,
Recommendations, Personalization)
Context
StackExchange Database Administrators Q#82970, answer score: 14
Revisions (0)
No revisions yet.