Jaką baze danych użyć?

0

Witam,
Będę pobierał dynamiczne dane co sekundę (około 200 danych) przez API, dane te będą analizowane i jeśli dane będą miały określone wartości to zostanie wykonany odpowiedni kod php. I zastanawiam się nad bazą danych jaka będzie najszybsza do tego zadania. Czy MongoDB będzie najszybsze czy proponujecie cos innego? bo zależy mi na czasie zapisu i przetwarzaniu danych.

0

Może MySQL ? Zależy też od struktury danych i złożoności zapytań. Dlaczego jako pierwsze zaproponowales mongo?

0

I dlaczego baza, bo tak jakby wprost nie napisałeś, jaka jej jest tu rola. Będziesz z niej pobierał dane czy zapisywał wyniki po przetworzeniu? Co dalej z nimi chcesz robić?

0

Przed wyborem bazy, określ jak będą wyglądać Twoje dane, jak bardzo skomplikowane zapytania będziesz musiał tworzyć, czy ważny jest dla Ciebie insert czy select. Ciężko cokolwiek powiedzieć nie wiedząc za wiele. Dla kogoś szybki może być postgres, dla innych elasticsearch. Wszystko zależy, czego oczekujesz od bazy.

0

Z tego co napisałeś, to każda baza się nada, 200 rekordów co sekundę do obsłużenia to jest nic jeśli zapytania są poprawnie napisane.

0

Weźmy trzy przypadki:

  1. większość lub całość zapytań to będzie zapis do bazy (insert/update)

  2. będzie równowaga między zapisem a odczytem

  3. większość lub calość zapytań to będzie odczyt - zapis tylko raz, a potem już nie będzie update

  4. i 2) - polecam bazę transakcyjną - np. PostgreSQL

    • MongoDB lub MySQL z użyciem starego silnika/metody składowania MyISAM która jest nietransakcyjna i dzięki temu bardzo szybko odbsługuje odczyt danych, do tego w MySQL można włączyć wewnętrzny cache zapytań
0

Co minute będzie tworzona nowa tabela i w pierwszym wierszu zapisane będzie 200 danych pobranych podczas stworzenia tabeli. Natomiast co sekundę do danej tabeli bada pobierane znowu 200 danych i dopisywanych w kolejnym wierszu tej tabeli. I po zapisaniu w bazie tych danych pobieranych co sekundę następuje proste porównanie czy ta pierwsza dana która jest pobrana na początku stworzenia tabeli jest większą od tej danej pobranej co sekundę. Czas sobie leci a algorytm cały czas pobiera co sekundę te 200 danych dynamicznych i zapisuje je w kolejnym wierszu i po zapisaniu od razu porównuje z tymi danymi pobranymi podczas tworzenia tabeli (w pierwszym wierszu). Oczywiście po minucie tworzona jest nowa tabela, gdzie na początku pobierane są nowe dane i znowu zapisane w pierwszym wierszu tej tabeli, a co sekundę będą zapisywane nowe dane w tej tabeli w kolejnym wierszu i po zapisaniu wykonuje się proste porównanie. Poprzednia tabela z stworzeniem następnej nie jest usuwana tylko dalej sobie działa. I tak co minutę tworzone są nowe tabele i wykonywany ten algorytm co wyżej opisałem. Jeśli tabela została stworzona powyżej dwóch godzin temu to można zakończyć zapis i porównywanie danych w tej tabeli. Podczas porównywania tych danych sekundowych z danymi pobranymi przy tworzeniu tabeli, raz na jakiś czas warunek porównania zwróci true i wtedy należy z automatu wykonać prosty kod php. True będzie bardzo rzadko ale jednak będzie. Także jeśli co minute tworzona jest nowa tabela i w każdej tabeli co sekundę zapisywane są nowe dane to tych danych będzie bardzo dużo dlatego szukam bazy która do tego zadania będzie najszybsza i najlepsza. Szukam informacji jakich narzędzi użyć w tym projekcie aby to naprawdę szybko działało. Dane będą pobierane przez API i będą w JSON.

0

szczerze to ja bym poleciał na nosql siedzącym w ramie np redisie i zapisywał tam gotowy json który by był porównywany, bez deserializacji.

1

@sentence: po co chcesz tworzyć nowe tabele co minutę?

Silniki bazodanowych mają taki koncept jak "temporary table", która to tabelka może "znikać" dane przy zakończeniu transakcji albo sesji.
Czasem wystarczy trzymać dane w pamięci (dane widoczne na poziomie sesji bazodanowej/połączenia), bez konieczności ich utrwalania.

3

Tabela co minutę? Po roku masz ich pól miliona. Powodzenia!

2

Chyba nie bardzo wiesz jak działają bazy danych.Tworzysz 2 tabele. Pierwsza to będzie NAGŁÓWEK ( w niej jakaś data, id, nazwa), oraz DANE (tutaj będzie id, dane jakie chcesz oraz ID NAGŁÓWKA jako klucz obcy). Generowanie tabel, z taką samą strukturą jest karygodne i jest to de normalizacja bazy danych. Jeśli te dane nie zmieniają się co sekundę i nie dostajesz różnych ich wersji (np. różni klienci przesyłają różne produkty z koszyka, bo są z różnych klientów), to nie ma sensu bawić siew Mongo. Poszedł bym przy takim obciążeniu w Postgres, MySQL, Firebird. Popracuj nad strukturą, bo silnik to rzecz wtórna, i dobrze odseparowana logika od bazy pozwoli na migracje między silnikami, szczególnie jak użyjesz dobrze ORM'a czy jakieś innej warstwy pośredniej, między logiką o BD.

