Thread View: pl.comp.programming
15 messages
15 total messages
Started by Szyk Cech
Sat, 27 Jul 2019 15:11
Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Szyk Cech
Date: Sat, 27 Jul 2019 15:11
Date: Sat, 27 Jul 2019 15:11
53 lines
3315 bytes
3315 bytes
Witam Chcę rozpocząć nowy projekt od zera. Projekt będzie dotyczył prostego programu edukacyjnego do nauki angielskiego (takie lepsze SuperMemo) opartego o bazę danych. Program ma być dostosowany do użytku na sprytnych telefonach komórkowych z systemem Android (oraz na tabletach i PC z Windows lub Linux). Chcę do tego projektu zrobić bazę danych. Jednak nie głupią. Oczekiwane cechy modułu bazy danych: * zamyka w sobie całą specyfikę biblioteki pośredniczącej, motoru i zapytań Sql-a. * struktura bazy danych generuje się automatycznie z klas C++. Klasy zachowalne w bazie są wzbogacane o makra: PRIMARY_KEY, FOREIGN_KEY(klasa.zmienna1, klasa.zmiennaN), INDEX, NO_STORE. Makra te nic nie robią z poziomu C++, mają znaczenie tylko dla parsera klas zachowalnych. * przed zbudowaniem aplikacji jest uruchamiany parser klas zachowalnych * parser klas zachowalnych wykrywa zmiany w klasach zachowalnych i generuje: pierwszą wersję pliku struktury danych w SQL-u lub pacz w porównianiu do poprzedniej wersji, oraz nową wersję klasy bazy danych. * parser dodaje do pacza pustą i popsutą metodę migrateData() którą trzeba naprawić i odpowiednio uzupełnić (bez naprawienia się nie skompiluje). * po skompilowaniu uruchamiana aplikacja wykrywa jakie pacze powinna zastosować na bazie i w razie potrzeby ją aktualizuje w pełni automatycznie. To wiem jak zrobić. Natomiast nie wiem, czy generowane funkcje do obsługi bazy danych: 1. Powinny znajdować się w jednej super klasie? 2. Powinny być rozrzucone w klasach serializujących poszczególne obiekty? Ja pierwotnie zrobiłem ten generator struktury baz danych i paczy do nich tak że generował jedną super klasę. Jednak nie wiem czy to prawidłowe podejście. Mi się wydaje, że tak, bo całą logikę bazy danych miałem zawsze w jednej klasie jaką sobie przezywałem using-iem tak by mimo podbijania wersji bazy nic nie zmieniać w kodzie. Jakie są zalety użycia wielu klas (po jednej do każdej zachowalnej klasy? Jak to robią korporacje? Jak się to robi w dużych systemach? dzięki tym co wytrwali do końca pozdro Szyk Cech
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Maciej Sobczak
Date: Sat, 27 Jul 2019 19:39
Date: Sat, 27 Jul 2019 19:39
16 lines
1828 bytes
1828 bytes
> Chcę rozpocząć nowy projekt od zera. Tak zawsze jest najfajniej. :-) > * struktura bazy danych generuje się automatycznie z klas C++. Dlaczego? Tylko nie pisz, żeby było łatwiej. Bo kolejne punkty, które napisałeś, to opis dodatkowych kosztów, które musisz ponieść. I to tylko tych, które przewidziałeś. > Jak to robią korporacje? Jak się to robi w dużych systemach? Czasami jeszcze gorzej... -- Maciej Sobczak * http://www.inspirel.com
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Szyk Cech
Date: Sat, 27 Jul 2019 19:57
Date: Sat, 27 Jul 2019 19:57
15 lines
1853 bytes
1853 bytes
>> * struktura bazy danych generuje się automatycznie z klas C++. > > Dlaczego? Hasło: DRY (ang.: Don't repeat yourself.). Nie zmierzam robić tego raz. Chcę stworzyć mechanizm generowania baz dla wszelkich moich projektów bazodanowych. Chcę mieć potem wygodę używania tego rozwiązania (tak wiem by to osiągnąć muszę napisać drugie tyle testów automatycznych). SOCI ma pełnić w tym kluczową rolę, bo jak rozumiem przykrywa nawet specyficzną składnię danego motoru (ujednolica ją). Prawdopodobnie będę musiał użyć wersji 3.x z uwagi na stabilność. Szkoda, że nie wiadomo jakie są różnice między wersjami 3.x a 4.0...
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Maciej Sobczak
Date: Sun, 28 Jul 2019 19:58
Date: Sun, 28 Jul 2019 19:58
31 lines
3048 bytes
3048 bytes
> >> * struktura bazy danych generuje się automatycznie z klas C++. > > > > Dlaczego? > > Hasło: DRY (ang.: Don't repeat yourself.). No ale gdzie to "repeat" miałoby być? > Nie zmierzam robić tego raz. Tym gorzej. Bo jeśli to nie jest dobre rozwiązanie (a tego jeszcze nie ustaliliśmy), to będziesz miał N źle zrobionych projektów. > SOCI ma pełnić w tym kluczową rolę, bo jak rozumiem przykrywa nawet > specyficzną składnię danego motoru (ujednolica ją). Niezupełnie przykrywa, chociaż miejscami próbuje. Tam, gdzie leci string, tam nie przykrywa - ten string ma być zrozumiały dla docelowej bazy. Natomiast to, co przykrywa i to dosyć starannie, to wywołania natywnych API klienckich. > Prawdopodobnie będę > musiał użyć wersji 3.x z uwagi na stabilność. Z uwagi na stabilność najlepiej użyj najświeższej wersji z GitHuba, nie patrząc jaka to wersja. Od dłuższego czasu nie ma nowych funkcji, są tylko bugfiksy - więc im świeższy kod, tym lepiej. > Szkoda, że nie wiadomo > jakie są różnice między wersjami 3.x a 4.0... Różnica jest bardzo prosta i tylko jedna: wersji 4.0 nie ma. Jeśli będzie, to będzie to najświeższa wersja z GitHuba. Właśnie dlatego nikt nie ma specjalnie motywacji, żeby to uroczyście zrobić. -- Maciej Sobczak * http://www.inspirel.com
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Tomasz Kaczanowski
Date: Mon, 29 Jul 2019 07:07
Date: Mon, 29 Jul 2019 07:07
30 lines
2616 bytes
2616 bytes
W dniu 2019-07-27 o 21:57, Szyk Cech pisze: >>> * struktura bazy danych generuje się automatycznie z klas C++. >> >> Dlaczego? > > Hasło: DRY (ang.: Don't repeat yourself.). > > Nie zmierzam robić tego raz. Chcę stworzyć mechanizm generowania baz dla > wszelkich moich projektów bazodanowych. Chcę mieć potem wygodę używania > tego rozwiązania (tak wiem by to osiągnąć muszę napisać drugie tyle > testów automatycznych). > > SOCI ma pełnić w tym kluczową rolę, bo jak rozumiem przykrywa nawet > specyficzną składnię danego motoru (ujednolica ją). Prawdopodobnie będę > musiał użyć wersji 3.x z uwagi na stabilność. Szkoda, że nie wiadomo > jakie są różnice między wersjami 3.x a 4.0... Problem jest taki, że takie przebudowywanie bazy od strony programu wprowadza na bazę ograniczenia (szczególnie jeśli chodzi o rzeczy specyficzne dla danego silnika bazodanowego), po wtóre potrafi wygenerować dodatkowe problemy. Nadzorowanie struktury bazy z klienta to proszenie się o kłopoty. Pracuje przy jednym podobnym projekcie, kto w ten sposób obmyślił, niby wszystko fajnie, ale niestety jeśli potrzeba cos poprawić / zoptymalizować, zaczynają się schody. Dużo lepsze rozwiązanie było w poprzedni projekcie, przy którym pracowałem, gdzie baza była niezależna od kodu klienta, jeśli chodzi o strukturę. Jedyne co to baza pozwalała się podpiąć bądź nie w zależności od wersji programu. -- http://kaczus.ppa.pl
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Szyk Cech
Date: Mon, 29 Jul 2019 15:03
Date: Mon, 29 Jul 2019 15:03
8 lines
1691 bytes
1691 bytes
On 29.07.2019 09:07, Tomasz Kaczanowski wrote: > Nadzorowanie struktury bazy z klienta to proszenie się o kłopoty. Chodzi o to by warstwa bazy danych była całkowicie zautomatyzowana (automatyzacja to atut systemów komputerowych). Ten mój generator będzie generował klasę Database_N_M w oparciu o klasy zachowalne umiejscowione w warstwie logiki biznesowej. Dopiero nad tą warstwą będzie interfejs użytkownika.
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Queequeg
Date: Mon, 29 Jul 2019 15:15
Date: Mon, 29 Jul 2019 15:15
10 lines
1307 bytes
1307 bytes
In pl.comp.programming Szyk Cech <szykcech@spoko.pl> wrote: > Jak to robią korporacje? Jak się to robi w dużych systemach? Nie chcesz wiedzieć. Korporacje rządzą się swoimi prawami. Ale może protocol buffers cię zainteresują. -- https://www.youtube.com/watch?v=9lSzL1DqQn0
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Tomasz Kaczanowski
Date: Tue, 30 Jul 2019 06:23
Date: Tue, 30 Jul 2019 06:23
27 lines
2665 bytes
2665 bytes
W dniu 2019-07-29 o 17:03, Szyk Cech napisał: > On 29.07.2019 09:07, Tomasz Kaczanowski wrote: >> Nadzorowanie struktury bazy z klienta to proszenie się o kłopoty. > > Chodzi o to by warstwa bazy danych była całkowicie zautomatyzowana > (automatyzacja to atut systemów komputerowych). Ten mój generator będzie > generował klasę Database_N_M w oparciu o klasy zachowalne umiejscowione > w warstwie logiki biznesowej. Dopiero nad tą warstwą będzie interfejs > użytkownika. Jak dla mnie abstrakcja jest wtedy gdy na najwyzszej warstwie jest funkcja, która mowi daj mi paczke danych o takich i takich parametrach, i nie wnika jak to robi funkcja. Czy tworzy zapytanie, czy korzysta z innego typu bazy (przecież bazy sql-owe to nie jedyne), czy nawet w SQL-owych, nie interesuje nas, czy pod spodem użyte jest zwykłe zapytanie, czy korzystamy z funkcji składowanej. Machanie przez ogon psem jest moim zdaniem nie najlepszym pomysłem, bo jak napisałem, właśnie to powinno być jak najbardziej odseparowane, a Ty chcesz mieć na to wpływ z poziomu kodu nie wiedząc czy to się będzie sprawdzać i skalować. Takie automaty sa fajne, jak się je pisze, a jak później użytkownik musi używać, albo musisz dodać jakąś funkcjonalność, albo optymalizację zrobić, to odbijasz się od założeń i ograniczeń automatu.Dlatego zostaw te byty jako osobne, jedynie martwiąc się o to by sprawdzić, czy są w wersjach kompatybilnych. -- http://kaczus.ppa.pl
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Maciej Sobczak
Date: Tue, 30 Jul 2019 08:51
Date: Tue, 30 Jul 2019 08:51
30 lines
3237 bytes
3237 bytes
> Chodzi o to by warstwa bazy danych była całkowicie zautomatyzowana
> (automatyzacja to atut systemów komputerowych).
Automatyzacja jest możliwa, jeśli są wszystkie dane do automatycznego przetwarzania. A projekt bazy danych nie opiera się na strukturze programu, tylko na wymaganiach, które są powyżej projektowanego programu. Czyli nawet gdybyś chciał coś automatyzować, to nie na tej ścieżce:
program
|
V
baza danych,
tylko na takich:
wymagania
| |
V V
program baza danych
I tu byś był bliżej ideału, ale zwykle wymagania nie występują w formie, na której można jakąkolwiek automatyzację uprawiać (w szczególności: zwykle nie występują w żadnej formie). Ale da się ten proces, całościowo, uprawiać ręcznie - i zwykle jest to lepsze, niż ułomna automatyzacja, która ostatecznie może kosztować więcej, niż oszczędza.
Projekt bazy danych w ogóle nie musi się zgadzać 1:1 z projektem programu. W sensie - nawet liczba tabel nie musi się zgadzać z liczbą klas. Może być nawet tak, że ze względów wydajnościowych (albo innych) struktury bazy służące do zapisu danych będą inne, niż te służące do odczytu. Albo pierdylion innych możliwości, których nie da się obsłużyć automatem parsującym kod programu.
> Ten mój generator będzie
> generował klasę Database_N_M w oparciu o klasy zachowalne umiejscowione
> w warstwie logiki biznesowej.
Lepiej nie.
Najlepszy cytat w tym temacie: "It's a data base, not a data dump."
--
Maciej Sobczak * http://www.inspirel.com
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Szyk Cech
Date: Wed, 31 Jul 2019 16:30
Date: Wed, 31 Jul 2019 16:30
10 lines
1603 bytes
1603 bytes
On 30.07.2019 08:23, Tomasz Kaczanowski wrote: > Takie automaty sa fajne, jak się je pisze, a jak później użytkownik musi > używać, albo musisz dodać jakąś funkcjonalność, albo optymalizację > zrobić, to odbijasz się od założeń i ograniczeń automatu. Oba te przypadki: * dodawanie nowej funkcjonalności * optymalizację - (zmiana struktury lub dodanie indeksu) Obsłużę z automatu...
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Szyk Cech
Date: Wed, 31 Jul 2019 16:40
Date: Wed, 31 Jul 2019 16:40
28 lines
2316 bytes
2316 bytes
> Projekt bazy danych w ogóle nie musi się zgadzać 1:1 z projektem programu.
Z tym, że mi chodzi o to by operować danymi na poziomie C++ a nie
grzebać się w SQL-u. Szczerze mówiąc nie robię przy programach gdzie
problemem jest brak odwzorowania 1:1 (tabel na klasy). Dlatego myślę, że
scenariusz odwzorowania 1:1 jest najpowszechniejszy i jego autmatyzacja
jest sensowna. Po za tym nie widzę przeszkód by osobno implementować
bardziej złożone scenariusze. Ba! Przewiduję już to w obecnej
implementacji gdzie generowane są:
Database_N_M
(N - numer główny, M - numer drugorzędny) którą przykrywam aliasem. Ta
klasa zawiera obsługę (dodawanie, nadpisywanie, odczyt pojedynczych
obiektów i otwieranie kursora do sekwencyjnego dostępu do danych) .
using Db = Database_N_M;
I z tego aliasu dziedziczę:
class Db_MyApp : public Db
{
public:
// Tu dowolne funkcje z dziedziny problemowej aplikacji.
};
Skąd Wasze opory przed robieniem takich automatów jeśli oszczędzają one
90% czasu na klepanie SQL-i?!?
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: wloochacz
Date: Wed, 31 Jul 2019 16:52
Date: Wed, 31 Jul 2019 16:52
29 lines
2366 bytes
2366 bytes
W dniu 31.07.2019 o 18:40, Szyk Cech pisze: >> Projekt bazy danych w ogóle nie musi się zgadzać 1:1 z projektem >> programu. > > Z tym, że mi chodzi o to by operować danymi na poziomie C++ a nie > grzebać się w SQL-u. Szczerze mówiąc nie robię przy programach gdzie > problemem jest brak odwzorowania 1:1 (tabel na klasy). Dlatego myślę, że > scenariusz odwzorowania 1:1 jest najpowszechniejszy i jego autmatyzacja > jest sensowna. /Ciach/ Najprostszy, a nie najpowszechniejszy. Czy jego obsługa jest sensowna? To zależy, ja jeszcze nie miałem do czynienia z tak prostym modelem danych, aby sensownie wyglądał model obiektowy przy mapowaniu 1 do 1 na bazę danych. Albo model wygląda dziwacznie, albo baza danych dostaje zadyszki przy prostych operacjach. Dla mega-prostych zastosowań, pewnie czemu nie. A tak poza tym... dziwie się, że jeszcze nikt nie podrzucił słowa klucza: ORM Zanim zaczniesz wymyślać kwadratowe koła na nowa, to może sobie wpisz w googlarkę: SOCI ORM I poczytaj ze zrozumieniem, a możesz się zdziwić... -- wloochacz
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Maciej Sobczak
Date: Thu, 01 Aug 2019 11:41
Date: Thu, 01 Aug 2019 11:41
10 lines
2957 bytes
2957 bytes
> Skąd Wasze opory przed robieniem takich automatów jeśli oszczędzają one > 90% czasu na klepanie SQL-i?!? Stąd, że przy prostych systemach pisanie SQLi prawie w ogóle nie zajmuje czasu, więc nie ma sensu inwestować, żeby tam coś zaoszczędzić; a przy skomplikowanych systemach niczego się nie zaoszczędzi automatyzacją. Co więcej, nawet przy Twoim rozwiązaniu z dziedziczeniem klas możesz napotkać na opór programisty przed wprowadzaniem optymalizacji - wyobraź sobie, że jakiemuś SQLowi bardzo by pomogło jedno dodatkowe słowo (np. hint na użycie konkretnego indeksu, co jest częstym przypadkiem) - w Twoim rozwiązaniu, żeby to jedno słowo dopisać do zapytania, trzeba stworzyć dodatkowy byt w postaci klasy dziedziczącej. Zależnie od polityki zarządzania kodem, to może być konieczność dodania nowego pliku. Dalej być może zmiana skryptu budującego. Itd. Znam przypadek, kiedy to właśnie programista stawiał opór po tym, jak wcześniej sam poprosił admina o zdiagnozowanie słabej wydajności programu i admin po diagnozie zarekomendował drobną zmianę SQLa a na tą drobną zmianę programista nie miał procesu, bo mu framework (akurat w Javie) wszystko "automatyzował". Napisz uczciwie SQLa. Nawet krótkiego. -- Maciej Sobczak * http://www.inspirel.com
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: M.M.
Date: Mon, 02 Sep 2019 12:56
Date: Mon, 02 Sep 2019 12:56
21 lines
3905 bytes
3905 bytes
On Thursday, August 1, 2019 at 1:41:58 PM UTC+2, Maciej Sobczak wrote: > > Skąd Wasze opory przed robieniem takich automatów jeśli oszczędzają one > > 90% czasu na klepanie SQL-i?!? > > Stąd, że przy prostych systemach pisanie SQLi prawie w ogóle nie zajmuje czasu, więc nie ma sensu inwestować, żeby tam coś zaoszczędzić; a przy skomplikowanych systemach niczego się nie zaoszczędzi automatyzacją. > Co więcej, nawet przy Twoim rozwiązaniu z dziedziczeniem klas możesz napotkać na opór programisty przed wprowadzaniem optymalizacji - wyobraź sobie, że jakiemuś SQLowi bardzo by pomogło jedno dodatkowe słowo (np. hint na użycie konkretnego indeksu, co jest częstym przypadkiem) - w Twoim rozwiązaniu, żeby to jedno słowo dopisać do zapytania, trzeba stworzyć dodatkowy byt w postaci klasy dziedziczącej. Zależnie od polityki zarządzania kodem, to może być konieczność dodania nowego pliku. Dalej być może zmiana skryptu budującego. Itd. Znam przypadek, kiedy to właśnie programista stawiał opór po tym, jak wcześniej sam poprosił admina o zdiagnozowanie słabej wydajności programu i admin po diagnozie zarekomendował drobną zmianę SQLa a na tą drobną zmianę programista nie miał procesu, bo mu framework (akurat w Javie) wszystko "automatyzował". > > Napisz uczciwie SQLa. Nawet krótkiego. > > -- > Maciej Sobczak * http://www.inspirel.com Pracowałem zarówno na sqlu osadzanym bezpośrednio w kodzie (z różnym zestawem funkcji wspomagających, rzecz jasna, nie chodzi o to aby łączyć się z bazą po soketach), jak i na różnych maperach i warstwach pośrednich. Nie wyrobiłem sobie zdania że jedno z tych rozwiązań jest wyraźnie lepsze lub gorsze. Na pewno w przypadku gdy pracowałem blisko sqla w kodzie, to łatwiej mogłem dopisać funkcje które z punktu widzenia projektu były przydatne, a jakiś framework/biblioteka niekoniecznie je oferował. Pozdrawiam
Re: Serializacja obiektów w bazie danych - jakie podejście jest zalecane?
Author: Szyk Cech
Date: Mon, 02 Sep 2019 15:46
Date: Mon, 02 Sep 2019 15:46
1 lines
1498 bytes
1498 bytes
Dzięki za opinię.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads