Baza danych MySQL - przechwycenie zdarzenia obejmującego zmianę danych w tabelach

0

Witam,

Mam aplikację opartą na ADO, która służy do raportowania i prezentacji postępu robót wykonywanych przez poszczególnych pracowników. Obecnie oparta jest na ADO, ale mogę przerzucić się na FireDAC'a.
Każdy z pracowników (jest ich około 20) realizuje oddzielne działanie, którego postęp jest zapisywany na serwerze w tablicy MySQL (każdy user na oddzielną tablicę). Każdy z nich ma aplikację i raz dziennie (niestety w różnych porach) pracownicy określają ilość i rodzaj robót wykonanych w dniu poprzednim.

W programie oprócz zakładki służącej do raportowaniem jest zakładka z prezentacją postępu prac wszystkich pracowników - ta zakładka interesuje ich przełożonego :) Siada sobie i patrzy na wykresy :)

Mam pytanie w jaki sposób (a może jakim komponentem np. FireDAC'a) mogę przechwycić zdarzenie obejmujące zapis danych w poszczególnych tablicach bazy danych, tak aby po zaraportowaniu przez n-tego pracownika odświeżyć dane i "przerysować" wykres by przedstawiał rzeczywisty stan robót?
Nie oczekuję oczywiście gotowego rozwiązania, ale ukierunkowania :)

0

Nie wiem jak jest teraz ale kilka lat temu MySQL nie obsługiwał mechanizmu notyfikacji. Jeśli nic się nie zmieniło to słabo to wygląda.
Jeśli jednak nie zależy ci na danych w "czasie rzeczywistym" to jest kilka sposobów, niestety wszystkie w pewnym sensie obciążają system. Najprostsze rozwiązanie to select co jakiś czas po najwyższym indeksie twoich tabel. Pytaj tylko o jedną kolumnę i jeden rekord aby jak najmniej obciążyć system. Rozwiązanie tragiczne technicznie ale działające na 100%.
Inne rozwiązanie aby nie pytać iluś tam tabel to utworzenie specjalnej tabeli w której odpowiedni triger będzie zapisywał numer najwyższego indeksu z interesujących cię tabel. Taki triger prawie nie powiększy obciążenia silnika bazodanowego bo w końcu działa tylko w trakcie insertów i dodatkowo ty zapytasz jedną bardzo prostą tabelę co będzie zdecydowanie szybsze.
Jeśli nie chcesz robić trigera (co chyba jednak polecam), to zawsze możesz napisać prosty widok który po stronie serwera zapyta interesujące cię tabele o nowe dane. Ty wywołasz widok i otrzymasz interesujące cie dane.

Ostatnie rozwiązanie, chyba najlepsze z możliwych to zmiana silnika bazodanowego. Do wyboru jest trochę porządnych silników w wersji darmowej obsługujących notyfikację.

1
Majster napisał(a):

Witam,

każdy user na oddzielną tablicę

Dlaczego sobie obiecujesz że zmiana technologii, przy chorym projekcie bazy danych jak powyżej, da efekt?
Najpierw doprowadź bazę do sensownego projektu

0

Dziękuję robertz68 za wyczerpującą odpowiedź.
Poszukałem o notyfikacji zmian i znalazłem artykuł o FireDac'u: Data Change Notifications (FireDAC). Czy przesiadka na PostgreSQL będzie dobrym wyborem?

0

Chyba chcesz armatą zabić muchę. Jak bardzo chcesz to jest jeszcze coś takiego https://debezium.io/
Dobrze ci kolega napisał żebyś na początku naprawił bazę bo osobne tabele na pracownika to jakaś masakra. Podane wyżej rozwiązania są ok czyli odpytywanie co jakiś czas i/lub zapisywanie dodatkowych danych pod ten konkretny raport.

0

@Majster: tak jak koledzy powyżej sugerują, najpierw przemyśl strukturę bazy danych, na pewno osobne tabele dla userów to straszny pomysł, nie wyobrażam sobie tworzenia userów a usuwanie to już kosmos (co z danymi które utworzyli?). Jak już wszystko będzie ok to jak najbardziej pomyśl o zmianie silnika jeśli zależny ci na notyfikacjach. Nie wiem czy ta baza jest na jakimś hostingu, jeśli tak to prawie każdy hosting ma w ofercie mysql-a i postgresa. Ta druga jest naprawdę poważnym rozwiązaniem ale uwaga, jest trochę trudniejsza do zarządzania od mysql-a. Poza tym są pewne zmiany w dialekcie sql-a (chociażby rozróżnianie wielkości liter w zapytaniach). Na szczęście producent bardzo zadbał o support i można chyba znaleźć odpowiedź na każde pytanie :).

