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

MongoDB, jaki sposób pobrać spokrewnione ze sobą dane
S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 415
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.

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
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.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1914
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.