Załóżmy, że chcesz modelować określoną sytuację. Firma może mieć jedną lub więcej oddziałów. Oddziały te mają pracowników, którzy mogą pracować w innej firmie (lub nawet w dwóch różnych oddziałach tej samej firmy). To oczywiście tylko przykład.Zalecenia dotyczące schematu schematu MongoDB
Załóżmy również, że większość wyszukiwań/zapytań będzie wykonywana na kolekcjach pracowników i firm.
Pierwsze (naiwne) sposobem na to byłoby umieścić wszystko (Spółka posiada szereg branż i gałęzi mieć tablicę pracowników):
{
name: "Company name",
// other company data
branches : [
{
name: "Branch name",
// other branch data
Employees: [
{
// employee1 data
},
{
// employee data
},
]
}
]
}
Ale to byłoby bardzo nieefektywne, gdy jeden byłby zainteresowany pobieranie informacji o pracownikach (należy znaleźć firmę, a następnie powtórzyć wyszukiwanie w każdym oddziale, aby znaleźć pracownika, który jest wymagany).
Z drugiej strony można używać referencji i naśladować RDBMS (byłaby to firma, oddział i kolekcja pracowników), ale oznaczałoby to więcej zapytań.
Trzecia opcja (do której jestem najbliżej), to posiadanie pracownika jako oddzielnej kolekcji, a następnie posiadanie zestawu odniesień do niego w Oddziałach. Ponadto, aby umożliwić szybsze zapytania typu: „pracowników z pewnych nazw, które pracują dla pewnej firmy i niektórych gałęzi”, Firma ObjectId może być przechowywany w zbiorach Pracownik:
{
company_id: "some id",
first_name: "First name",
last_name: "Last name",
//
}
Tak więc, w tym przypadku, aby wyszukać wszystkie pracownicy o pewnych nazwach, którzy pracują dla pewnej firmy i pewnego oddziału, trzeba by zrobić dwie kwerendy. Pierwsze zapytanie zwróciłoby firmy spełniające "warunek firmy" (nazwa firmy i nazwa oddziału), a następnie drugie zapytanie dotyczące zbierania pracowników zwróciło wszystkich pracowników o określonej nazwie i pracujących w firmach, których identyfikatory są zwracane w pierwszym zapytaniu.
Czy zrobiłbyś to w inny sposób? Czy jest jakiś inny "zalecany" sposób na zrobienie tego? Czy dodasz jakieś ulepszenia?
Co ważniejsze, co zrobić w sytuacji, gdy te dwa zapytania zwracają zestawy wyników o małym przecięciu? Jak poprawić wydajność w takim przypadku?
Dzięki za odpowiedź. Firma, oddział i pracownik byli tylko przykładem ilustrującym problem. Lubię symulację relacji wiele do wielu z tablicą przydziałów. Użyję tego i doda tam wszystkie pola "wyszukiwane". Nie przekroczę limitu 16MB, ale myślałem o przejściu z wieloma kolekcjami - jeden dla firmy (oddział byłby w nim osadzony), a drugi dla pracownika. – kevin