A jeszcze jedno, być może jest to silnik lokalny w wewnętrznej sieci? Wtedy dobrym rozwiązaniem jest też darmowy mssql. Innym rozwiązaniem jest firebird który bardzo dobrze działa z firedac a jego instalka ma kilka MB. Jednak jest to typowa baza lokalna, bardzo źle działa w internecie.

0

Dziękuję wszystkim za podpowiedzi. Nie tyle każdy user ma swoją tablicę lecz każdy projekt. Może to złe podejście - mianowicie jest tablica główna, w której są wszystkie projekty, realizujący te projekty userzy, daty rozpoczęcia i zakończenia, wielkość projektu (zakres) itp. Do tego każdy projekt ma swoją tablicę szczegółową, w której poszczególni userzy zapisują postęp prac (data, zakres_prac - jest ich kilkanaście, oraz prognozy zakończenia na podstawie bieżących przerobów).
Przyznam szczerze, że celowo program tworzy nową tabelę dla nowego projektu, gdyż wydawało mi się to sensowniejsze w kontekście raportowania - wówczas każdy user raportuje do swojej tablicy i odpadło zagadnienie, że w tym samym czasie do tej samej tablicy będą dopisywać się różni userzy.

@robertz68 odpowiadając na Twoje pytanie - baza jest na hostingu az.pl (VPS) z dostępem przez internet. Zainstaluję PostgreSQL i spróbuję z tymi notyfikacjami.

0

Trochę nie na temat, ale skoro już zacząłeś pisać to pociągnę dalej.

Majster napisał(a):

Może to złe podejście - mianowicie jest tablica główna, w której są wszystkie projekty, realizujący te projekty userzy, daty rozpoczęcia i zakończenia, wielkość projektu (zakres) itp. Do tego każdy projekt ma swoją tablicę szczegółową, w której poszczególni userzy zapisują postęp prac (data, zakres_prac - jest ich kilkanaście, oraz prognozy zakończenia na podstawie bieżących przerobów).

Całkowicie niezgodnie ze sztuką. Zrób jedną tabelę, projekty_postepy i tam wszystko zapisuj. Szalenie uprości to cały program, w dodatku będziesz w prostu sposób mógł wybierać wszystkie dane łącznie ze wszystkich projektów. Jeśli ktoś zechce wybrać zestawienie zbiorcze w/g projektów i ich zaawansowania to przy oddzielnych tabelach będzie masakra. Przy jednej tabeli takie zapytanie będzie szalenie proste.

Majster napisał(a):

Przyznam szczerze, że celowo program tworzy nową tabelę dla nowego projektu, gdyż wydawało mi się to sensowniejsze w kontekście raportowania - wówczas każdy user raportuje do swojej tablicy i odpadło zagadnienie, że w tym samym czasie do tej samej tablicy będą dopisywać się różni userzy.

Ale co w tym złego, że do jednej tabeli pisze wielu userów? Popatrz na te forum. Masz jedną tabelę z wątkami oraz postami podpiętymi pod dany wątek. Wielu userów może zapisywać posty w tym samym czasie i to nic złego, nikt nie tworzy dla różnych wątków nowych tabel.

Majster napisał(a):

@robertz68 odpowiadając na Twoje pytanie - baza jest na hostingu az.pl (VPS) z dostępem przez internet. Zainstaluję PostgreSQL i spróbuję z tymi notyfikacjami.

A łączenie się do zdalnej bazy danych przez internet moim zdaniem jest co najmniej kiepskim pomysłem. Ani to bezpieczne, ani szybkie, ani wydajne. W ogóle jaki masz powód instalowania bazy w internecie?

0
Mr.YaHooo napisał(a):

Całkowicie niezgodnie ze sztuką. Zrób jedną tabelę, projekty_postepy i tam wszystko zapisuj. Szalenie uprości to cały program, w dodatku będziesz w prostu sposób mógł wybierać wszystkie dane łącznie ze wszystkich projektów. Jeśli ktoś zechce wybrać zestawienie zbiorcze w/g projektów i ich zaawansowania to przy oddzielnych tabelach będzie masakra. Przy jednej tabeli takie zapytanie będzie szalenie proste.

Dzięki za komentarz. Skorzystam zatem i zadam jeszcze pytanie. Tak więc obecnie mam np. 10 projektów (czyli 10 tabel). W każdej tabeli mam kolumnę dzień (TDate), która jest indeksem głównym i np. 8 kolumn odpowiadających postępowi poszczególnych robót (Integer) - robota_1, robota_2 ... robota_8. Mam kod, który podczas zakładania nowego projektu tworzy mi tabelę o ustalonej strukturze (dla uproszczenia załóżmy, że mam razem 9 kolumn).
Jeśli dobrze rozumiem to w przypadku, gdybym miał trzymać to w jednej tabeli miałbym jak poprzednio kolumnę dzień (TDate), a informacja o postępie poszczególnych 8 robót dla każdego projektu byłaby zapisywana w kolejnych kolumnach:

  • dla pierwszego projektu: robota_1_1, robota_1_2 ... robota_1_8
  • dla drugiego: robota_2_1, robota_2_2 ... robota_2_8
  • dla dziesiątego: robota_10_1, robota_10_2 ... robota_10_8

