Cześć. Planuję budowę apki internetowej pobierającej, przetwarzającej i wyświetlającej dane. Pracowałem głównie nad małymi projektami typu CRUD itp., które nie wymagają jakiś mega zasobów. Przy obecnym projekcie natknąłem się na problem z zbyt długimi zapytaniami do bazy, ze względu na dużą ilość wierszy.
Głównie siedzę w JS, więc backend powstanie w node.js, front prawdopodobnie w next.js
Niewykluczone że projekt w przyszłości przejdzie na model komercyjny, więc nexta chciałbym użyć, aby poprawić SEO (wszystkie statyczne treści np SSG + doczytywać dynamicznie z api)
Głównym założeniem jest analiza danych ,,realtime". Przez api do bazy regularnie będzie napływać sporo danych. Problem pojawia się w chwili gdy chcę te dane przeanalizować i wyświetlić użytkownikowi.
Przykład: Tabela ma 5mln wierszy.
Użytkownik na front'endzie klika w swój profil i wybiera id innego użytkownika. Wyświetla mu się liczba relacji z danym użytkownikiem (1 relacja = 1 wiersz).
Przez api do bazy danych leci zapytanie o ilość wierszy w których id1=uzytkownik1, id2=użytkownik2. Niestety takie zapytania trwają zbyt długo. Jeśli użytkownik zmieni parametry, to znów czeka aż system to przemieli. Gdy takie zapytania równolegle wykona kilku użytkowników, to responsywność totalnie leży.
Myślałem nad małą instancję tylko do analizowania danych i wrzucania w osobną tabelę, wtedy czytanie z tego jest mega szybkie, bo mamy od razu gotowy wynik. Jednak problematyczne w tym przypadku jest to, że dane się ciągle zmieniają, po drugie, gdy np. 1000 użytkowników ma relacje każdy z każdym, to mamy ~1mln różnych relacji.
Co do baz danych, mogę skorzystać z mysql, postgre i mongodb. W optymalizację baz danych to jakoś bardzo się nie zagłębiałem, jedynie podstawowe rzeczy typu indeksowanie (sql)
Jakieś porady dotyczące architektury? jak się za to zabrać, aby nie uwalić całej wydajności na samej bazie danych. Pomijam też drogie rozwiązania typu ,,google bigtable". Jestem otwarty na wszelkie pomysły powiązane z JS (programuję w tym języku, więc np. poznanie kolejnego frameworka to nie problem), a może powinienem wybrać całkowicie inny tech stack?