MongoDB, jaki sposób pobrać spokrewnione ze sobą dane

0

Mam bazę MongoDB, więc wszystko odbywa się nierelacyjnie, 0 JPA, SQLa itd.

Załóżmy, że mam w bazie 2 kolekcje: local i order. Zadanie, które chce wykonać to pobrać wszystkie ordery z danego local (czyli wszystkie zamówienia w danym lokalu). I mogę to zrobić na 2 sposoby, ale nie wiem który z nich jest wydajniejszy. Sposób pierwszy:

Local posiada pole List<String> orderIds w którym przechowuje ID orderów. Użytkownik podaje tylko localId, aplikacja wyciąga local po ID, następnie wyciąga wszystkie IDki orderów z tej listy i dla każdego ID wykonuje findOrderById(String id). Minusem jest, że jeżeli lista orderIds będzie duża to będzie dużo pojedynczych strzałów do bazy. Dlaczego w ogóle rozważam ten pomysł? Bo unikam tutaj skanowania całej kolekcji order od góry do dołu. Po prostu wyciągam każdy order w czasie o(1).

Drugi sposób:

Tworzę metodę findOrdersByLocalId(String localId) i prawdopodobnie (tak mi się wydaje) pod spodem będzie to czego unikam w kroku pierwszym czyli przelot przez całą kolekcję order i wybieranie do zwrócenia tych w których pole LocalId równa się LocalId podanemu w parametrze metody. Minusy: Czas o(n), plusy: jedno zapytanie.

1
slayer9 napisał(a):

Dlaczego w ogóle rozważam ten pomysł? Bo unikam tutaj skanowania całej kolekcji order od góry do dołu. Po prostu wyciągam każdy order w czasie o(1)

Masz n zapytań i mówisz o czasie stałym? Sam pomysł jest klasycznym N+1 w normalnych bazach danych.

W ogóle zawsze podziwiałem Mongo i rozwiązywanie problemów nieznanych w innych systemach, czyli robienie klasycznego JOIN na około.

0

Ja bym poszedł w opcję drugą. Założysz sobie indeks i będzie super hulać. Wyciągnięcie ordera po ID to prawie O(1), wysokość drzewa indeksu jest mała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1