Czyli powiększam (dokładam kolumny) dla każdego nowego projektu? Moje pytania mogą być śmieszne, ale pierwszy raz stykam się z bazami danych.

Mr.YaHooo napisał(a):

Ale co w tym złego, że do jednej tabeli pisze wielu userów? Popatrz na te forum. Masz jedną tabelę z wątkami oraz postami podpiętymi pod dany wątek. Wielu userów może zapisywać posty w tym samym czasie i to nic złego, nikt nie tworzy dla różnych wątków nowych tabel.

Aby skrócić pytanie (mam skłonność do rozpisywania się) zapytam - czy jeśli 2 userów w tym samym momencie edytuje ten sam rekord (np. dzień o wartości 18.11.2019) i w tym samym momencie wywoła na swoim kompie ADODataSet.Post; to czy takie zdarzenie nie ma prawa wywołać błędu? Czy wówczas to serwer "kolejkuje" sobie tych ancymonów, którzy "na raz" chcą zapisać zmiany? Obawiałem się, że wywoła to błąd i dlatego odseparowałem zapis przez różnych userów na różne tablice...

Mr.YaHooo napisał(a):

A łączenie się do zdalnej bazy danych przez internet moim zdaniem jest co najmniej kiepskim pomysłem. Ani to bezpieczne, ani szybkie, ani wydajne. W ogóle jaki masz powód instalowania bazy w internecie?

Tworzę tą aplikację jako pierwszą swoją zdalną bazę danych. Idea jest taka, że userzy raportują postęp prac, a wszytsko składane jest w całość i powstaje harmonogram. Nie mam serwera (i nie umiałbym go skonfigurować) więc bazę danych umieściłem na hostingu. Poszczególni userzy są w rożnych miejscach (najczęściej pozbawionych stałego dostępu do internetu). Zatem wymyśliłem sobie, że poprzez aplikację desktopową w Delphi będą zapisywać dane o postępie robot z wykorzystaniem internetu po LTE. To trafiać będzie do jednego miejsca (VPS), aby na bieżąco był widoczny postęp prac.

0

Tabela z 4 kolumnami: dzien, id_projektu, id_roboty, postep. Klucz główny to pierwsze 3 kolumny.
Zmieścisz tam te same informacje a dużo prostsza w ogarnięciu.

0
Majster napisał(a):

Dzięki za komentarz. Skorzystam zatem i zadam jeszcze pytanie. Tak więc obecnie mam np. 10 projektów (czyli 10 tabel). W każdej tabeli mam kolumnę dzień (TDate), która jest indeksem głównym i np. 8 kolumn odpowiadających postępowi poszczególnych robót (Integer) - robota_1, robota_2 ... robota_8. Mam kod, który podczas zakładania nowego projektu tworzy mi tabelę o ustalonej strukturze (dla uproszczenia załóżmy, że mam razem 9 kolumn).
Jeśli dobrze rozumiem to w przypadku, gdybym miał trzymać to w jednej tabeli miałbym jak poprzednio kolumnę dzień (TDate), a informacja o postępie poszczególnych 8 robót dla każdego projektu byłaby zapisywana w kolejnych kolumnach:

  • dla pierwszego projektu: robota_1_1, robota_1_2 ... robota_1_8
  • dla drugiego: robota_2_1, robota_2_2 ... robota_2_8
  • dla dziesiątego: robota_10_1, robota_10_2 ... robota_10_8

Czyli powiększam (dokładam kolumny) dla każdego nowego projektu? Moje pytania mogą być śmieszne, ale pierwszy raz stykam się z bazami danych.

Nie, nie, nie i jeszcze raz nie ;) Dodając jakąkolwiek robotę do bazy nie dodajesz żadnych kolumn. Generalnie Twój program ma tylko dodawać dane do bazy, a nie zmieniać jej strukturę. Ja zaprojektowałbym to np. tak:

tabela projekty

pole typ
id int
nazwa varchar(20)

druga tabela projekty_postep

pole typ
id int
projekt_id int
robota_nr int
robota_nazwa varchar(20)
data_rozpoczecia date
data_zakonczenia date

Wtedy dokładając nową robotę dokładasz nowy rekord w tabeli, a nie nową kolumnę. Można się zastanowić czy istnieje stały słownik robót i dodać tabelę nr 3.

