Wpis z mikrobloga

Mam ok 800k lotów w bazie z ponizszym schematem:

String departureAirport
String destinationAirport
Float price
Date date

Jak mozecie zauwazyc mamy tutaj loty tylko w jedna strone.
Głównym celem mojego projektu jest wyszukiwanie lotów w dwie strony z określonego lotniska wylotu do listy lotnisk docelowych, moje obecne rozwiązanie wyglada nastepujaco. Użyłem MongoDB jako magazynu bazy danych. Każdy lot przechowuję niezależnie. Kiedy mam request o wyszukanie, najpierw szukam lotu w pierwszą stronę według podanych kryteriów, a następnie iteruje po liscie znalezionych lotów w pierwszą stronę. Dla każdego znalezionego lotu muszę wykonać niezależne zapytanie do Mongo, aby znaleźć lot powrotny. Niestety to generuje bardzo dużo żądań i cała operacja trwa naprawdę długo. Może macie inne pomysły, jak mógłbym to rozwiązać? Może powinienem użyć relacyjnej bazy danych lub bazy danych grafów? Może powinienem przechowywać wszystkie loty dla jednego połączenia w jednym rekordzie/dokumencie?

Post scriptum: Kiedy pisałem ten post, wpadłem na nowy pomysł. Może powinienem zagregować wszystkie loty w pierwszą stronę i zrobić jedno zapytanie Mongo, a później przefiltrować je w Javie, co byłoby zdecydowanie szybsze, ale z drugiej strony pochłonie znacznie więcej pamięci.
#programowanie #bazadanych #bazydanych
  • 16
@ireneusz-piontek: 1. Załóż sobie index (czy coś pokrewnego w zależności o typu bazy) na miasto startowe dla każdego lotu.
2. Jeśli ktoś szuka lotów A->B
-- to możesz dodatkowo założyć sobie index A,B albo samo B (trochę przyspieszy i baza taniej wypluje loy A-B_
3. Teraz jak szukasz lotów powrotnych to robisz jeden strzał do bazy o loty B->A (zindexowane) i możesz to jakoś ograniczyć czasowo jesli potrzebujesz tego ograniczenia.
4.
@LazyInitializationException: @kobrys13 Dzięki Panowie, przeanalizuję to co napisaliście, ale pomysł @Krolik w sumie mnie intryguje ( ͡° ͜ʖ ͡°) cała baza ma 400mb, Jakby to wstawić wszystko do jednej mapy i tylko filtrować na streamach, ciekawe ile czasu by to zajelo w tym przypadku no i drugie pytanie ile pamięci, bo zakładając że udostępnię tę apkę i te kilka osób na krzyż na raz będzie używać to
@ireneusz-piontek: czy na dzień dzisiejszy spodziewasz się wielu użytkowników pytających na raz i ewentualnie czas odpowiedzi ma znaczenie?

Bo wiesz - jeśli baza ma 400MB to mógłbyś w trakcie requesta po prostu ładować dane z pliku robiąc pierwsze filtrowanie, a potem z górki.

Takie coś pozwoliło by Ci to opędzić nawet jako lambda/serverless funkcje gdzieś w cloudzie.

Druga sprawa - jeśli to jest statyczna mapa lotów i te 400MB nie urośnie
@kobrys13 spodziewam się użytkowników w postaci mojej osoby, moich znajomych, może paru wykopków i paru użytkowników reddita bo po skończeniu apki mam zamiar ją tutaj upublicznić. Baza ma 400mb i jest aktualizowana co 12h. Cel to mieć akceptowalny czas odpowiedzi, bo teraz czas odpowiedzi na najbardziej zaawansowanie wyszukiwania potrafi wynieść 20min.
@obieq jaki tech stack? może połączymy siły :D
@obieq: Ja niestety JVM, ale jak skończę obsługę wyszukiwań to udostępnię moje api, moze ci sie przyda. A jak zbierasz dane o lotach? Jakie linie lotnicze obslugujesz?
@Krolik Jesli juz to bym je zaladowal raz, trzymał w pamięci i aktualizowal w momencie kiedy pobiore aktualne dane lotów