---- EDYTA

Ofc, tak się odwołujesz do danych z jednej "partii", że robisz coś ala select * from DANE D where D.NAGLOWEK = 123 i porównujesz sobie z danymi z select * from DANE D where D.NAGLOWEK = 124. Oczywiście bez asteriska, a najlepiej nie pisać czystego SQL tylko obrazuje jak tego użyć. Tabela to mylące słowo. Nie oznacza, kartki wypełnionej liczbami jak tabela w ekonomii. Tabela to sam nagłówek papierowej tabeli wraz z informacją o szerokości tych kolumn. W zwykłej tabeli na kartce też stosujesz niejawnie tabelę nagłówkową, bo stosujesz klucz obcy, też nieświadomie - w postaci daty- np. sprzedaż z każdego dnia ma klucz obcy na datę i tak widzimy wszystkie sprzedaże, z tego dni. Na kolejny dzień nie robisz nowego zeszytu, tylko dalej wpisujesz, ale z inną datą - zmienia sie klucz obcy.

0
somedev napisał(a):

Chyba nie bardzo wiesz jak działają bazy danych.Tworzysz 2 tabele. Pierwsza to będzie NAGŁÓWEK ( w niej jakaś data, id, nazwa), oraz DANE (tutaj będzie id, dane jakie chcesz oraz ID NAGŁÓWKA jako klucz obcy). Generowanie tabel, z taką samą strukturą jest karygodne i jest to de normalizacja bazy danych. Jeśli te dane nie zmieniają się co sekundę i nie dostajesz różnych ich wersji (np. różni klienci przesyłają różne produkty z koszyka, bo są z różnych klientów), to nie ma sensu bawić siew Mongo. Poszedł bym przy takim obciążeniu w Postgres, MySQL, Firebird. Popracuj nad strukturą, bo silnik to rzecz wtórna, i dobrze odseparowana logika od bazy pozwoli na migracje między silnikami, szczególnie jak użyjesz dobrze ORM'a czy jakieś innej warstwy pośredniej, między logiką o BD.

---- EDYTA

Ofc, tak się odwołujesz do danych z jednej "partii", że robisz coś ala select * from DANE D where D.NAGLOWEK = 123 i porównujesz sobie z danymi z select * from DANE D where D.NAGLOWEK = 124. Oczywiście bez asteriska, a najlepiej nie pisać czystego SQL tylko obrazuje jak tego użyć. Tabela to mylące słowo. Nie oznacza, kartki wypełnionej liczbami jak tabela w ekonomii. Tabela to sam nagłówek papierowej tabeli wraz z informacją o szerokości tych kolumn. W zwykłej tabeli na kartce też stosujesz niejawnie tabelę nagłówkową, bo stosujesz klucz obcy, też nieświadomie - w postaci daty- np. sprzedaż z każdego dnia ma klucz obcy na datę i tak widzimy wszystkie sprzedaże, z tego dni. Na kolejny dzień nie robisz nowego zeszytu, tylko dalej wpisujesz, ale z inną datą - zmienia sie klucz obcy.

Tylko jak coś takiego zautomatyzować? Bo zakładając Twoje rozwiązanie z dwoma tabelami. Jeśli o godzinie 1200 zacznę pobierać dane to o godzinie 1200 zapiszą się dane w pierwszym rekordzie, następnie o godzinie 1201 w drugim rekordzie i po zapisaniu następuje porównanie danych z godziny 1200 z danymi z godziny 1201. O godzinie 1202 pobierane są znowu dane do następnego rekordu i po zapisaniu następuje znowu porównanie i tak z każdą sekundą następuje zapisanie i porównanie. Natomiast o godzinie 1200 zapisane są dane do następnego rekordu, a o godzinie 1201 do następnego i po zapisaniu następuje porównanie danych z godziny 1200 z 1201. Po zapisaniu danych z 1202 następuje porównanie danych z godziny 1200. I tak analogicznie dalej z pobraniem kolejnych danych z kolejnymi sekundami. Tylko że przy pobieraniu danych z godziny 1201 należy oprócz porównania ich z danymi z godziny 1200 to zrobić jeszcze porównanie z godziny 1200. O godzinie 1201 jak zostaną pobrane dane i zapisane do następnego rekordu to należy je porównać z danymi z godziny 1200, 1200 ,1200 ,1200 ,1200 ,1200. O godzinie 1401 można zakończyć porównanie danych z danymi z godziny 1200 i ten rekord danych można usunąć. I te dane zmieniają się, z sekundy na sekundę z 200 danych np. 3 ma inne wartości. A przez piec sekund np. 6 wartości może się zmienić. Jak to zautomatyzować? i w czym to najlepiej napisać?

0

Musisz stosować nagłówki i klucze obce na danych do nich. Każda partia to inny klucz. Szczerze to nie widzę sensu usuwania danych bo baza danych nigdy nie maleje, chyba, że odtwarzasz z backupu (kwestie optymalizacji).

0

Zlecę napisanie tego. Zainteresowani priv.

0

Najlepiej załóż osobny wątek w "ogłoszeniach drobnych" w tej sprawie.

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