Majster napisał(a):

Aby skrócić pytanie (mam skłonność do rozpisywania się) zapytam - czy jeśli 2 userów w tym samym momencie edytuje ten sam rekord (np. dzień o wartości 18.11.2019) i w tym samym momencie wywoła na swoim kompie ADODataSet.Post; to czy takie zdarzenie nie ma prawa wywołać błędu? Czy wówczas to serwer "kolejkuje" sobie tych ancymonów, którzy "na raz" chcą zapisać zmiany? Obawiałem się, że wywoła to błąd i dlatego odseparowałem zapis przez różnych userów na różne tablice...

Ale pamiętaj, że w takim układzie jak ja zaprezentowałem userzy będą edytować zupełnie inne rekordy, sytuacja o której mówisz rzeczywiście może mieć miejsce i każdy program powinien być przygotowany na sytuację edycji tego samego rekordu przez różnych userów.

Majster napisał(a):

Tworzę tą aplikację jako pierwszą swoją zdalną bazę danych. Idea jest taka, że userzy raportują postęp prac, a wszytsko składane jest w całość i powstaje harmonogram. Nie mam serwera (i nie umiałbym go skonfigurować) więc bazę danych umieściłem na hostingu. Poszczególni userzy są w rożnych miejscach (najczęściej pozbawionych stałego dostępu do internetu). Zatem wymyśliłem sobie, że poprzez aplikację desktopową w Delphi będą zapisywać dane o postępie robot z wykorzystaniem internetu po LTE. To trafiać będzie do jednego miejsca (VPS), aby na bieżąco był widoczny postęp prac.

Moim zdaniem powinieneś postawić zwykłą maszynę ze zwykłym serwerem u siebie. Jeśli nie chcesz bawić się w administrację i tak dalej zainstaluj wspomniany wcześniej Firebird. Instalka mała, parę klików zainstalowane, praktycznie bezobsługowy system przy takiej wielkości bazy danych jak u Ciebie się zapowiada. Jedyne co trzeba zrobić to zazwyczaj odblokować firewalla oraz ustawić robienie backupów baz danych.

0

Bardzo dziękuję wszystkim za podpowiedzi !

Podejście, które miałem dotychczas mega wszystko komplikowało - tzn. założenie, że kluczem głównym jest data, a tym samym, że kilku userów może edytować ten sam rekord (możliwe błędy podczas jednoczesnego zapisu).

Podpowiedź Delor i Mr.YaHooo - genialna w swej prostocie :)
Czy może podpowiecie jakąś dobrą książkę, w której takie kwestie są "zebrane" - muszę zgłębić temat bo generalnie błądzę :| Przerobiłem książkę Delphi in Depth: FireDAC - Cary Jensen i sporo mi się wyjaśniło w zakresie obsługi bazy danej po stronie Klienta. Widzę jednak, że kuleje u mnie mocno kwestia samej struktury, relacji, itp. Stąd pytanie o książkę?

Mr.YaHooo napisał(a):

Ale pamiętaj, że w takim układzie jak ja zaprezentowałem userzy będą edytować zupełnie inne rekordy, sytuacja o której mówisz rzeczywiście może mieć miejsce i każdy program powinien być przygotowany na sytuację edycji tego samego rekordu przez różnych userów.

Czy to przygotowanie programu na sytuację edycji tego samego rekordu jest związane z np. transakcjami (które wykluczą wieszanie aplikacji usera), czy może jest opcja "kolejkuj", którą wystarczy włączyć i sam serwer poradzi sobie z tą sytuacją?

Moim zdaniem powinieneś postawić zwykłą maszynę ze zwykłym serwerem u siebie. Jeśli nie chcesz bawić się w administrację i tak dalej zainstaluj wspomniany wcześniej Firebird. Instalka mała, parę klików zainstalowane, praktycznie bezobsługowy system przy takiej wielkości bazy danych jak u Ciebie się zapowiada. Jedyne co trzeba zrobić to zazwyczaj odblokować firewalla oraz ustawić robienie backupów baz danych.

Ok dzięki za podpowiedź - spróbuję przetestować.

Tylko mam pytanie odnośnie Firebirda - @robertz68 pisze:

robertz68 napisał(a):

Innym rozwiązaniem jest firebird który bardzo dobrze działa z firedac a jego instalka ma kilka MB. Jednak jest to typowa baza lokalna, bardzo źle działa w internecie.

Czy serwer u mnie z postawionym Firebird podpięty to internetu i obsługiwany przez FireDAC będzie działał elegancko ? :)

0
Majster napisał(a):

Czy serwer u mnie z postawionym Firebird podpięty to internetu i obsługiwany przez FireDAC będzie działał elegancko ? :)

