MongoDB jest bazą danych dokumentów i nie utrzymuje relacji między dokumentami, takich jak relacyjne bazy danych, takie jak PostgreSQL.
Mimo to MongoDB pozwala na tworzenie relacji między dokumentami. Relacje te można modelować za pomocą podejść wbudowanych lub referencyjnych. Przyjrzyjmy się bliżej.
Relacje wbudowane a Relacje referencyjne
W podejściu osadzonym dokument jest wstawiany bezpośrednio do innego dokumentu, co powoduje powstanie danych zagnieżdżonych. Proces ten nazywany jest również „denormalizacją”.
Z drugiej strony podejście referencyjne wykorzystuje referencje do dokumentów, aby wskazywać z jednego dokumentu do drugiego. To podejście jest również nazywane „normalizacją”.
MongoDB: relacje jeden-do-jednego z osadzonymi dokumentami
Możesz utworzyć relację jeden-do-jednego między dokumentami, korzystając z podejścia osadzonego. Ta relacja występuje, gdy jeden obiekt dokumentu może odnosić się tylko do jednego innego dokumentu.
Rozważmy bazę danych uczniów. Ta baza danych zawiera zbiory uczniów i adresów wraz z następującymi dokumentami.
// Dokument studencki
{
"studentName": "Frodo Baggins",
"numer telefonu": "987654321",
};
// Dokument adresowy
{
"studentName": "Frodo Baggins",
"ulica": "Wiersz Bagshot",
"miasto": "Hobiton",
}
W tej bazie uczeń może mieć tylko jeden adres. Aby pobrać adres, musisz wysłać zapytanie do zbioru adresów, używając imienia i nazwiska ucznia.
Związane z: Jak utworzyć bazę danych i kolekcję w MongoDB
W przypadkach, gdy adres jest używany w połączeniu z innymi danymi, takimi jak studentNazwisko, będziesz musiał wielokrotnie wysyłać zapytania do bazy danych. Wadą tego jest duża liczba operacji odczytu, a co za tym idzie niska wydajność zapytań.
Korzystając z podejścia osadzonego, możesz wstawić dane adresowe bezpośrednio do dokumentu ucznia i użyć tylko jednego zapytania, aby uzyskać dane.
{
"studentName": "Frodo Baggins",
"numer telefonu": "987654321",
"adres": [{
"ulica": "Wiersz Bagshot",
"miasto": "Hobiton"
}],
};
Aby pobrać adres za pomocą studentNazwisko, użyj tego zapytania.
db.student.findOne({"studentName":"Frodo Baggins"}, {"adres"::1})
Relacje jeden-do-wielu z dokumentami osadzonymi w MongoDB
Rozważ sytuację, w której uczeń ma wiele adresów. Relacja między uczniem a adresami staje się jeden-do-wielu.
Wbudowany model umożliwia dodanie wielu adresów do dokumentu ucznia. Podobnie jak w przypadku relacji jeden-do-jednego z wykorzystaniem dokumentów osadzonych, to podejście zapewnia stosunkowo wysoką wydajność zapytań.
{
"studentName": "Frodo Baggins",
"numer telefonu": "987654321",
"adres": [
{
"ulica": "Wiersz Bagshot",
"miasto": "Hobiton"
},
{
„ulica”: „Kolejny rząd bagshotów”,
"miasto": "Hobiton2"
},
]
};
Poniższe zapytanie zwróci adresy podanego nazwiska ucznia.
db.student.findOne({nazwa studenta: “Frodo Baggins”}, {adres: 1})
Związane z: Jak tworzyć dokumenty w MongoDB
Teraz, jeśli masz więcej adresów i nadal dodajesz je do pola adresu, dokument może dość szybko zostać zaśmiecony. Jednym z rozwiązań jest wykorzystanie odwołań do dokumentów.
MongoDB: relacje jeden-do-wielu z odniesieniami do dokumentów
Można również modelować relację jeden-do-wielu, korzystając z podejścia referencyjnego. W tym modelu danych dane o uczniach i adresach będą przechowywane w oddzielnych zbiorach. Aby powiązać ucznia z jego adresem, dodaj pole zawierające identyfikatory adresu do dokumentu ucznia.
{
"studentName": "Frodo Baggins",
"numer telefonu": "987654321",
"adres": [
ObjectId ("61fa7bfeebdadf8ac71427ea"),
Identyfikator obiektu("61fa7d19ebdadf8ac71427eb")
]
};
Uzyskanie danych adresowych ucznia polega na pobraniu identyfikatorów adresowych z dokumentu studenckiego i wykorzystaniu tych identyfikatorów do pobrania rzeczywistych adresów z kolekcji.
const student = db.users.findOne({"name":"Frodo Baggins"},{"adres"::1})
const address = db.address.find({"_id":{"$in":student["address_ids"]}})
Wybór między podejściem osadzonym a referencyjnym
Zarówno modele osadzania, jak i odniesienia mają swoje zalety i wady, a przed dokonaniem wyboru musisz wziąć pod uwagę kilka rzeczy. Na początek musisz wziąć pod uwagę przypadek użycia. Jeśli dane będą dotyczyć tylko jednego dokumentu, najlepszym rozwiązaniem może być osadzanie.
Aby utworzyć relacje jeden-do-wielu, możesz użyć modelu odniesienia lub modelu osadzonego. Odwoływanie się skutkuje czystym i spójnym dokumentem, ponieważ dodajesz tylko identyfikator odniesienia dokumentu, z którym chcesz się odnieść.
Jednak liczba operacji odczytu wymaganych do pobrania połączonych danych jest stosunkowo duża i może mieć wpływ na wydajność. Osadzenie dokumentu może zwiększyć wydajność, ale w przypadku wielu zagnieżdżonych dokumentów możesz skończyć z przeciążoną kolekcją.
Wybór sposobu implementacji relacji danych w dokumencie zależy zatem wyłącznie od Ciebie. Zastanów się, w jaki sposób będziesz korzystać z dokumentu, jaki jest poziom wydajności zapytań, do którego dążysz, oraz kompromisy, które chcesz poczynić.
Rozważasz inne podejście do baz danych? Oto jak działa modelowanie danych w MongoDB.
Czytaj dalej
- Programowanie
- Programowanie
- Baza danych
Mary Gathoni jest programistą z pasją do tworzenia treści technicznych, które mają nie tylko charakter informacyjny, ale także angażują. Kiedy nie koduje ani nie pisze, lubi spędzać czas z przyjaciółmi i przebywać na świeżym powietrzu.
Zapisz się do naszego newslettera
Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Kliknij tutaj, aby zasubskrybować