MongoDB — это база данных документов, и она не поддерживает связи между документами, как реляционные базы данных, такие как PostgreSQL.
Тем не менее, MongoDB позволяет создавать отношения между документами. Эти отношения могут быть смоделированы с помощью встроенных или ссылочных подходов. Давайте посмотрим поближе.
Встроенные отношения vs. Ссылочные отношения
При встроенном подходе документ вставляется непосредственно в другой документ, что приводит к вложенным данным. Этот процесс также называется «денормализация».
С другой стороны, справочный подход использует ссылки на документы, чтобы указывать от одного документа к другому. Этот подход также называется «нормализация».
MongoDB: отношения «один к одному» со встроенными документами
Вы можете создать отношение один к одному между документами, используя встроенный подход. Эта связь возникает, когда один объект документа может относиться только к одному другому документу.
Рассмотрим базу данных студентов. Эта база данных содержит студенческие и адресные коллекции со следующими документами.
// Студенческий документ
{
"studentName": "Фродо Бэггинс",
"номер телефона": "987654321",
};
// Адресный документ
{
"studentName": "Фродо Бэггинс",
"улица": "Бэгшот Роу",
"город": "Хобитон",
}
В этой базе данных студенту разрешено иметь только один адрес. Чтобы получить адрес, вам нужно будет запросить коллекцию адресов, используя имя учащегося.
Связанный: Как создать базу данных и коллекцию в MongoDB
В случаях, когда адрес используется в тандеме с другими данными, такими как имя студента, вам придется запрашивать базу данных несколько раз. Недостатком этого является большое количество операций чтения и, следовательно, низкая производительность запросов.
Используя встроенный подход, вы можете вставить адресные данные прямо в студенческий документ и использовать только один запрос для получения данных.
{
"studentName": "Фродо Бэггинс",
"номер телефона": "987654321",
"адрес": [{
"улица": "Бэгшот Роу",
"город": "Хобитон"
}],
};
Чтобы получить адрес через имя студента, используйте этот запрос.
db.student.findOne({"studentName":"Фродо Бэггинс"}, {"адрес":1})
Отношения «один ко многим» со встроенными документами в MongoDB
Рассмотрим ситуацию, когда у студента несколько адресов. Связь между студентом и адресами становится один ко многим.
Встроенная модель позволяет добавлять несколько адресов в студенческий документ. Как и в случае отношения "один к одному" с использованием встроенных документов, этот подход обеспечивает относительно высокую производительность запросов.
{
"studentName": "Фродо Бэггинс",
"номер телефона": "987654321",
"адрес": [
{
"улица": "Бэгшот Роу",
"город": "Хобитон"
},
{
"street": "Еще один Бэгшот Роу",
"город": "Хобитон2"
},
]
};
Приведенный ниже запрос вернет адреса указанного имени учащегося.
db.student.findOne({имя_ученика: «Фродо Бэггинс»}, {адрес: 1})
Связанный: Как создавать документы в MongoDB
Теперь, если у вас есть больше адресов и вы продолжаете добавлять их в адресное поле, документ может довольно быстро загромождаться. Одним из решений является использование ссылок на документы.
MongoDB: отношения «один ко многим» со ссылками на документы
Вы также можете смоделировать отношение «один ко многим», используя эталонный подход. В этой модели данных данные об учениках и адресах будут храниться в отдельных коллекциях. Чтобы связать учащегося с его адресом, добавьте поле, содержащее идентификаторы адреса, в документ учащегося.
{
"studentName": "Фродо Бэггинс",
"номер телефона": "987654321",
"адрес": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};
Получение сведений об адресе учащегося включает получение идентификаторов адресов из документа учащегося и использование этих идентификаторов для извлечения фактических адресов из коллекции.
const student = db.users.findOne({"имя":"Фродо Бэггинс"},{"адрес":1})
константные адреса = db.address.find({"_id":{"$in":student["address_ids"]}})
Выбор между встроенным и эталонным подходами
Как у модели внедрения, так и у модели ссылок есть свои плюсы и минусы, и вам придется рассмотреть несколько вещей, прежде чем сделать выбор. Для начала вам нужно рассмотреть вариант использования. Если данные будут относиться только к одному документу, лучшим вариантом может быть встраивание.
Для создания отношений «один ко многим» можно использовать модель ссылок или встроенную модель. Ссылка приводит к чистому и согласованному документу, поскольку вы добавляете только идентификатор ссылки документа, к которому хотите обратиться.
Однако количество операций чтения, необходимых для извлечения подключенных данных, относительно велико и может повлиять на производительность. Встраивание документа может повысить производительность, но при большом количестве вложенных документов вы можете получить перегруженную коллекцию.
Таким образом, выбор того, как реализовать отношения данных в вашем документе, полностью зависит от вас. Подумайте, как вы будете использовать документ, какой уровень производительности запросов вам нужен и на какие компромиссы вы готовы пойти.
Рассматриваете другой подход к базам данных? Вот как работает моделирование данных в MongoDB.
Читать дальше
- Программирование
- Программирование
- база данных

Мэри Гатони — разработчик программного обеспечения, страстно любящий создавать технический контент, который не только информативен, но и привлекателен. Когда она не программирует и не пишет, ей нравится проводить время с друзьями и гулять на свежем воздухе.
Подписывайтесь на нашу новостную рассылку
Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!
Нажмите здесь, чтобы подписаться