Serwer podpinaj do czego chcesz, to nie ma znaczenia. Chodzi o to że łączenie się z bazą danych firebird przez protokoły internetowe jest powiedzmy "niezbyt efektywne". Protokół firebird to tzw. ciężki protokół i widać mocne opóźnienie w czasie pracy na takiej bazie. Nie chodzi o ilość danych a bardziej o ilość zapytań. Są oczywiście rozwiązania, np. kompresja połączenia (chyba tylko płatne rozwiązania), webserwis pośredniczący w połączeniu (trochę skomplikowane), lub po prostu RDP ale to jest bardzo drogie rozwiązanie.
Oczywiście nie oznacza że nie da się tak pracować, aż tak źle nie jest, szczególnie w prostych bazach. Sam mam klienta który tak pracuje i mówi że i tak jest szybciej niż praca przez przeglądarkę - jego opinia.

Co do firebirda, jest to tzw. baza transakcyjna. Czyli każdy zapis zmieniający dane wykonujesz jako transakcję. Jest to teoretycznie proste. Kiedyś @abrakadaber w skrócie opisał jak to działa https://4programmers.net/Forum/932797

Robiąc program "komercyjny" zabezpiecz się też na ile możesz przed oskarżeniem że coś nie działa przez twój program a nie błędy obsługi. Ja zawsze tworzę historię zmian gdzie zapisuję sobie co użytkownik zrobił, szczególnie w wersji sieciowej. Nie raz udowodniłem że to obsługa coś usunęła czy zmieniła a nie "samo" zniknęło.

Problem "mułowatej" pracy przez internet rozwiążesz używając np. mssql express. Ograniczenie do 10 GB na plik bazy chyba ci wystarczy :)

No i najważniejsze, każdą bazę, nie ważne w jakiej technologii archiwizuj ile się da. Przy pracy przez internet należy się do tego przyłożyć.

1
Majster napisał(a):

Tworzę tą aplikację jako pierwszą swoją zdalną bazę danych. Idea jest taka, że userzy raportują postęp prac, a wszytsko składane jest w całość i powstaje harmonogram. Nie mam serwera (i nie umiałbym go skonfigurować)

Podstawowa konfiguracja serwera bazy danych (najczęsciej) sprowadza się do odpalenia instalatora.
Spróbuj, a potem pisz, że nie umiesz :)

więc bazę danych umieściłem na hostingu.

Eee...

Poszczególni userzy są w rożnych miejscach (najczęściej pozbawionych stałego dostępu do internetu). Zatem wymyśliłem sobie, że poprzez aplikację desktopową w Delphi będą zapisywać dane o postępie robot z wykorzystaniem internetu po LTE. To trafiać będzie do jednego miejsca (VPS), aby na bieżąco był widoczny postęp prac.

A co jeśli tam, gdzie jest użytkownik, nie ma LTE ani w ogóle dostępu do sieci?
Taka aplikacja powinna pracować w trybie (jak się to kiedyś nazywało) "briefcase".
Po prostu jeśli serwer jest aktualnie niedostępny, to wszystkie zmiany są zapisywane lokalnie.
Synchronizacja powinna nastąpić automatycznie, kiedy apka posiada dostęp do serwera.
Ale to nie jest takie proste do zrobienia...

A poza tym, z tym śledzeniem zmian, jakie Delphi?
Skoro mowa o FireDA, to pewnie jakieś nie stare.
Skoro tak, to dlaczego nie wykorzystasz App Tethering?
http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_App_Tethering

Po prostu kiedy dany klient cokolwiek zmianie, czym powinny być powiadomione inne aplikacje, wysyła komunikat.
One go słuchają i reagują na niego w odpowiedni sposób - np odświeżając wykres.
A wszystko bez serwera no i masz to dostępne w Delphi.

Można podobnie, ale już z wykorzystaniem kolejki komunikatów. Tylko tu niezbędny będzie serwer, który będzie zarządzał komunikatami.
Masz tu wiele opcji do wybory, ale z tego co czytam, to wybrałbym najprostszą z nich, czyli np.
Klient:
https://github.com/crossrw/mqttClient
I serwer opaty o Eclipse Mosquitto.

I wtedy będziesz miał aplikację praktycznie real-time.

0
robertz68 napisał(a):

Problem "mułowatej" pracy przez internet rozwiążesz używając np. mssql express. Ograniczenie do 10 GB na plik bazy chyba ci wystarczy :)

Ciekawość, w jaki sposób i dlaczego MSSQL będzie lepszy w pracy przez internet od np. Firebird czy PostgreSQL?

A tak w ogóle, to moim zdaniem, ważniejsze jest poprawna obsługa odzyskiwania utraconego połączenia z serwerem (co przy pracy przez internet, wydarzy się prędzej czy później) niż zmiana serwera.

