Отношения в 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 из пользовательского документа, а второй — для извлечения этих адресов из коллекции адресов .