MongoDB yra dokumentų duomenų bazė ir nepalaiko ryšių tarp dokumentų, tokių kaip reliacinės duomenų bazės, tokios kaip PostgreSQL.
Vis dėlto MongoDB leidžia kurti ryšius tarp dokumentų. Šie ryšiai gali būti modeliuojami naudojant įterptuosius arba nuorodinius metodus. Pažiūrėkime atidžiau.
Įterptieji santykiai vs. Referenciniai santykiai
Taikant įterptąjį metodą, dokumentas įterpiamas tiesiai į kitą dokumentą, todėl gaunami įdėtieji duomenys. Šis procesas dar vadinamas „denormalizavimu“.
Kita vertus, nuorodos metodas naudoja dokumento nuorodas, kad būtų galima nukreipti iš vieno dokumento į kitą. Šis metodas taip pat vadinamas „normalizavimu“.
MongoDB: „vienas su vienu“ ryšiai su įterptaisiais dokumentais
Galite sukurti „vienas su vienu“ ryšį tarp dokumentų, naudodami įterptąjį metodą. Šis ryšys atsiranda, kai vienas dokumento objektas gali būti susijęs tik su vienu kitu dokumentu.
Apsvarstykite studentų duomenų bazę. Šioje duomenų bazėje yra studentų ir adresų rinkiniai su šiais dokumentais.
// Studento dokumentas
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
};
// Adreso dokumentas
{
"studentName": "Frodo Baggins",
"gatvė": "Bagshot Row",
"miestas": "Hobiton",
}
Šioje duomenų bazėje studentas gali turėti tik vieną adresą. Norėdami gauti adresą, turėsite pateikti užklausą dėl adresų rinkinio naudodami mokinio vardą.
Susijęs: Kaip sukurti duomenų bazę ir kolekciją MongoDB
Tais atvejais, kai adresas naudojamas kartu su kita informacija, pvz., a studento vardas, turėsite kelis kartus pateikti užklausą duomenų bazėje. Neigiamas dalykas yra didelis skaitymo operacijų skaičius ir dėl to mažas užklausos našumas.
Naudodami įterptąjį metodą, galite įterpti adreso duomenis tiesiai į mokinio dokumentą ir naudoti tik vieną užklausą duomenims gauti.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresas": [{
"gatvė": "Bagshot Row",
"miestas": "Hobiton"
}],
};
Norėdami gauti adresą per studento vardas, naudokite šią užklausą.
db.student.findOne({"studento vardas":"Frodas Bagginsas"}, {"adresas":1})
„Vienas su daugeliu“ ryšiai su įterptaisiais dokumentais „MongoDB“.
Apsvarstykite situaciją, kai studentas turi kelis adresus. Santykis tarp mokinio ir adresų tampa vienas su daugeliu.
Įterptasis modelis leidžia į mokinio dokumentą įtraukti kelis adresus. Kaip ir santykiuose „vienas su vienu“, naudojant įterptus dokumentus, šis metodas pasižymi gana dideliu užklausos našumu.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresas": [
{
"gatvė": "Bagshot Row",
"miestas": "Hobiton"
},
{
"gatvė": "Another Bagshot Row",
"miestas": "Hobiton2"
},
]
};
Toliau pateiktoje užklausoje bus pateikti nurodyto mokinio vardo adresai.
db.student.findOne({studento vardas: „Frodo Baggins“}, {adresas: 1})
Susijęs: Kaip sukurti dokumentus MongoDB
Dabar, jei turite daugiau adresų ir nuolat pridedate juos į adreso lauką, dokumentas gali greitai tapti netvarkingas. Vienas iš sprendimų yra naudoti dokumentų nuorodas.
MongoDB: „vienas su daugeliu“ ryšiai su dokumentų nuorodomis
Taip pat galite modeliuoti ryšį „vienas su daugeliu“ naudodami pamatinį metodą. Šiame duomenų modelyje studento ir adreso duomenys bus saugomi atskirose kolekcijose. Norėdami susieti mokinį su jo adresu, į studento dokumentą įtraukite lauką su adresų ID.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresas": [
ObjectId ("61fa7bfeebdadf8ac71427ea"),
ObjectId ("61fa7d19ebdadf8ac71427eb")
]
};
Norint gauti išsamią studento adreso informaciją, reikia gauti adresų ID iš studento dokumento ir naudoti tuos ID, kad būtų galima gauti tikruosius adresus iš rinkinio.
const student = db.users.findOne({"vardas":"Frodas Bagginsas"},{"adresas":1})
const adresai = db.adresas.find({"_id":{"$in":studentas["adreso_id"]}})
Pasirinkimas tarp įterptųjų ir pamatinių metodų
Tiek įterpimo, tiek nuorodų modeliai turi savo privalumų ir trūkumų, todėl prieš pasirinkdami turėsite apsvarstyti keletą dalykų. Pradedantiesiems turėsite apsvarstyti naudojimo atvejį. Jei duomenys bus susiję tik su vienu dokumentu, geriausias pasirinkimas galėtų būti įterpimas.
Norėdami sukurti ryšius vienas su daugeliu, galite naudoti nuorodos modelį arba įterptąjį modelį. Nuoroda suteikia aiškų ir nuoseklų dokumentą, nes pridedate tik dokumento, su kuriuo norite susieti, nuorodos ID.
Tačiau nuskaitymo operacijų, reikalingų prijungtiems duomenims gauti, skaičius yra gana didelis ir gali turėti įtakos našumui. Įdėjus dokumentą gali padidėti našumas, bet su daugybe įdėtų dokumentų gali susidaryti perpildyta kolekcija.
Todėl visiškai priklauso nuo jūsų pasirinkimo, kaip dokumente įdiegti duomenų ryšius. Apsvarstykite, kaip naudosite dokumentą, užklausos našumo lygį, kurio siekiate, ir kompromisus, kuriuos norite padaryti.
Svarstote kitokį požiūrį į duomenų bazes? Štai kaip duomenų modeliavimas veikia MongoDB.
Skaitykite toliau
- Programavimas
- Programavimas
- duomenų bazėje

Mary Gathoni yra programinės įrangos kūrėja, kuri aistringai kuria techninį turinį, kuris būtų ne tik informatyvus, bet ir įtraukiantis. Kai ji nekoduoja ir nerašo, jai patinka leisti laiką su draugais ir būti lauke.
Prenumeruokite mūsų naujienlaiškį
Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. knygų ir išskirtinių pasiūlymų!
Spauskite čia norėdami užsiprenumeruoti