0
wloochacz napisał(a):

Ciekawość, w jaki sposób i dlaczego MSSQL będzie lepszy w pracy przez internet od np. Firebird czy PostgreSQL?

A już odpowiadam przytaczając fragment z artykułu FAQ Firebird-a:

http://www.firebirdfaq.org/faq53/

Firebird has a rather heavy network protocol (a lot of chit-chat), so it isn't really comfortable to work accross the Internet

Niestety, sam producent twierdzi że ich baza nie do końca nadaje się do takiej pracy, jasne, da się gdy jest się cierpliwym lub skorzysta z kompresji ale można też jak pisałem użyć innej bazy. Ja przytoczyłem mssql ale postgres nadaje się także idealnie. Jeśli ilość jednocześnie czytanych rekordów będzie rozsądna lub nie będzie używany fetchall to w zasadzie nie widać różnicy na wymienionych przeze mnie bazach przy pracy lokalnej i przez internet.
Co innego lokalnie. Sam bardzo często używam firebirda i bardzo go lubię.Chociaż nie do końca podoba mi się darmowa wersja IBExperta.

0
wloochacz napisał(a):

A co jeśli tam, gdzie jest użytkownik, nie ma LTE ani w ogóle dostępu do sieci?
Taka aplikacja powinna pracować w trybie (jak się to kiedyś nazywało) "briefcase".
Po prostu jeśli serwer jest aktualnie niedostępny, to wszystkie zmiany są zapisywane lokalnie.
Synchronizacja powinna nastąpić automatycznie, kiedy apka posiada dostęp do serwera.
Ale to nie jest takie proste do zrobienia...

To może kiedyś :) Póki co jest dość siermiężnie - nie ma neta, nie ma raportu :)

wloochacz napisał(a):

A poza tym, z tym śledzeniem zmian, jakie Delphi?
Skoro mowa o FireDAC, to pewnie jakieś nie stare.
Skoro tak, to dlaczego nie wykorzystasz App Tethering?

Mam Delphi 10.3 Rio i jaki piszesz jest tam App Tethering.

wloochacz napisał(a):

Po prostu kiedy dany klient cokolwiek zmieni, o czym powinny być powiadomione inne aplikacje, wysyła komunikat.
One go słuchają i reagują na niego w odpowiedni sposób - np odświeżając wykres.
A wszystko bez serwera no i masz to dostępne w Delphi.

Próbowałem kiedyś App Tethering ale wówczas testowałem komunikację pomiędzy smatrfonem a PC'tem - wszystko fajnie działało, ale w sieci lokalnej (komórka po WiFi a PC'et po kablu były podpięte do routera).
W tym przypadku każdy user będzie miał inne IP publiczne (najczęściej dynamiczne, choć to mniejszy problem).

Przechodząc do pytania - o ile moja aplikacja odczyta sobie IP publiczne, poprzez które łączy się z bazą danych - to jak przy pomocy App Tethering spiąć w całość tych rozsianych userów?

0
Majster napisał(a):

Podejście, które miałem dotychczas mega wszystko komplikowało - tzn. założenie, że kluczem głównym jest data, a tym samym, że kilku userów może edytować ten sam rekord (możliwe błędy podczas jednoczesnego zapisu).

Dokładnie, dlatego moim zdaniem struktura bazy jest do całkowitej poprawki.

Majster napisał(a):

Czy może podpowiecie jakąś dobrą książkę, w której takie kwestie są "zebrane" - muszę zgłębić temat bo generalnie błądzę :| Przerobiłem książkę Delphi in Depth: FireDAC - Cary Jensen i sporo mi się wyjaśniło w zakresie obsługi bazy danej po stronie Klienta. Widzę jednak, że kuleje u mnie mocno kwestia samej struktury, relacji, itp. Stąd pytanie o książkę?

Szczerze to nie mam pojęcia jaką książkę Ci polecić. Ale poczytaj o postaciach normalnych to na bank Ci się przyda.

Majster napisał(a):

Czy to przygotowanie programu na sytuację edycji tego samego rekordu jest związane z np. transakcjami (które wykluczą wieszanie aplikacji usera), czy może jest opcja "kolejkuj", którą wystarczy włączyć i sam serwer poradzi sobie z tą sytuacją?

Serwer sam z niczym sobie nie poradzi. Firebird w takim przypadku zwróci konflikt transakcji i wywali wyjątek. Dopiero aplikacja może zdecydować do z tym fantem zrobić dalej. W przypadku gdy łączysz się poprzez serwer aplikacji (masz cienkiego klienta) to serwer który napiszesz i do którego łączy się klient może faktycznie skolejkować takie żądania. Jednak nie wiem czy to jest dobre. Wtedy user który dokona pierwszy edycji danego rekordu będzie zaskoczony, że jego zmian nie widać.

