Связи в MongoDB
Связи в MongoDB представляют собой логические связи между несколькими документами.
Документы можно связывать с помощью встраивания и ссылок.
Связи в MongoDB могут быть:
- 1:1 (один к одному)
- 1: N (один ко многим)
- N: 1 (многие-к-одному)
- N: N (многие-ко-многим)
Далее рассмотрим связь между пользователями и адресами пользователей.
У пользователя может быть несколько адресов, поэтому это связь один-ко-многим.
Ниже приведенаuserпростая структура документа:
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
Ниже приведенаaddressпростая структура документа:
{
"_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документа для установления связи.
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
В приведённом выше примере полеaddress_idsдокумента пользователя содержит массив ObjectIds адресов пользователя.
Мы можем прочитать эти ObjectIds адресов пользователя, чтобы получить подробную информацию об адресе пользователя.
Этот метод требует двух запросов. Первый запрос извлекает ObjectIds адресов пользователя, а второй запрос использует полученные идентификаторы для получения подробной информации об адресе пользователя.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})
Другие расширения