MongoDB е база данни с документи и не поддържа връзки между документи като релационни бази данни като PostgreSQL.

Все пак MongoDB ви позволява да създавате връзки между документи. Тези връзки могат да бъдат моделирани чрез вградени или референтни подходи. Нека разгледаме по-отблизо.

Вградени връзки срещу Референтни взаимоотношения

При вграден подход документът се вмъква директно в друг документ, което води до вложени данни. Процесът се нарича още "денормализация".

Референтният подход, от друга страна, използва препратки към документи, за да сочи от един документ към друг. Този подход се нарича още "нормализация".

MongoDB: Връзки едно към едно с вградени документи

Можете да създадете връзка едно към едно между документи, като използвате вградения подход. Тази връзка възниква, когато един обект на документ може да се отнася само към друг документ.

Помислете за студентска база данни. Тази база данни съдържа студентски и адресни колекции със следните документи.

// Студентски документ
{
"studentName": "Фродо Бегинс",
instagram viewer

"телефонен номер": "987654321",
};
// Адресен документ
{
"studentName": "Фродо Бегинс",
"street": "Bagshot Row",
"град": "Хобитон",
}

В тази база данни на ученика е позволено да има само един адрес. За да извлечете адреса, ще трябва да направите заявка за колекцията от адреси, като използвате името на ученика.

Свързани: Как да създадете база данни и колекция в MongoDB

В случаите, когато адресът се използва в тандем с други подробности, като например a студентИме, ще трябва да направите заявка към базата данни няколко пъти. Недостатъкът на това е голям брой операции за четене и следователно ниска производителност на заявките.

Използвайки вградения подход, можете да вмъкнете адресните данни направо в студентския документ и да използвате само една заявка, за да получите данните.

{
"studentName": "Фродо Бегинс",
"телефонен номер": "987654321",
"адрес": [{
"street": "Bagshot Row",
"град": "Хобитон"
}],
};

За да извлечете адреса чрез студентИме, използвайте тази заявка.

db.student.findOne({"studentName":"Frodo Baggins"}, {"address":1})

Връзки един към много с вградени документи в MongoDB

Помислете за ситуация, в която ученик има няколко адреса. Връзката между ученика и адресите става едно към много.

Вграденият модел ви позволява да добавяте множество адреси към студентския документ. Както при връзката един към един, използваща вградени документи, този подход има относително висока производителност на заявки.

{
"studentName": "Фродо Бегинс",
"телефонен номер": "987654321",
"адрес": [
{
"street": "Bagshot Row",
"град": "Хобитон"
},
{
"street": "Друг Bagshot Row",
"град": "Hobiton2"
},
]
};

Заявката по-долу ще върне адресите на посоченото име на студент.

db.student.findOne({studentName: “Frodo Baggins”}, {адрес: 1})

Свързани: Как да създавате документи в MongoDB

Сега, ако имате повече адреси и продължавате да ги добавяте към адресното поле, документът може да се затрупа доста бързо. Едно решение е да използвате препратки към документи.

MongoDB: Връзки един към много с препратки към документи

Можете също да моделирате връзка един към много, като използвате референтния подход. В този модел на данни данните за ученика и адреса ще се поддържат в отделни колекции. За да свържете ученика с неговия адрес, добавете поле, съдържащо идентификаторите на адреса, към студентския документ.

{
"studentName": "Фродо Бегинс",
"телефонен номер": "987654321",
"адрес": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};

Получаването на подробности за адреса на ученик включва извличане на адресните идентификатори от студентския документ и използване на тези идентификатори за извличане на действителните адреси от колекцията.

const student = db.users.findOne({"name":"Frodo Baggins"},{"address":1})
const адреси = db.address.find({"_id":{"$in":student["address_ids"]}})

Избор между вграден и референтен подход

Както моделите за вграждане, така и за референтни модели имат своите плюсове и минуси и ще трябва да вземете предвид няколко неща, преди да направите избор. За начало ще трябва да вземете предвид случая на употреба. Ако данните ще бъдат свързани само с един документ, вграждането може да бъде най-добрият ви вариант.

За да създадете връзки едно към много, можете да използвате или референтния модел, или вградения модел. Препратката води до чист и последователен документ, тъй като добавяте само референтния идентификатор на документа, с който искате да се свържете.

Въпреки това, броят на операциите за четене, необходими за извличане на свързаните данни, е сравнително висок и може да повлияе на производителността. Вграждането на документа може да повиши производителността, но с много вложени документи може да се окажете с претоварена колекция.

Следователно изборът как да приложите връзките с данни във вашия документ зависи изцяло от вас. Помислете как ще използвате документа, нивото на изпълнение на заявката, към което се стремите, и компромисите, които сте готови да направите.

Как се различава моделирането на данни в MongoDB?

Обмисляте различен подход към базите данни? Ето как работи моделирането на данни в MongoDB.

Прочетете Следващото

Дялтуителектронна поща
Свързани теми
  • Програмиране
  • Програмиране
  • база данни
За автора
Мери Гатони (публикувани 4 статии)

Мери Гатони е разработчик на софтуер със страст за създаване на техническо съдържание, което е не само информативно, но и ангажиращо. Когато не кодира или пише, тя обича да излиза с приятели и да е на открито.

Още от Mary Gathoni

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, ревюта, безплатни електронни книги и ексклузивни оферти!

Щракнете тук, за да се абонирате