Majster napisał(a):

Czy serwer u mnie z postawionym Firebird podpięty to internetu i obsługiwany przez FireDAC będzie działał elegancko ? :)

Z doświadczenia własnego powiem Ci, że nie. Niestety nie doczytałem Twojego posta dokładnie.... i nie zrozumiałem, że userzy siedzą w różnych lokalizacjach. Tutaj musisz mieć albo bazę wystawioną na zewnątrz oraz grubego klienta, albo np serwer rest itp i cienkiego klienta, całość wystawiona na zewnątrz. Istnieje jeszcze 3 opcja, czyli zwykły klient z lokalną bazą danych oraz serwer RDP. W swoim systemie właśnie tak obsługuję klientów zdalnych.

0

@Mr.YaHooo: odpowiem normalnie na komentarz.

Moje słowa: "Jeśli ilość jednocześnie czytanych rekordów będzie rozsądna" - 100 k rekordów to daleko poza wszelkim rozsądkiem jeśli chodzi o grida przez internet, szczerze to nawet lokalnie jest to mocne obciążanie silnika bazodanowego ale w to nie wnikam, widocznie jest taka potrzeba :).
Twoje słowa: "scrollowanie grida pokazywało odczuwalne opóźnienia" - no jasne że tak będzie, jednak medium jest zdecydowanie wolniejsze (chociaż to przecież zależy). Dlatego właśnie aplikacje webowe wczytują dane po paręnaście rekordów i to dopiero jest hardcore. Przy pracy przez internet musisz mocno przemyśleć organizację danych w gridach. Stosuj filtrowanie, nie pozwalaj na zbyt duże zakresy pobieranych danych. Użytkownicy którzy nie tworzą zestawień nie muszą widzieć rekordów z dużego okresu (czasami w ogóle nie muszą ich widzieć). Ja zezwalam na większy zakres tylko użytkownikom o dużych uprawnieniach - czyli z założenia wiedzących co robią.

0
robertz68 napisał(a):

Moje słowa: "Jeśli ilość jednocześnie czytanych rekordów będzie rozsądna" - 100 k rekordów to daleko poza wszelkim rozsądkiem jeśli chodzi o grida przez internet, szczerze to nawet lokalnie jest to mocne obciążanie silnika bazodanowego ale w to nie wnikam, widocznie jest taka potrzeba :).

Generalnie się z Tobą zgadzam, ale widziałem wymaganie, żeby załadować do grida 1mln rekordów. Tu mi po prostu szczęka opadła... Domyślnie u siebie ładuję tylko tyle ile widać w gridzie. Jednak mamy nawigację klawiaturą po gridzie i jednym ze skrótów jest Ctrl+End który to skacze na koniec query. Jak mamy dużo danych to sobie można poczekać :)

robertz68 napisał(a):

Twoje słowa: "scrollowanie grida pokazywało odczuwalne opóźnienia" - no jasne że tak będzie, jednak medium jest zdecydowanie wolniejsze (chociaż to przecież zależy). Dlatego właśnie aplikacje webowe wczytują dane po paręnaście rekordów i to dopiero jest hardcore. Przy pracy przez internet musisz mocno przemyśleć organizację danych w gridach. Stosuj filtrowanie, nie pozwalaj na zbyt duże zakresy pobieranych danych. Użytkownicy którzy nie tworzą zestawień nie muszą widzieć rekordów z dużego okresu (czasami w ogóle nie muszą ich widzieć). Ja zezwalam na większy zakres tylko użytkownikom o dużych uprawnieniach - czyli z założenia wiedzących co robią.

Tak, to prawda, tylko nie za bardzo widzę czasami możliwość ograniczenia danych (chociażby wyżej wspomniana kartoteka kontrahentów, w dużej firmie 100k jest całkiem realną wielkością kartoteki, w przypadku systemów produkcyjnych kartoteka towarowa też łatwo osiąga te wielkości). Wiadomo, że nie ładuję od razu wszystkich rekordów do pamięci, jednak czasami po prostu nie da się ograniczyć danych które zwróci zapytanie. Czasami użytkownicy chcą widzieć po prostu wszystkie dane i poprzeglądać je sobie (nie wnikam, czasami nasz klient, nasz Pan i nic się z tym nie da zrobić). Osobiście nie pracuję nigdy poprzez internet, jeśli jest wymaganie aby system pracował z odległej lokalizacji, polecam RDP i wszystko gra.

0
Mr.YaHooo napisał(a):
robertz68 napisał(a):

