Учебники

MongoDB — Отношения

Отношения в MongoDB представляют, как различные документы логически связаны друг с другом. Отношения могут быть смоделированы с помощью встроенного и ссылочного подходов. Такими отношениями могут быть 1: 1, 1: N, N: 1 или N: N.

Рассмотрим случай хранения адресов для пользователей. Таким образом, один пользователь может иметь несколько адресов, что делает это отношение 1: N.

Ниже приведен пример структуры документа пользовательского документа.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

Ниже приведен пример структуры документа адресного документа —

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
} 

Моделирование встроенных отношений

Во встроенном подходе мы будем встраивать адресный документ в пользовательский документ.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }
   ]
} 

При таком подходе все связанные данные хранятся в одном документе, что облегчает извлечение и обслуживание. Весь документ может быть получен в одном запросе, например:

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

Обратите внимание, что в приведенном выше запросе db и users являются базой данных и коллекцией соответственно.

Недостаток заключается в том, что если размер внедренного документа слишком велик, это может повлиять на производительность чтения / записи.

Моделирование ссылочных отношений

Это подход проектирования нормализованных отношений. При таком подходе документы пользователя и адреса будут храниться отдельно, но документ пользователя будет содержать поле, которое будет ссылаться на поле идентификатора документа адреса.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Как показано выше, пользовательский документ содержит поле массива address_ids, которое содержит ObjectIds соответствующих адресов. Используя эти ObjectIds, мы можем запросить адресные документы и получить оттуда подробную информацию об адресе. При таком подходе нам понадобятся два запроса: первый для извлечения полей address_ids из пользовательского документа, а второй — для извлечения этих адресов из коллекции адресов .