Jul 12, 2015

MongoDB - Relationships

It's represent how several types of documents are logically related to each other. Relationship can be pattern via embedded and referenced approaches like  1:1, 1: N, N: 1 or N: N.

We will consider the example of storing addresses for users. Suppose one user can have multiple addresses making this a 1:N relationship.
Following is the sample document structure of user document:

{
   "_id":ObjectId("52mmm33cd85242f436000001"),
   "name": "Dilip",
   "contact": "987654321",
   "dob": "01-01-1991"
}


given below  is the sample document structure of address document:

{
   "_id":ObjectId("52ffc4a5d85242602e000054"),
   "building": "22 A",
   "pincode": 123456,
   "city": "Delhi",
   "state": "Delhi"
}


Modeling Embedded Relationships
In this approach, we will set the address document inside the user document.


{
   "_id":ObjectId("52mmm33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Dilip",
   "address": [
      {
         "building": "E-234",
         "pincode": 110096,
         "city": "Delhi",
         "state": "Delhi"
      },
      {
         "building": "A-24",
         "pincode": 203201,
         "city": "Noida",
         "state": "UP"
      }]
}


Embedded maintains all the related data in a single document which makes it easy to recover and maintain. The entirely document can be recovered in a single query like this:


>db.users.findOne({"name":"Dilip"},{"address":1})


Guys, please note down that in the above query, db and users are the database and collection respectively.
In this process if the embedded document keeps on growing too much in size, it will impact the read/write performance.

Modeling Referenced Relationships
It is main process of designing normalized relationship. In this relationships , both the user and address documents will be maintained separately but the user document will contain a field that will reference the address document's id field.


{
   "_id":ObjectId("52mmm33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Dilip",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000054"),
      ObjectId("52ffc4a5d85242602e000456")
   ]
}


As above, the user document contains the array field address_ids which contains ObjectIds of corresponding addresses.Using these ObjectIds, we can query the address documents and get address details from there. With this approach, we will need two queries: first to fetch the address_ids fields from user document and second to fetch these addresses from address collection.



>var result = db.users.findOne({"name":"Dilip"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})