Moje słowa: "Jeśli ilość jednocześnie czytanych rekordów będzie rozsądna" - 100 k rekordów to daleko poza wszelkim rozsądkiem jeśli chodzi o grida przez internet, szczerze to nawet lokalnie jest to mocne obciążanie silnika bazodanowego ale w to nie wnikam, widocznie jest taka potrzeba :).

Generalnie się z Tobą zgadzam, ale widziałem wymaganie, żeby załadować do grida 1mln rekordów.
Tu mi po prostu szczęka opadła...

Założę się, że nie takie było wymaganie.
Tak ono zostało przedstawione przez leniwych programistów ;-)
User po prostu chce wiedzieć wszystkie dane i w nosie ma czy jest tego 10 czy 10 mln.
A programiście się nie chce oprogramować stronicowania danych, wirtualnego scrolla lub server mode - zwał jak zwał, ale zawsze chodzi o jedno.
O pobieranie i pokazywanie tej paczki danych, która aktualnie user ogląda.
I nie chodzi tu o przyrostowe pobieranie danych z serwera, bo to mija się z celem np. przy naciśnięciu CTRL+END na gridzie.

Domyślnie u siebie ładuję tylko tyle ile widać w gridzie. Jednak mamy nawigację klawiaturą po gridzie i jednym ze skrótów jest Ctrl+End który to skacze na koniec query. Jak mamy dużo danych to sobie można poczekać :)

No właśnie dokładnie o tym piszę powyżej...

robertz68 napisał(a):

Twoje słowa: "scrollowanie grida pokazywało odczuwalne opóźnienia" - no jasne że tak będzie, jednak medium jest zdecydowanie wolniejsze (chociaż to przecież zależy). Dlatego właśnie aplikacje webowe wczytują dane po paręnaście rekordów i to dopiero jest hardcore.

Dlaczego?
Jeżeli jest to zaimplementowane poprawnie, to działa całkiem sprawnie.

Przy pracy przez internet musisz mocno przemyśleć organizację danych w gridach. Stosuj filtrowanie, nie pozwalaj na zbyt duże zakresy pobieranych danych. Użytkownicy którzy nie tworzą zestawień nie muszą widzieć rekordów z dużego okresu (czasami w ogóle nie muszą ich widzieć). Ja zezwalam na większy zakres tylko użytkownikom o dużych uprawnieniach - czyli z założenia wiedzących co robią.

Tak, to prawda, tylko nie za bardzo widzę czasami możliwość ograniczenia danych (chociażby wyżej wspomniana kartoteka kontrahentów, w dużej firmie 100k jest całkiem realną wielkością kartoteki, w przypadku systemów produkcyjnych kartoteka towarowa też łatwo osiąga te wielkości).

Wiadomo, że nie ładuję od razu wszystkich rekordów do pamięci, jednak czasami po prostu nie da się ograniczyć danych które zwróci zapytanie.

Ale dane zawsze można stronicować.
Nie zawsze jest to proste, trudno znaleźć ogólne rozwiązanie, ale jak najbardziej możliwe.

Czasami użytkownicy chcą widzieć po prostu wszystkie dane i poprzeglądać je sobie (nie wnikam, czasami nasz klient, nasz Pan i nic się z tym nie da zrobić).

Od tego jest właśnie stronicowanie i/lub tzw. virtual mode.
Co ciekawe, FireDAC obsługuje coś takiego by-design (tzw. LiveData Window), ale ma to swoje ograniczenia.

Osobiście nie pracuję nigdy poprzez internet, jeśli jest wymaganie aby system pracował z odległej lokalizacji, polecam RDP i wszystko gra.

Niby tak, ale... to jest trochę takie "nie chce mi się" ;-)

0
wloochacz napisał(a):

Założę się, że nie takie było wymaganie.
Tak ono zostało przedstawione przez leniwych programistów ;-)
User po prostu chce wiedzieć wszystkie dane i w nosie ma czy jest tego 10 czy 10 mln.

Nie mam pojęcia, opowiadał mi to znajomy, ponoć jego szef (zupełnie nietechniczny) powiedział, że chce widzieć wszystkie dane w oknie. A danych było w okolicach 1M rekordów.
Ale faktycznie user (tak samo ja) chc widzieć wszystkie dane, najlepiej bez żadnego stronicowania. Po prostu niektórych wymagań nie da się sensownie pogodzić.

wloochacz napisał(a):

Od tego jest właśnie stronicowanie i/lub tzw. virtual mode.
Co ciekawe, FireDAC obsługuje coś takiego by-design (tzw. LiveData Window), ale ma to swoje ograniczenia.

Niestety nie miałem z tym styczności, ale kto wie, może kiedyś się coś ulepszy.

wloochacz napisał(a):

Niby tak, ale... to jest trochę takie "nie chce mi się" ;-)

Masz tutaj 100% racji ;)

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